Quine… ama biri değişti


15

Ondalık olarak yazdırılabilir ASCII karakter kodlarına atıfta bulunarak, 32 ile 126 arasında 32 karaktere (boşluk) sahip yazdırılabilir karakterlere sahip olduğumuzu biliyoruz. Zorluğunuz, 32 ile 125 arasındaki karakterleri (126 hariç) kullanarak, kaynak koddaki her karakterin birer birer artırılması dışında kendi kaynak kodunu yazdıran bir program yazmaktır.

Örneğin, kaynak kodu

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

çıktısı

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

Aşağıdakiler yasaktır:

  • Harici dosyaları veya depolamayı okuma / yazma / kullanma (internet dahil)
  • Kendi kaynak kodunuzu okuma / yankılama
  • 2'den az karakter içeren kaynak kodları (eğlenceli değildir). 2'den büyük veya ona eşit olmalıdır.

En az iki hafta bekledikten sonra, herhangi bir dilde, en yüksek upvotes ile cevabın daha küçük karakter sayısının kravat kırıcı olmasıyla kazandığı bir popülerlik yarışması yapmak.


Neden 126'ya izin vermiyorsunuz, ancak 32'ye gitmesi gerekiyor? (Neden / kimsenin bunu nasıl yapacağını bilmiyorum.)
Justin

Bu tür sorular ayrıca hata mesajlarının "çıktı" olarak değerlendirilmesini de yasaklamalıdır (üzgünüm @GariBN). "Çıktı", çalıştırılabilir dil tarafından belirlenen keyfi yan etkiler değil, kodunuz tarafından standart çıktı üzerine kasıtlı olarak yazdırılan şeylerdir.
l0b0

3
Kullanılamaması ~GolfScript için gerçekten berbat. Bahis bunu bilerek yaptın. :-)
Ilmari Karonen

1
"kendi kaynak kodunuzu okuma" yı tanımlayın. Bir işlevi dizgi haline getirmemize izin var mı yoksa bunun yerine bir dizeyi değerlendirmeliyiz?
John Dvorak

1
Bu sorun popülerlik yarışması kadar uygun görünmüyor.
l4m2

Yanıtlar:


46

Python (27 karakter)

Python kabuğunda, aşağıdaki komut dosyası istenen sonucu verir:

TzoubyFssps;!jowbmje!tzouby

Evet! çıktılar:

SyntaxError: invalid syntax

6
Ah adamım, bunun geldiğini görmedim. :-D
Sabit Nokta

9
Aslında sonuç yanlış şekilde kaydırılıyor: P
Erbureth, Reinstate Monica'nın

@Erbureth Buradaki diğer yanıtlar için de geçerlidir ... =)
Gari BN

Akıllı hareket, en kısa olmasa da. xD
cjfaure

2
Trollololololol'u arıyorum.
PyRulez

14

ha? , 5 karakter

Ntbg 

5. karakterin bir boşluk olduğunu unutmayınNtbg . Bu, önceki cevaplarımdan biriyle aynı hile . Ntbggeçersiz bir yoldur, dolayısıyla yorumlayıcı çıkacaktır. Ouch!Bunu şu şekilde çalıştırmalısınız:

huh.exe Ntbg 

"Huh?" şimdi. Ters Quine:! HcuO Quine: Ah!
MilkyWay90

8

PHP (351)

Eminim bunu yapmak için daha iyi bir yol var, çünkü ben codegolfing için yeni, ama benim PHP çözüm:

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

Çıktı:

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

TI-83/84 hesap makineniz için!

DQQ9RXMS@W

Çıktılar:

ERR:SYNTAX

6

GolfScript, 15 karakter

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

Çıktı:

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

Çevrimiçi deneyin.

"Dönen kine" zorluğuna girmem için kullandığım tekniğe dayanan oldukça basit bir çözüm . ~Zor bir ayrıntı, karakter (ASCII 126) meydan okuma kuralları tarafından izin verilmiyor, bu yüzden kod bloğumu yürütmek için kullanamazsınız. Neyse ki, 1*eşanlamlı olarak kullanılabilir.

Açıklama:

Kod bloğu {`{)}%"/2+"}, tarafından kopyalanır .ve ikinci kopya 1*(teknik olarak bir tek yineleme döngüsü) tarafından yürütülür ve diğer kopya yığın üzerinde kalır. Kod bloğunun içinde, kod bloğunu `dizgi yapar {)}%ve karakterlerinin üzerinden (ASCII kodlarını) geçirerek her birini birer birer artırır. Son olarak, "/2+"değişmez dizgiyi /2+( .1*biri tarafından kaydırılır) yığının üzerine iter . Programın sonunda, GolfScript yorumlayıcısı yığındaki her şeyi otomatik olarak yazdırır.

Ps. Evet, bunun katı golfünden ziyade bir olduğunu biliyorum , ancak GolfScript - ASCII art ile başka ne yapacağım? ;-)


3

JavaScript, 117 karakter

Kod golf değil biliyorum ama yine de golf.

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

(Kendi kaynak kodumu okumuyorum; sadece Functionnesnenin toStringişlevini kullanıyorum.)


2

Java - 1331 bayt, 618 bayt ve 504 bayt

İşte Java'da. Harika olan şey, oldukça okunaklı ve esnek olmasıdır. SHIFTDeğişkeni 0 olarak değiştirmeyi deneyebilirsiniz ve bu bir quine olacaktır. Negatif değerler de dahil olmak üzere, istediğiniz herhangi bir değere değiştirebilirsiniz; kod buna göre değişir.

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

Bununla birlikte, önceki sınıftaki tek dezavantaj, soru spesifikasyonunda izin verilmeyen satır sonlarıdır (32 ila 125 aralığının dışındadır). Bu yüzden burada satır sonları (ve onları işlemek için tuhaflar ücretsiz) olan golflü bir sürüm vermek. SVardiyayı değiştirmek için değişkenin değerini düzenleyebilirsiniz . Bu 618 bayt içerir:

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

Şüphesiz, ofsetin ince ayarını düşürürsek ve vardiya değerini sabit kodlarsak, 504 bayt ile tamamen golf edilmiş bir versiyon yapabiliriz:

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 satır beslemelerini içerir

Kullanmasına izin verilmemesi ~ biraz daha zor oldu.

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

Çıktı:

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

Bu 75 karaktere kısaltılabilir , ancak çıktıdan sonra yeni bir satır karakteri yazdırarak teknik olarak kuralları ihlal eder:

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

1
Neden \x09sonuna kadar bir sekme ( ) koymuyorsunuz, çünkü biri tarafından kaydırılan bir sekme yeni bir satır ( \x0A). Daha sonra kısaltılmış versiyonunuz 76 bayt ile çalışır.
mbomb007


0

Lua - 192

Oldukça açık,

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

Gerekli değişikliklerle sadece klasik C quine

PS, görünüşe sprintf(f,...,f,...)göre bir segfault.


0

JavaScript (276)

Kullanmadan .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

Lanet olsun, bu konuda bir yorumcu kullanamıyorum.

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

Ruby, .succbunu bir karakter üzerinde yapan yerel bir yönteme sahiptir ve yeni satır olmadan yazdırmak, yazdırmaktan daha kısadır, bu nedenle bu oldukça düzgün çalışır.


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

Klasik kinin başka bir değişiklik c.


0

> <>, 16 bayt

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

Burada deneyin!

Bu, az ya da çok, sadece <<> içindeki standart bir alıntıdır ( gtalimatı kullanmadan). Tek fark, kendi kaynak kodunu okumaması ve her karakteri çıkmadan önce 1 arttırmasıdır.

çıktılar

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

*> <> , 15 bayt (rakip olmayan)

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

Burada deneyin!



0

Tcl , 89 bayt

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

Çevrimiçi deneyin!


Tcl , 89 bayt

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

Çevrimiçi deneyin!


İki yaklaşım; aynı bayt uzunluğu!




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.