Markov Zincir Quine


17

Bu soruda basit bir Markov Modeli kullanılacaktır. Markov Zincirleri hakkında daha fazla bilgi için bkz. Http://setosa.io/ev/markov-chains/ .

Bir ip alın. Bu örnek için şu sözcüğü kullanacağız:

reader

Şimdi, her karakter için, karakter dizisindeki her oluşumdan sonra görünen karakterleri alın. ( ​`^`​dizenin başlangıcını ve ​`$`​sonunu temsil eder)

`^` -> {'r'}       # After the start of the string, there is an `r`.
'r' -> {'e', `$`}  # After the first `r` (*r*eader), there is an `e`
                   # after the second (reade*r*), there is the end of the string.
'e' -> {'a', 'r'}
'a' -> {'d'}
'd' -> {'e'}

Şimdi, dizenin başından başlayarak, sonraki setteki karakterlerden birinden rastgele seçin. Bu karakteri ekleyin ve bir sonraki kümesindeki karakterlerden seçim yapın ve sonuna kadar devam edin. İşte bazı örnek kelimeler:

r
rereader
rer
readereader

Bir karakter başka bir karakterin ardında birden çok kez görünüyorsa, seçilme olasılığı daha yüksektir. Örneğin cocoa can, a'dan sonra c, bir ove üçte bir elde etme şansının üçte ikisi vardır a.

'c' -> {'o', 'o', 'a'}

Meydan okuma

Hiçbir girdi almayan ve yukarıdaki gibi Markov Zinciri kullanılarak oluşturulan rastgele bir dize çıkaran bir program oluşturun, burada zincire girdi programın kaynağıdır.

  1. Program en az iki karakterden oluşmalıdır, ikisi aynı olmalıdır (Yalnızca bir çıktısı olan "sıkıcı" zincirleri önlemek için)
  2. İsterseniz modeli karakter yerine bayt kullanacak şekilde değiştirebilirsiniz, ancak kural 1'de "karakter" i "bayt" olarak değiştirebilirsiniz
  3. Program, teoride beklenen sıklıkta rastgele dizeler çıkarmalıdır

Bu , bu yüzden en kısa program kazanır!


@ mbomb007 tüm bilgiler soruda, ilgileniyorsanız bağlantı sadece ekstra (Bu çok temel bir uygulama)
Artyer

3
Neden ^ve $tırnak işaretleri? alıntılardan çıkarılmasını veya geri tırnak içine koymayı daha açık hale getirebilir.
Yıkılabilir Limon

Yanıtlar:


6

bip , 64 bayt

Bu komikti.

t:V Y\"m:"Yt@0T9=A OyY@>RC(t(Xy).'.)"ST["t:V Y"RPy";Vm"C9]\";Vm<tab>

<tab> değişmez sekme karakterini temsil eder (0x09 ) . Çevrimiçi deneyin!

Nasıl?

TL; DR: kaçan dize sözdizimi, repr ve eval.

Değişmez "karakterler içermesi gereken dizeler için Pip, sınırlayıcı olarak kullanarak dizelerden kaçmıştır\" . Kaçan dizeleri kullanan standart bir quine şöyle görünür:

V Y\""V Y".RPy\"

Yani: Yank (as olarak saklamak y) içeren bir dize "V Y".RPyve Vbunu al. değişmez dizgenin RPyönüne eklediğimiz repr değerini alır . Son olarak, eval sonucunu çıktı.yV Y

Markov quine'nin yapısı benzerdir, ancak kodu çıkarmak yerine kaydetmek ve daha sonra onunla bazı şeyler yapmak istiyoruz. t:V Y\"...\"eval sonucunu atar t. Değerlendirilen kodun içinde, sonunda değerlendireceğimiz bir m:"..."kod dizesi atar.mVm .

ST["t:V Y"RPy";Vm"C9] içeren bir liste oluşturur

"t:V Y"  Literal string
RPy      Repr(y)
";Vm"    Literal string
C9       Tab character

ve varsayılan olarak tüm öğeleri birleştiren bir dizeye dönüştürür. Bu bölüm "V Y".RPyorijinal alıntıdaki ile eşdeğerdir . Büyük eval dizesindeki son ifade olduğundan, değeri Voperatörün döndürdüğü ve dolayısıyla atanan şeydir t.

Böylece, değerlendirmeden ve atamadan sonra, ttam kod eşittir ve miçerir

Yt@0T9=A OyY@>RC(t(Xy).'.)

Şimdi Vmbunu kod olarak değerlendiriyor. Neler olacağını yıkalım.

                            We'll use y to hold the current character in the chain
Yt@0                        Yank first character of t into y (chain always starts there)
         Oy                 Output y without newline each time we...
    T9=A                    Loop till ASCII code of y equals 9 (tab)
                            Since there's only one literal tab, at the end of the program,
                              this satisfies the Markov chain ending requirement
                   Xy       Generate a regex that matches y
                  (  ).'.   Concatenate . to regex: now matches y followed by any character
                (t       )  Find all matches in t (returns a list)
              RC            Random choice from that list
           Y@>              Slice off the first character and yank the remaining one into y

Birkaç not:

  • Kodu değişmez bir sekmeyle sonlandırmak, "sonraki karakter veya dizenin sonu" için normal ifade testi yapmaktan daha kısaydı.
  • Kodda ikiye katlanmış karakterler varsa, kullandığım normal ifade düzgün çalışmıyor; örneğin, bunu uygulamak, xxyyalnızca eşleşmelerde xxdeğil xy, döndürülecekti . Neyse ki, bu kodda iki katına çıkan karakter yok, bu yüzden önemli değil.

8

JavaScript, 217 215 bayt

a="a=q;a=a.replace('q',uneval(a));for(b=c='a';d=a.split(c),c=d[Math.random()*~-d.length+1|0][0];b+=c);alert(b)";a=a.replace('q',uneval(a));for(b=c='a';d=a.split(c),c=d[Math.random()*~-d.length+1|0][0];b+=c);alert(b)

Bunun unevalyalnızca Firefox tarafından desteklenen, kullanıldığını unutmayın . Örnek çalışmalar:

a=ale(a.lend[Ma=d[Macepla.ler(b+=c)b=q;fom(a=q;a=dort(b+1|0],c);a.lit(a)
at(c=c;d[0],c=q;ath+1|0][0];dorerac=ac=d[Ma),c;)*~-d[Ma=alenepl(b+=ac=c;a=c;d[2];d.re(c;fom()
a="a[0],und=d=a)
angt(b),und=d.l(b=a)
a)
ale(a.rth.revanepleplit(b)
ac);fore(b)*~-d.r(b+1|0];fora';a)*~-d.splalith+=dorth+=c=";ath+=a.length+=';ale(b)
a.r(b=c=a)b+1|0],und[0][0];d.splerath.spleneva)";ath.r(ceneplith+=d=aceple(c;)*~-d=';ala';)b='ac;fom(b=c;a.ler(b=d=d[Ma.rt(c=cendor()*~-d='a=";ac;a.spla)b=ceva=';a=d.rt(angt(alength+1|0],c;angt()
al(ac=dorth+1|0][0][0][0][Ma.split()

Gördüğünüz gibi, çoğunlukla anlamsız, ama bu beklenebilir;) OP, bir çıktının sözdizimsel olarak geçerli JS olması olasılığının yaklaşık% 6,3 olduğunu gösteren bir JSFiddle yarattı .


Kendi kendine okuma işlevlerine izin verildiyse, bu 78 bayt ES6 olabilir:

f=(c="f",p=("f="+f).split(c),q=p[Math.random()*~-p.length+1|0][0])=>q?c+f(q):c

Çok, çok nadiren, bu sözdizimsel olarak geçerli JS çıktıları:

f=>e?c+f():c
f=>e?c=>engt():c
f=>e?c=(e):c
f=>e?c=>e=>ength.split():c
f=p=>q?c+f():c
f(q).sp=",p[Mat(q?c=(),plith.lith.sp.sp[0]).lendom().lith+f=>q=p.lendom(",p=p=>q?c+f():c
f(q),q?c=(c=(q)*~-p[0]):c
f().random(),q?c=(c=p[0]):c
f=>q?c=(q="+f"+f).rath.split(c):c
f="+1|0])=().lith.rat()*~-p=>q?c=p[Mat(c=",q?c=p.rath.splendom()*~-plength.splith.lendom(c):c

Oluşturduğu işlev adlarının favorim .splendom()( split+ length+ random)


3
Bu JavaScript üretme olasılığının ne olduğunu merak ediyorum. (Nerd su çulluğu uyarısı)
DanTheMan

2
@DanTheMan Kesinlikle çok, çok düşük. Tüm parantez ve parantezlerin dengeli olma olasılığı inanılmaz derecede düşüktür. Bir kez var olmasına rağmen a.splerength.r(), bu geçerli olabilir;)
ETHproductions

1
Bu unF sadece uneval kullanımı nedeniyle olduğunu not etmek isteyebilirsiniz
Shaun H

1
@ShaunH Teşekkürler, sadece FF'nin düzensizliği desteklediğini unuttum.
ETHproductions

5
İkinci kendinden okuma fonksiyonu (geçerli değil meta.codegolf.stackexchange.com/a/4878/48878 göre, @DanTheMan "Bir quine doğrudan veya dolaylı olarak kendi kaynağına erişmek olmamalıdır") ve jsfiddle.net / kabkfLak / 1 , şans% 6.3 civarında olmalıdır.
Artyer

5

Perl, 103 bayt

Standart soruya ve bu soruya verdiğim cevaba dayanarak :

$_=q{$_="\$_=q{$_};eval";@s='$';{push@s,(@n=/(?<=\Q$s[-1]\E)(.|$)/g)[rand@n];$s[-1]&&redo}print@s};eval

Örnek Çıktı

$_=q{$_=q{$_=";@sh@s=";eval
$_="\$_=q{$_='$_=q{$_}pus=\$_=";@n=";@ndo};{pus=';edo};@n]\Q$_};{$_};@s=q{$_=';@s[rand@s=/g)(@s,(@s,(@sh@s[-1];@ndo};ed@s[-1]\E)(.|$_}prevan]&ral";evan];{$_}pus='$_};ed@sh@sh@s[-1]\$_='$_};evando};eval
$_=q{$_=";ed@s[-1];evand@s="\Q$_=";@s[-1]\Q$_=q{$_=";@nd@sh@sh@s='$_=q{$_=q{$_='$_="\Q$_='$_};{pus=\$_=q{$_}pral
$_=";evando};@nd@sh@s,(@n]\$_=";@s,(@s[-1];{$_=q{$_}pral
$_=";eval
$_='$_=q{$_="\$_="\Q$_=";ed@sh@s=\E)(.|$_=q{$_=q{$_=q{$_=q{$_}pus=/(?<=q{$_};eval
$_=";ed@sh@s[-1]\Q$_=';edo};{$_=q{$_=";@nt@s,(@n]&&&&&&&ral";@nd@s,(@s[-1]\$_}pus=\E)(.|$_=';@nt@s[ral

Diğer soruya benzer şekilde, bazı sonuçlar geçerli Perl üretir:

$_=q{$_};{$_};eval";@sh@s[-1]\$_='$_};evan]\Q$_}preval";eval
$_=q{$_};{$_=q{$_=';@nd@s=q{$_};@s[-1]\E)(@s[-1]\E)(@n=';edo};{$_}predo};eval
$_=q{$_=q{$_};edo};@n=q{$_=q{$_};@s[rin='$_=q{$_}pus=/g)(.|$_=q{$_};edo};eval
$_=q{$_};eval
$_=q{$_=";@ndo};{$_}preval

ancak şansı ~% 2 ile biraz daha düşüktür.


7
Bana ilk örneğin geçerli Perl olduğunu söyleseydin sana inanırım.
ankh-morpork

2
@ Ben ilk başta Yorumunuzu yanlış ve ana kod desem bana inanmazsınız düşünce dohaqatar7 oldu geçerli Perl ...: D zoitz.com/comics/perl_small.png
Dom Hastings

@ ankh-morpork: açıkça geçersiz, q{bir dizgi hazır }bilgisinin başlangıcı ve onu kapatmak için hiçbir şey yok . Perl aslında rastgele bayt dizileri çalıştırmakta oldukça kötüdür (ve normalde erken bir dizgi değişmezi veya yorumu nedeniyle).

4

MS-DOS makine kodu (.COM dosyası), 63 bayt - rakip değil

Bir quine kendi kaynak koduna erişmemesi gerektiğinden rekabet etmiyor.

126 baytlık bir varyant "kendi kaynak koduna erişmeme" gereksinimini karşılar!

63 bayt varyantı şöyle görünür:

FC BE 00 01 AC 50 88 C2 B4 02 CD 21 E8 1A 00 59
4E AC 81 FE 3F 01 7C 03 BE 00 01 38 C1 75 F2 FE
CA 75 EE 81 FE 00 01 75 DB 8A 16 00 80 31 C0 8E
D8 31 C9 AC 00 C2 E2 FB 0E 1F 88 16 00 80 C3

Ayrıca rastgele jeneratörün olasılık dağılımından da emin değilim:

Program, saat sayaçlarının ve kesmelerle değiştirilen diğer bilgilerin rasgele sayılar üretmek için segment 0'da saklandığı gerçeğini kullanır.

Üretilen çıktılara örnekler:

FC BE 00 01 7C 03 BE 00 80 C3

FC BE 00 01 38 C1 75 F2 FE 00 80 31 C9 AC 81 FE 00 80 C3

FC BE 00 01 38 C1 75 EE 81 FE 00 01 38 C1 75 EE 81 FE CA
75 F2 FE 00 01 75 F2 FE 00 80 C3

FC BE 00 C2 B4 02 CD 21 E8 1A 00 01 7C 03 BE 00 59 4E AC
81 FE 3F 01 AC 81 FE 3F 01 7C 03 BE 00 01 7C 03 BE 00 01
AC 81 FE 3F 01 7C 03 BE 00 80 C3

Derleme koduna dönüştürülen program şöyle görünür:

    cld                # Ensure SI is being incremented
    mov si, 0x100      # Move SI to the first byte of the program
nextOutput:
    lodsb              # Load one byte of the program ...
    push ax            # ... save it to the stack ...
    mov dl, al         # ... and output it!
    mov ah, 2
    int 0x21
    call pseudoRandom  # Create a random number (in DL)
    pop cx             # Take the stored byte from the stack
    dec si             # Go back to the last byte loaded
nextSearch:
    lodsb              # Load the next byte
    cmp si, programEnd # If we loaded the last byte ...
    jl notEndOfProgram # ... the next byte to be loaded ...
    mov si, 0x100      # ... is the first byte of the program.
notEndOfProgram:
    cmp cl, al         # If the byte loaded is not equal to ...
                       # ... the last byte written then ...
    jne nextSearch     # ... continue at nextSearch!
    dec dl             # Decrement the random number and ...
    jnz nextSearch     # ... continue at nextSearch until the ...
                       # ... originally random number becomes zero.
    cmp si, 0x100      # If the last byte read was not the last byte ...
    jnz nextOutput     # ... of the program then output the next ...
                       # ... byte!

    # Otherwise fall through to the random number generator
    # whose "RET" instruction will cause the program to stop.        

    # The random number generator:
pseudoRandom:
    mov dl, [0x8000]   # Load the last random number generated
                       # (Note that this is uninitialized when
                       # this function is called the first time)
    xor ax, ax         # We use segment 0 which contains the ...
    mov ax, ds         # ... clock information and other data ...
                       # ... modified by interrupts!
    xor cx, cx         # Prepare for 0x10000 loops so ...
                       # ... all bytes in the segment are processed ...
                       # ... once and the value of SI will be ...
                       # ... unchanged in the end!
randomNext:
    lodsb              # Load one byte
    add dl, al         # Add that byte to the next random number
    loop randomNext    # Iterate over all bytes
    push cs            # Restore the segment
    pop ds
    mov [0x8000], dl   # Remember the random number
    ret                # Exit sub-routine

programEnd:

Yarışmama, meydan okuma kriterlerini karşılayan ancak meydan okumadan daha yeni bir dil veya özellik kullanan cevaplar için ayrılmıştır. Kendi kaynağını okumayan varyantı yayınlayın veya cevabı silin.
mbomb007

4

C, 306 328 585 611 615 623 673 707 bayt

Kaynak kodu:

p[256][256]={0};char*X="p[256][256]={0};char*X=%c%s%c,Y[999],c,j,*a;main(){sprintf(Y,X,34,X,34);for(a=Y;*a;a++)p[*a][*(a+1)]++;for(j=*Y;putchar(c=j);)while(p[c][++j]<<16<rand());}",Y[999],c,j,*a;main(){sprintf(Y,X,34,X,34);for(a=Y;*a;a++)p[*a][*(a+1)]++;for(j=*Y;putchar(c=j);)while(p[c][++j]<<16<rand());}

Okunabilirlik / açıklama için satırsonu ve boşluk eklendi:

01  p[256][256]={0};
02  char*X="p[256][256]={0};char*X=%c%s%c,Y[999],c,j,*a;main(){sprintf(Y,X,34,X,34);for(a=Y;*a;a++)p[*a][*(a+1)]++;for(j=*Y;putchar(c=j);)while(p[c][++j]<<16<rand());}",
03  Y[999],c,j,*a;
04  main(){
05      sprintf(Y,X,34,X,34);
06      for(a=Y;*a;a++)p[*a][*(a+1)]++;
07      for(j=*Y;putchar(c=j);)
08          while(p[c][++j]<<16<rand());
09  }

açıklama

Line 01: p[][]bir karakterin arkasından gelen sayıları tutar.

Line 02: Xile kaçan programın kaynağını içerir %c%s%c.

Line 03: Yprogramın gerçek kaynağını içerir. c, j, *aSayma değişkenlerdir.

Line 05: YAygırı içerecek şekilde ayarlayın .

Line 06: İçindeki harf oluşumlarını say p[][].

Line 07: Geçerli durumu yazdırın.

Line 08: Sıradaki sayımlarla orantılı olarak bir sonraki karakteri rastgele bul p[][] .

Örnek çıktı:

p[++);p[99]=Y;putfor(aind(a++j,*a+j=j,c][c,*an(arile(pr*Y,Y[256]<<1);)][*Y,Y;)wha+++j=*aintfor*Y;prin(a+j]=j][256<1)pr(a;a;f(p[char(Y;for());};a;ma;ma=%s%chain(Y;ar(j][256<<<1)p[256<<raile(cha][9]<rin(j,34,34,Y[256]+j,Y,34,Y,c=Y,*a;*a;for(){0}


1
Bayt sayısını doğrulayabilmemiz için satırsonu ve boşluk içermeyen bir sürüm ekleyebilir misiniz?
Steven H.

1
Evet, tek satırlık sürümü en üste ekledim.

3

Ruby, 152 bayt

0;s="0;s=%p<<33
0until putc($/=Hash[[*(s%%s).chars.each_cons(2)].shuffle][$/])==?"<<33
0until putc($/=Hash[[*(s%s).chars.each_cons(2)].shuffle][$/])==?!

Örnek çıktı:

0;s.c($/=Has(s).ears(2).ch[*(2)=Hacontc(2).ears.eas=Has==Hars%putc($/]).ears%sh_chuffl puns=Hachach[$/==?!

veya

0;s.ch[*($/=%pufl puns($/=%s.shas($/=Harsh_chutilears)])].e]).s)=Hac($/=="<<33\ntile].chufffle][[$/=Hars%sh_c(2)=%p<<<<<33
0;s)].ears)=Hars).c(s).eacon0un0;sh_c($/][*(s.s=Hacons=?!

Üzerinden dize biçimlendirmesi kullanarak sorgular "s%s"ve tüm iki karakter dilimlerini alarak, bunları karıştırıp karma sözlüğüne çevirerek Markov zincirleme yapar, burada yinelenen tuşlar için son görünüm değeri tanımlar. Başlangıç ​​için ekstra mantık eklemekten kaçınmak için, en son çıkış karakterini kullanarak $/yeni bir satıra otomatik olarak başlatılır ve yeni satırların her zaman kodda 0, kodun başlayacağı karakterle takip edildiğinden emin olurum . Sonunda, sadece bir tane !olacak şekilde kaynak kodunu değiştiririm, böylece her zaman patlamadan sonra biteriz, <<33onu değişmez olarak eklemek için kullanırız . Bu, ASCII 33 yerine yazdırılamayan tek haneli bir karakter kullanılarak daha da golf edilebilir, ancak bu çok can sıkıcı görünüyordu.


4
p<<<<<33Süper-süper-süper-concat operatörü? ;-)
ETHproductions

3
Bu "waaaay daha az" operatörü.
mbomb007

2
Bunun yarattığı kelimeleri seviyorum! İlk örnek, nesne Has(s).ears(2)beni kıkırdatırsa çok endişe verici!
Dom Hastings

2

Pas, 564 bayt (rekabetçi değil)

extern crate rand;fn main(){let t=("extern crate rand;fn main(){let t=", ";let mut s=format!(\"{}{:?}{}\",t.0,t,t.1).into_bytes();s.push(0);let mut r=rand::thread_rng();let mut c=s[0];while c!=0{print!(\"{}\",c as char);let u=s.windows(2);c=rand::sample(&mut r,u.filter(|x|x[0]==c),1)[0][1];}}");let mut s=format!("{}{:?}{}",t.0,t,t.1).into_bytes();s.push(0);let mut r=rand::thread_rng();let mut c=s[0];while c!=0{print!("{}",c as char);let u=s.windows(2);c=rand::sample(&mut r,u.filter(|x|x[0]==c),1)[0][1];}}

Zaten başka bir soru için oldukça temiz bir Rust quine yazdığım için, bunun için yeterince basit göründüğüm için bunu uyarlayacağımı düşündüm. Orijinal küçük olsa da, bunun için boyutu en aza indirmek için çok az girişimde bulundum. Neler olduğunu açıklamak için genişletilmiş bir sürüm:

// Random numbers are removed from the standard library in Rust,
// I had to make a cargo project to even compile this...
// Rust is hardly a golfing language.
extern crate rand;

fn main(){

    // The quine is fairly simple, we just make a tuple with 
    // "everything before this tuple" as first element, and
    // "everything after this tuple" with any quotes escaped 
    // as second. That makes it really easy to print.
    let t=("[...before...]", "[...after...]");

    // Instead of printing it, we save it as a byte vector
    // and append 0
    let mut s=format!("{}{:?}{}",t.0,t,t.1).into_bytes();
    s.push(0);

    // Start with the first character
    let mut c=s[0];
    let mut r=rand::thread_rng();

    while c!=0 {
        print!("{}",c as char);

        // We slide a 2 wide window over it to save a vector
        // of all bigrams. 
        let u=s.windows(2);

        // Filter it to only those which have the current character 
        // as first. Take one at random, its second is our next 
        // character.
        c=rand::sample(&mut r, u.filter(|x|x[0]==c), 1)[0][1];

        // Keep at it until the 0 byte is generated.
    }
}

Örnek çıktı 1:

eran(),0{ller=samarin chas c).pr,teteran mut madoletet manthilaplerng().wind_byt.wit();let.u.0][*s=[*s.plleas.wshit, rnd:Vec<_byte mputextet ut t leat=r,t rant!=r().filllet rng();lar("{}{let.ind_byt.what amusarando_ramut!=st ct!(\").0]=colet!(&lec<_ret.plec=s.whrararandormpr=saile ret=r,0]=r);le(\"),t und;fint.prilt!();ler(2).forap(&ler=s(),t ut rat mu:t=ramund:Ve s.putec==[0];wst and_byt sh(\"et c s[1), munwhras[0];c=s=s="etornws(2)[0, ain(|x|x[0,0,0];fowile c ct(&l=",tes().co_byt().wrmat ash(|x|x[*s.lethrant.wrarmu.file(\"et, r==[1);uterile().0,t ando_rinwhas=[0{}"ect.wilant!("{ple mut, mut mamprmant,0];le(&lec=s.1),t co_>=fin mamustec!(\",c=[0];}}",0];leteteat.ust(",ternwhashrarmut ler("erat,0]==file and_reter==s.utet an letet.ut=", ras.1);fin("{:?}"et t letes[*sado_bytet rnd::Verain s[0];whant(){}{}\"echin s(2);lerad;wst reth(\",t u.iletermat c 1];}{}

Örnek çıktı 2:

et!().0][0][0{}

2

Python 2, 211 bayt

Sonucu olarak çıktılar stderr.

import random;X='q=[(list(t)+["$$"])[i+1]for i in range(len(t))if t[i]==c];c=random.choice(q)\nif c=="$$":exit(o)\no+=c\nexec X';s='import random;X=%r;s=%r;q=t=s%%(s,X);o=c="i";exec X';q=t=s%(s,X);o=c="i";exec X

Çevrimiçi deneyin

Örnek çıktı:

i+[(s,X)));exenit(or;q=rt(t(t(t);o='ic\n(q)+1]=c\ndor randort))\ngeno));X)\nge(st))ic]=";oic=%ran(s%%(s%rt(q)\ngexe(s=st(t[(s=[if X=%(ompoiforanom;e(t X="$"$"ic="$"i";X=c rt X

Kısa açıklama:

  • Bu program s='s=%r;print s%%s';print s%squine biçimini kullanır . sTüm programı içerecek bir dize oluşturun .
  • Dize X, yinelemeli olarak yürütülecek yordamı içerir.
  • Yordam çıktı dizesini oluşturur o yazdırılacakstderr , Markov zincirinin sonuna ulaşıldığında .
  • Zincirin sonu $$, programın tüm dizeler için çalışması için iki karakter kullanılarak dize ile temsil edilir . Programımda olmayan bir karakteri kullanabilirdimchr(0) , ama bence bu daha uzun.
  • Her yürütme seçilen karakter yerleştirilir cile birlikte olan (o ) programın ilk karakterine ilklendirilir.
  • cDizedeki her seçim oluşumunu izleyen karakterlerin listesi ( tkaynak kodun satırını tutan değişken), qsonraki seçim için seçilecektir c.

1

PHP, 144 135 130 120 272 220 212 bayt

<?$e='$p=$n="";foreach(str_split($s)as$w)$p=$m[$p][]=$w;do echo$n=$m[$n][array_rand($m[$n])];while("\n"!=$n);
';$s='<?$e=%c%s%1$c;$s=%1$c%s%1$c;$s=sprintf($s,39,$e,$s);eval($e);';$s=sprintf($s,39,$e,$s);eval($e);

Veya okunabilirlik için biçimlendirilmiş:

<?$e='$p = $n = "";
foreach (str_split($s) as $w) {
    $p = $m[$p][] = $w;
}
do {
    echo $n = $m[$n][array_rand($m[$n])];
} while ("\n" != $n);
';$s='<?$e=%c%s%1$c;$s=%1$c%s%1$c;$s=sprintf($s,39,$e,$s);eval($e);';$s=sprintf($s,39,$e,$s);eval($e);

Örnek çıktı:

<?p=')ay_r_gecorr_splililen]=$p=$w;

ve:

<?p=$n=$ntststs$m[$n=$m[ay_r_chondo$n=$ph(s$nt(fitstr_r_geantentr_s('m[$n=$n"!=$p etstsp][$w;d(fililile(s$w)$nt(sphor_str_getrarast(''''m[$n='m[$m';

ve:

<?p=$who eay_re($n=$n=$nt(')];d(fililileando et($m[]=$pleay_ch(')aray_ren='''))ay_st_r_s($m[$m[asp])ay_co$m[$p $phorentechitr_rean)][$n=$nd("\n"!=$n=$wh(filend('')ay_gen=$ndo$nt_rasp=$n][$p=$whp=$n='m[$n"\n)))))][$w;dorechph(';dorracho$ple_s$w;fil

ve:

<?ph($n);

PHP Hile, 117

Meraklı için, kendi kaynağımızı okuyarak hile yaparsak, 117 yapabiliriz:

<?=$p=$n='';foreach(str_split(file('m')[0])as$w)$p=$m[$p][]=$w;do echo$n=$m[$n][array_rand($m[$n])];while("\n"!=$n);

Siteye Hoşgeldiniz! Ne yazık ki, bu tür zorluklar için uygun bir Quine olarak neyin sayıldığına dair bazı kurallarımız var ve maalesef kendi kaynağınızdan okumak yasak.
Post Rock Garf Hunter

Oh, güzel, teşekkürler. Kuralları arıyordum. Bunu gözden geçirmem gerekecek.
Şemsiye
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.