Quine ... tapi digeser satu


15

Mengacu pada kode karakter ASCII yang dapat dicetak dalam desimal, kita tahu bahwa dari 32 hingga 126 kita memiliki karakter yang dapat dicetak dengan 32 berada (spasi). Tantangan Anda adalah menulis sebuah program yang hanya menggunakan karakter dari 32 menjadi 125 (tidak termasuk 126) yang ketika dijalankan, mencetak kode sumbernya sendiri kecuali setiap karakter dalam kode sumber memiliki kode ASCII yang bertambah satu.

Misalnya, jika kode sumbernya

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

hasilnya akan

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

Berikut ini dilarang:

  • Membaca / menulis / menggunakan file atau penyimpanan eksternal apa pun (termasuk internet)
  • Membaca / menggemakan kode sumber Anda sendiri
  • Kode sumber dengan kurang dari 2 karakter (tidak menyenangkan). Harus lebih besar atau sama dengan 2.

Menjadikannya kontes popularitas di mana setelah menunggu setidaknya dua minggu, jawabannya, dalam bahasa apa pun, dengan upvotes tertinggi menang dengan jumlah karakter yang lebih kecil sebagai tie-breaker.


Mengapa tidak mengizinkan 126, tetapi harus ke 32? (Saya tidak tahu mengapa / bagaimana orang melakukan ini.)
Justin

Pertanyaan-pertanyaan semacam ini juga harus melarang pesan kesalahan dianggap sebagai "keluaran" (maaf @GariBN). "Output" adalah hal-hal yang sengaja dicetak pada output standar oleh kode Anda, bukan efek samping sewenang-wenang yang ditentukan oleh bahasa yang dapat dieksekusi.
l0b0

3
Ketidakmampuan untuk menggunakan ~benar-benar menyebalkan untuk GolfScript. Taruhan Anda sengaja melakukannya. :-)
Ilmari Karonen

1
mendefinisikan "membaca kode sumber Anda sendiri". Apakah kita diizinkan untuk merender suatu fungsi, atau sebaliknya kita harus mengevaluasi suatu string?
John Dvorak

1
Masalah ini tampaknya tidak cocok sebagai kontes popularitas.
l4m2

Jawaban:


46

Python (27 karakter)

Di shell Python, skrip berikut akan menampilkan hasil yang diinginkan:

TzoubyFssps;!jowbmje!tzouby

Iya! itu output:

SyntaxError: invalid syntax

6
Oh man, tidak melihat ini datang. :-D
Titik Tetap

9
Sebenarnya hasilnya digeser dengan cara yang salah: P
Erbureth mengatakan Reinstate Monica

@Erbureth Ini relevan juga untuk banyak jawaban lain di sini ... =)
Gari BN

Langkah yang cerdas, meskipun itu bukan yang terpendek. xD
cjfaure

2
Saya memanggil Trollololololol.
PyRulez

14

Hah? , 5 karakter

Ntbg 

Perhatikan bahwa karakter ke-5 adalah spasi setelahnyaNtbg . Ini adalah trik yang sama dengan jawaban saya sebelumnya . Ntbgadalah jalur yang tidak valid, sehingga penerjemah akan menampilkan Ouch!Anda harus menjalankannya seperti ini:

huh.exe Ntbg 

Saya bisa membayangkan banyak quines dengan "Hah?" sekarang. Quine Terbalik:! HcuO Quine: Aduh!
MilkyWay90

8

PHP (351)

Saya yakin ada cara yang lebih baik untuk melakukan ini, karena saya baru mengenal codegolfing, tapi inilah solusi PHP saya:

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;}

Keluaran:

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-BASIC, 10

Untuk kalkulator TI-83/84 Anda!

DQQ9RXMS@W

Output:

ERR:SYNTAX

6

GolfScript, 15 karakter

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

Keluaran:

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

Cobalah online.

Solusi yang cukup mudah berdasarkan teknik yang saya gunakan untuk masuk ke tantangan "rotating quine" . Satu detail yang rumit adalah bahwa karakter ~(ASCII 126) tidak diizinkan oleh aturan tantangan, jadi saya tidak dapat menggunakannya untuk menjalankan blok kode saya. Untungnya, 1*bisa digunakan sebagai sinonim dari itu.

Penjelasan:

Blok kode {`{)}%"/2+"}digandakan oleh ., dan salinan kedua dieksekusi oleh 1*(secara teknis, loop satu-iterasi), meninggalkan salinan lain di tumpukan. Di dalam blok kode, `meringkas blok kode, dan {)}%menggulung (kode ASCII) karakternya, masing-masing bertambah satu per satu. Akhirnya, "/2+"dorong string literal /2+(yaitu.1* digeser satu) ke stack. Pada akhir program, penerjemah GolfScript kemudian secara otomatis mencetak semua yang ada di tumpukan.

Ps. Ya, saya tahu ini adalah daripada ketat , tapi apa lagi yang akan saya lakukan dengan GolfScript - seni ASCII? ;-)


3

JavaScript, 117 karakter

Saya tahu ini bukan kode golf, tetapi saya tetap golf.

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

(Saya tidak membaca kode sumber saya sendiri; aku hanya menggunakan Functionobjek toStringfungsi.)


2

Java - 1331 byte, 618 byte, dan 504 byte

Ini dia di java. Yang keren adalah itu cukup mudah dibaca dan fleksibel. Anda dapat mencoba mengubah SHIFTvariabel menjadi 0 dan itu akan menjadi quine. Anda dapat mengubahnya ke nilai apa pun yang Anda inginkan, termasuk nilai negatif dan itu akan mengubah kode sesuai.

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 = @";
}

Namun, satu-satunya kelemahan di kelas sebelumnya adalah jeda baris, yang tidak diizinkan dalam spec pertanyaan (berada di luar kisaran 32 hingga 125). Jadi saya berikan di sini versi golf yang bebas dari jeda baris (dan bebas dari kebiasaan untuk menangani mereka). Anda dapat mengedit nilai Svariabel untuk mengubah shift. Ini memiliki 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=@";}

Tentunya, jika kita menjatuhkan penyesuaian offset dan hardcode nilai pergeseran, kita dapat melakukan versi yang sepenuhnya golf dengan 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 karakter termasuk umpan baris

Tidak diizinkan menggunakan ~ membuatnya sedikit lebih rumit.

#!/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

Python, 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

Keluaran:

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

Ini dapat disingkat menjadi 75 karakter , tetapi akan mencetak karakter baris baru setelah output, secara teknis melanggar aturan:

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

1
Mengapa Anda tidak meletakkan tab saja ( \x09) di bagian akhir, karena tab yang digeser oleh yang lain adalah baris baru ( \x0A). Kemudian versi singkat Anda akan bekerja dengan 76 byte.
mbomb007


0

Lua - 192

Cukup mudah,

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);}

Hanya Cine klasik dengan modifikasi yang diperlukan

PS, rupanya sprintf(f,...,f,...)adalah segfault.


0

JavaScript (276)

Tanpa menggunakan .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

Sial, tidak bisa menggunakan heredoc yang satu ini.

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

Ruby memiliki metode asli .succyang melakukan ini pada karakter, dan mencetak tanpa baris baru lebih pendek daripada mencetak dengan, jadi ini bekerja dengan cukup rapi.


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);}

Modifikasi lain dari quine klasik dalam ...


0

> <>, 16 byte

" r:2+l?!;1+o50.

Coba di sini!

Ini kurang lebih hanya standar quine di> <> (tanpa menggunakan ginstruksi). Satu-satunya perbedaan adalah ia tidak membaca source-code-nya sendiri dan menambah 1 karakter sebelum mengeluarkannya.

Keluaran

#!s;3,m@"<2,p61/

*> <> , 15 byte (tidak bersaing)

" r:2+Ol?!;1+ou

Coba di sini!



0

Tcl , 89 byte

puts [join [lmap c [split [read [open $argv0]] ""] {format %c [expr [scan $c %c]+1]}] ""]

Cobalah online!


Tcl , 89 byte

puts [join [lmap c [split [read [open $argv0]] ""] {scan $c %c s;format %c [incr s]}] ""]

Cobalah online!


Dua pendekatan; panjang byte yang sama!




Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.