Quine nhưng được thay đổi bởi một


15

Đề cập đến mã ký tự ASCII có thể in ở dạng thập phân, chúng ta biết rằng từ 32 đến 126, chúng ta có các ký tự có thể in được với 32 là (khoảng trắng). Thử thách của bạn là viết một chương trình chỉ sử dụng các ký tự từ 32 đến 125 (không bao gồm 126) mà khi được thực thi, sẽ in mã nguồn riêng của mình ngoại trừ mỗi ký tự trong mã nguồn có mã ASCII tăng thêm một.

Ví dụ: nếu mã nguồn là

main(){printf("Hello World");}

đầu ra của nó sẽ là

nbjo)*|qsjoug)#Ifmmp!Xpsme#*<~

Những điều sau đây bị cấm:

  • Đọc / ghi / sử dụng bất kỳ tệp hoặc lưu trữ bên ngoài (bao gồm cả internet)
  • Đọc / lặp lại mã nguồn của riêng bạn
  • Mã nguồn có ít hơn 2 ký tự (chúng không có gì thú vị). Phải lớn hơn hoặc bằng 2.

Làm cho nó trở thành một cuộc thi phổ biến trong đó sau khi chờ đợi ít nhất hai tuần, câu trả lời, bằng bất kỳ ngôn ngữ nào, với số lần nâng cao nhất sẽ giành chiến thắng với số lượng nhân vật nhỏ hơn là người phá vỡ.


Tại sao không cho phép 126, nhưng nó phải đến 32? (Tôi không biết tại sao / làm thế nào bất cứ ai sẽ làm điều này.)
Justin

Những loại câu hỏi này cũng sẽ cấm các thông báo lỗi được coi là "đầu ra" (xin lỗi @GariBN). "Đầu ra" là nội dung được in có chủ ý trên đầu ra tiêu chuẩn theo mã của bạn, không phải là tác dụng phụ tùy ý được xác định bởi ngôn ngữ thực thi.
l0b0

3
Không có khả năng sử dụng ~thực sự tệ cho GolfScript. Đặt cược bạn đã làm điều đó trên mục đích. :-)
Ilmari Karonen

1
định nghĩa "đọc mã nguồn của riêng bạn". Chúng ta có được phép xâu chuỗi một hàm hay thay vào đó chúng ta phải loại bỏ một chuỗi?
John Dvorak

1
Vấn đề này dường như không phù hợp như một cuộc thi phổ biến.
l4m2

Câu trả lời:


46

Con trăn (27 ký tự)

Trong trình bao Python, tập lệnh sau sẽ cho kết quả mong muốn:

TzoubyFssps;!jowbmje!tzouby

Đúng! nó xuất ra:

SyntaxError: invalid syntax

6
Ôi trời, không thấy điều này sẽ đến. :-D
Điểm cố định

9
Trên thực tế, kết quả đã thay đổi sai cách: P
Erbureth nói Phục hồi lại

@Erbureth Điều này cũng phù hợp với nhiều câu trả lời khác ở đây ... =)
Gari BN

Di chuyển thông minh, mặc dù nó không phải là ngắn nhất. xD
cjfaure

2
Tôi đang gọi Trollololololol.
PyRulez

14

Huh? , 5 ký tự

Ntbg 

Lưu ý rằng ký tự thứ 5 là khoảng trắng sauNtbg . Đây là mẹo tương tự như trong một trong những câu trả lời trước đây của tôi . Ntbglà một đường dẫn không hợp lệ, vì vậy trình thông dịch sẽ xuất ra Ouch!Bạn nên chạy nó như thế này:

huh.exe Ntbg 

Tôi có thể tưởng tượng nhiều quines với "Huh?" hiện nay. Quine đảo ngược :! HcuO Quine: Ouch!
MilkyWay90

8

PHP (351)

Tôi chắc chắn có một cách tốt hơn để làm điều này, vì tôi chưa quen với việc mã hóa, nhưng đây là giải pháp PHP của tôi:

function q(){$q=chr(39);$a=array('function q(){$q=chr(39);$a=array(',');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}

Đầu ra:

gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(-(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~

6

TI-CƠ BẢN, 10

Đối với máy tính TI-83/84 của bạn!

DQQ9RXMS@W

Đầu ra:

ERR:SYNTAX

6

GolfScript, 15 ký tự

{`{)}%"/2+"}.1*

Đầu ra:

|a|*~&#03,#~/2+

Hãy thử trực tuyến.

Một giải pháp khá đơn giản dựa trên kỹ thuật tôi đã sử dụng để tham gia thử thách "xoay vòng" . Một chi tiết khó hiểu là nhân vật ~(ASCII 126) không được phép bởi các quy tắc thử thách, vì vậy tôi không thể sử dụng nó để thực thi khối mã của mình. May mắn thay, 1*có thể được sử dụng như một từ đồng nghĩa của nó.

Giải trình:

Khối mã {`{)}%"/2+"}được sao chép bởi .và bản sao thứ hai được thực thi bởi 1*(về mặt kỹ thuật, một vòng lặp một lần), để lại bản sao khác trên ngăn xếp. Bên trong khối mã, `xâu chuỗi khối mã và {)}%lặp lại (mã ASCII của) các ký tự của nó, tăng từng ký tự một. Cuối cùng, "/2+"đẩy chuỗi ký tự /2+(được .1*dịch chuyển bởi một) lên ngăn xếp. Vào cuối chương trình, trình thông dịch GolfScript sau đó tự động in mọi thứ trên ngăn xếp.

Thi thiên Vâng, tôi biết đây là một chứ không phải là nghiêm ngặt , nhưng tôi sẽ làm gì khác với nghệ thuật GolfScript - ASCII? ;-)


3

JavaScript, 117 ký tự

Tôi biết đó không phải là mã golf nhưng dù sao tôi cũng chơi golf.

function f(){alert((f+';f()').split('').map(function(x){return String.fromCharCode(x.charCodeAt()+1)}).join(''))};f()

(Tôi không đọc mã nguồn của riêng mình; Tôi chỉ đơn giản là sử dụng chức năng Functioncủa đối tượng toString.)


2

Java - 1331 byte, 618 byte và 504 byte

Đây là java. Điều thú vị là nó khá dễ đọc và linh hoạt. Bạn có thể thử nghiệm để thay đổi SHIFTbiến thành 0 và nó sẽ là một quine. Bạn có thể thay đổi nó thành bất kỳ giá trị nào bạn muốn, bao gồm các giá trị âm và nó sẽ thay đổi mã cho phù hợp.

public class Quinex {

    private static final int SHIFT = 1;

    private static String next(String now, boolean mangles) {
        String sb = "";
        for (char c : now.toCharArray()) {
            if (!mangles && c == 87) {
                sb += next(String.valueOf(SHIFT), true);
            } else {
                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);
            }
        }
        return sb;
    }

    public static void main(String... args) {
        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));
    }

    private static final String TEXT = "public class Quinex {^^    private static final int SHIFT = W;^^    private static String next(String now, boolean mangles) {^        String sb = @@;^        for (char c : now.toCharArray()) {^            if (!mangles && c == 87) {^                sb += next(String.valueOf(SHIFT), true);^            } else {^                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);^            }^        }^        return sb;^    }^^    public static void main(String... args) {^        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));^    }^^    private static final String TEXT = @";
}

Tuy nhiên, nhược điểm duy nhất trong lớp trước là ngắt dòng, không được cho phép trong thông số câu hỏi (nằm ngoài phạm vi 32 đến 125). Vì vậy, tôi đưa ra ở đây một phiên bản chơi golf không có ngắt dòng (và không có các quirks để xử lý chúng). Bạn có thể chỉnh sửa giá trị của Sbiến để thay đổi ca. Cái này có 618 byte:

class Q{static String g(String p,int m){int S=1;String u="";for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){int S=W;String u=@@;for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

Chắc chắn, nếu chúng ta bỏ sự điều chỉnh tốt của phần bù và mã hóa cứng giá trị của ca, chúng ta có thể thực hiện một phiên bản hoàn toàn được đánh gôn với 504 byte:

class Q{static String g(String p,int m){String u="";for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){String u=@@;for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

1

Perl 5, 284 ký tự bao gồm các nguồn cấp

Không được phép sử dụng ~ làm cho nó khó khăn hơn một chút.

#!/usr/bin/perl
$_=<<X;
#!/usr/bin/perl
Y
\$a=\$_;
s/\\\\/\\\\\\\\/g;
s/\\\$/\\\\\\\$/g;
\$b=\$_;
\$_=\$a;
s/Y/\\\$\\_\\=\\<\\<X\\;\\n\${b}X/;
s/(.)/chr(ord(\$1)+1)/ge;
print;
X
$a=$_;
s/\\/\\\\/g;
s/\$/\\\$/g;
$b=$_;
$_=$a;
s/Y/\$\_\=\<\<X\;\n${b}X/;
s/(.)/chr(ord($1)+1)/ge;
print;

1

Con trăn, 99

s='import sys;sys.stdout.write("".join(chr(ord(c)+1)for c in a%(s,a)))';a='s=%r;a=%r;exec s';exec s

Đầu ra:

t>(jnqpsu!tzt<tzt/tuepvu/xsjuf)##/kpjo)dis)pse)d*,2*gps!d!jo!b&)t-b***(<b>(t>&s<b>&s<fyfd!t(<fyfd!t

Điều này có thể được rút ngắn xuống còn 75 ký tự , nhưng nó sẽ in một ký tự dòng mới sau đầu ra, về mặt kỹ thuật phá vỡ các quy tắc:

s='print"".join(chr(ord(c)+1)for c in a%(s,a))';a='s=%r;a=%r;exec s';exec s

1
Tại sao bạn không đặt một tab ( \x09) ở cuối, vì một tab được dịch chuyển bởi một tab là một dòng mới ( \x0A). Sau đó, phiên bản rút gọn của bạn sẽ hoạt động với 76 byte.
mbomb007


0

Lua - 192

Khá đơn giản,

s=[[print((('s=['..'['..s..']'..']'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))]]print((('s=['..'['..s..']'..'];'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))

0

C - 156

char*f="char*f=%c%s%c,q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}",q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}

Chỉ cần quine C cổ điển với các sửa đổi cần thiết

PS, rõ ràng sprintf(f,...,f,...)là một segfault.


0

JavaScript (276)

Không sử dụng .toString():

function q(){x=String.fromCharCode;y=x(39);a=['function q(){x=String.fromCharCode;y=x(39);a=[','];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}'];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}

0

Ruby, 63

Chết tiệt, không thể sử dụng một di sản trên cái này.

s="s=%p;(s%%s).chars{|c|$><<c.succ}";(s%s).chars{|c|$><<c.succ}

Ruby có một phương thức riêng .succthực hiện điều này trên một ký tự và in mà không có dòng mới ngắn hơn in với, vì vậy cách này hoạt động khá gọn gàng.


0

C, 153

main(a){char b[999];sprintf(b,a="main(a){char b[999];printf(a=%c%s%c,34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}",34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}

Một sửa đổi khác của quine cổ điển trong ...






Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.