Chuỗi xích Markov


17

Một mô hình Markov đơn giản sẽ được sử dụng trong câu hỏi này. Để biết thêm thông tin về Chuỗi Markov, xem http://setosa.io/ev/markov-chains/ .

Lấy một chuỗi. Trong ví dụ này, chúng tôi sẽ sử dụng từ:

reader

Bây giờ, đối với mỗi ký tự, lấy các ký tự xuất hiện sau mỗi lần xuất hiện của ký tự trong chuỗi. ( ​`^`​đại diện cho sự bắt đầu của chuỗi và ​`$`​đại diện cho sự kết thúc)

`^` -> {'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'}

Bây giờ, bắt đầu từ đầu chuỗi, chọn ngẫu nhiên từ một trong các ký tự trong bộ tiếp theo. Nối ký tự này và sau đó chọn từ các ký tự trong tập tiếp theo của nó, và cứ thế cho đến khi bạn đi đến cuối. Dưới đây là một số từ ví dụ:

r
rereader
rer
readereader

Nếu một nhân vật xuất hiện sau một nhân vật khác nhiều lần, nhiều khả năng nó sẽ được chọn. Ví dụ, trong cocoa can, sau một c, có hai phần ba cơ hội nhận được một ovà một phần ba cơ hội nhận được một a.

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

Thử thách

Tạo một chương trình không có đầu vào và đầu ra một chuỗi ngẫu nhiên được tạo bằng Chuỗi Markov, như ở trên, trong đó đầu vào của chuỗi là nguồn của chương trình.

  1. Chương trình phải có ít nhất hai ký tự, hai trong số đó phải giống nhau (Để tránh các chuỗi "nhàm chán" chỉ có một đầu ra)
  2. Bạn có thể sửa đổi mô hình để sử dụng byte thay vì ký tự nếu muốn, nhưng thay đổi "ký tự" thành "byte" trong quy tắc 1
  3. Chương trình sẽ xuất ra các chuỗi ngẫu nhiên với tần suất dự kiến ​​trong lý thuyết

Đây là , vì vậy chương trình ngắn nhất sẽ thắng!


@ mbomb007 tất cả các thông tin trong câu hỏi, liên kết chỉ là thêm nếu bạn quan tâm (Đây là một triển khai rất cơ bản)
Artyer

3
Tại sao ^$trong dấu ngoặc kép? nó có thể làm cho nó rõ ràng hơn để đưa nó ra khỏi dấu ngoặc kép, hoặc đặt chúng trong backquote.
Lemon phá hủy

Câu trả lời:


6

Pip , 64 byte

Đây là niềm vui

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

<tab>đại diện cho một ký tự tab theo nghĩa đen ( 0x09). Hãy thử trực tuyến!

Làm sao?

TL; DR: cú pháp chuỗi thoát, repr và eval.

Đối với các chuỗi cần chứa các ký "tự bằng chữ , Pip đã thoát các chuỗi , sử dụng \"làm dấu phân cách. Một quine tiêu chuẩn sử dụng các chuỗi thoát sẽ trông như thế này:

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

Đó là: Yank (lưu trữ dưới dạng y) một chuỗi chứa "V Y".RPyvà e Val nó. RPylấy repr của y, mà chúng tôi thêm vào chuỗi ký tự V Y. Cuối cùng, xuất kết quả của eval.

Cấu trúc của quine Markov là tương tự, ngoại trừ việc chúng tôi muốn lưu mã thay vì xuất nó và sau đó thực hiện một số thứ với nó sau đó. t:V Y\"...\"gán kết quả eval cho t. Bên trong mã eval'd, m:"..."gán một chuỗi mã mmà chúng ta sẽ đánh giá ở cuối Vm.

ST["t:V Y"RPy";Vm"C9] xây dựng một danh sách chứa

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

và chuyển đổi nó thành một chuỗi, theo mặc định sẽ ghép tất cả các mục. Phần này tương đương với "V Y".RPytrong bản gốc. Vì nó là biểu thức cuối cùng trong chuỗi eval lớn, nên giá trị của nó là những gì Vtoán tử trả về, và do đó những gì được gán cho t.

Do đó, sau khi eval và gán, tbằng với mã đầy đủ và mchứa

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

Bây giờ Vmđánh giá đó là mã. Hãy phá vỡ những gì xảy ra.

                            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

Một vài lưu ý:

  • Kết thúc mã bằng một tab bằng chữ ngắn hơn so với thực hiện kiểm tra regex cho "ký tự tiếp theo hoặc kết thúc chuỗi".
  • Regex tôi đã sử dụng không hoạt động đúng nếu có các ký tự nhân đôi trong mã; ví dụ, áp dụng nó xxysẽ chỉ trả lại xxvà không xytrong các trận đấu. Tuy nhiên, may mắn thay, không có ký tự nhân đôi trong mã này, vì vậy nó không thành vấn đề.

8

JavaScript, 217 215 byte

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)

Lưu ý rằng việc sử dụng unevalnày chỉ được Firefox hỗ trợ. Chạy mẫu:

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()

Như bạn có thể thấy, nó chủ yếu là vô nghĩa, nhưng đó là điều được mong đợi;) OP đã tạo ra một JSFiddle chứng minh rằng cơ hội của một đầu ra có hiệu lực về mặt cú pháp là khoảng 6,3%.


Nếu các chức năng tự đọc được cho phép, đây có thể là 78 ​​byte ES6:

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

Rất, rất hiếm khi, kết quả đầu ra này có hiệu lực về mặt cú pháp:

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

Tên hàm yêu thích của tôi được tạo là .splendom()( split+ length+ random)


3
Tôi tự hỏi xác suất của việc tạo JavaScript hợp lệ này là gì. (Cảnh báo bắn tỉa Nerd)
DanTheMan

2
@DanTheMan Chắc chắn rất, rất thấp. Chỉ cần xác suất của tất cả các dấu ngoặc đơn và ngoặc được cân bằng là cực kỳ thấp. Mặc dù một lần tôi đã nhận được a.splerength.r(), điều đó có thể hợp lệ;)
ETHproductions

1
Có thể muốn lưu ý đây chỉ là FF do việc sử dụng uneval
Shaun H

1
@ShaunH Cảm ơn, tôi quên rằng chỉ FF hỗ trợ uneval.
Sản xuất ETH

5
Chức năng tự đọc thứ hai không hợp lệ ( meta.codegolf.stackexchange.com/a/4878/48878 "một quine không được truy cập vào nguồn của chính nó, trực tiếp hoặc gián tiếp.") Và @DanTheMan, theo jsfiddle.net, theo jsfiddle.net / kabkfLak / 1 , cơ hội sẽ vào khoảng 6,3%.
Artyer

5

Perl, 103 byte

Dựa trên tiêu chuẩn và câu trả lời của tôi cho câu hỏi này :

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

Ví dụ đầu ra

$_=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

Tương tự như câu hỏi khác, một số kết quả tạo ra Perl hợp lệ:

$_=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

nhưng cơ hội hơi thấp hơn, ở mức ~ 2%.


7
Nếu bạn nói với tôi ví dụ đầu tiên là hợp lệ Perl tôi sẽ tin bạn.
ankh-morpork

2
@ dohaqatar7 Lúc đầu, tôi đã hiểu nhầm ý kiến ​​của bạn và nghĩ rằng bạn sẽ không tin tôi nếu tôi nói mã chính hợp lệ Perl ...: D zoitz.com/comics/perl_small.png
Dom Hastings

@ ankh-morpork: rõ ràng không hợp lệ, q{là sự khởi đầu của một chuỗi ký tự và không có }để đóng nó. Perl thực sự khá tệ trong việc chạy các chuỗi byte ngẫu nhiên (và khi có, thông thường là do một chuỗi ký tự hoặc bình luận đầu tiên).

4

Mã máy MS-DOS (tệp .COM), 63 byte - không cạnh tranh

Không cạnh tranh vì một quine không được truy cập vào mã nguồn của chính nó.

Một biến thể 126 byte sẽ đáp ứng yêu cầu "không truy cập mã nguồn của chính nó"!

Biến thể 63 byte trông như thế này:

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

Tôi cũng không chắc chắn về phân phối xác suất của trình tạo ngẫu nhiên:

Chương trình sử dụng thực tế là bộ đếm đồng hồ và thông tin khác được sửa đổi bởi các ngắt được lưu trữ trong phân đoạn 0 để tạo số ngẫu nhiên.

Ví dụ cho đầu ra được tạo là:

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

Chuyển đổi sang mã lắp ráp chương trình trông như thế này:

    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:

Không cạnh tranh được dành riêng cho các câu trả lời đáp ứng các tiêu chí thách thức nhưng đang sử dụng ngôn ngữ hoặc tính năng mới hơn thử thách. Đăng bài biến thể không đọc nguồn của chính nó hoặc xóa câu trả lời.
mbomb007

4

C, 306 328 585 611 615 623 673 707 byte

Mã nguồn:

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

Với dòng mới và khoảng trắng được thêm vào cho mức độ dễ đọc / giải thích:

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  }

Giải trình

Line 01: p[][]giữ số đếm của một ký tự theo sau một ký tự khác.

Line 02: Xchứa nguồn của chương trình, thoát với %c%s%c.

Line 03: Ysẽ chứa nguồn theo nghĩa đen của chương trình. c, j, *aLà các biến đếm.

Line 05: Đặt Yđể chứa quine.

Line 06: Đếm số lần xuất hiện trong p[][].

Line 07: In trạng thái hiện tại.

Line 08: Tìm ngẫu nhiên ký tự tiếp theo, tỷ lệ với số đếm trong p[][].

Đầu ra mẫu:

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
Bạn có thể thêm một phiên bản không có dòng mới và khoảng trắng để chúng tôi có thể xác minh số byte không?
Steven H.

1
Có, tôi đã thêm phiên bản dòng đơn ở đầu.

3

Ruby, 152 byte

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][$/])==?!

Đầu ra mẫu:

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

hoặc là

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=?!

Các quines sử dụng định dạng chuỗi thông qua "s%s"và thực hiện chuỗi Markov bằng cách lấy tất cả các lát có hai ký tự, xáo trộn chúng và biến chúng thành một từ điển Hash, trong đó đối với các khóa trùng lặp, lần xuất hiện cuối cùng sẽ xác định giá trị. Để tránh thêm logic bổ sung cho phần đầu, tôi theo dõi ký tự đầu ra gần đây nhất bằng cách sử dụng $/, được tự động khởi tạo thành một dòng mới và đảm bảo rằng các dòng mới luôn được theo sau trong mã 0, cùng một ký tự mà mã bắt đầu. Cuối cùng, tôi thao túng mã nguồn để chỉ có một !để chúng tôi luôn kết thúc sau tiếng nổ, sử dụng <<33để thêm nó mà không cần bằng chữ. Điều này có thể được đánh gôn hơn nữa bằng cách sử dụng ký tự một chữ số không thể in được thay vì ASCII 33, nhưng điều đó có vẻ quá khó chịu.


4
p<<<<<33Các nhà điều hành siêu siêu siêu concat? ;-)
Sản phẩm điện tử

3
Đó là toán tử "waaaay less than".
mbomb007

2
Tôi thích những từ này tạo ra! Thực tế ví dụ đầu tiên là rất quan tâm nếu đối tượng Has(s).ears(2)làm tôi cười thầm!
Dom Hastings

2

Rust, 564 byte (không cạnh tranh)

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

Vì tôi đã viết một câu đố Rust khá gọn gàng cho một câu hỏi khác, tôi nghĩ tôi sẽ điều chỉnh nó cho việc này, vì nó có vẻ đơn giản. Mặc dù bản gốc là nhỏ, tuy nhiên, vì điều này tôi đã cố gắng rất ít để giảm thiểu kích thước. Đây là phiên bản mở rộng để giải thích những gì đang diễn ra:

// 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.
    }
}

Mẫu đầu ra 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];}{}

Mẫu đầu ra 2:

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

2

Python 2, 211 byte

Kết quả đầu ra 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

Dùng thử trực tuyến

Đầu ra mẫu:

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

Giải thích ngắn gọn:

  • Chương trình này sử dụng s='s=%r;print s%%s';print s%sđịnh dạng quine. Tôi tạo một chuỗi s, sẽ chứa toàn bộ chương trình.
  • Chuỗi Xchứa thủ tục để thực hiện đệ quy.
  • Quy trình xây dựng chuỗi đầu ra o, chuỗi này sẽ được in stderrkhi đến cuối chuỗi Markov.
  • Phần cuối của chuỗi được biểu thị bằng chuỗi $$, sử dụng hai ký tự để chương trình hoạt động cho tất cả các chuỗi. Tôi có thể đã sử dụng một nhân vật không có trong chương trình của mình như thế nào chr(0), nhưng tôi nghĩ đó là lâu hơn.
  • Ký tự được chọn mỗi lần thực hiện được đặt trong cđó (cùng với o) được khởi tạo thành ký tự đầu tiên của chương trình.
  • Danh sách các ký tự theo sau mỗi lần xuất hiện của lựa chọn ctrong chuỗi t(biến giữ nguyên hàm của mã nguồn) là q, sẽ được chọn từ lựa chọn tiếp theo c.

1

PHP, 144 135 130 120 272 220 212 byte

<?$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);

Hoặc, được định dạng để dễ đọc:

<?$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);

Đầu ra mẫu:

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

và:

<?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';

và:

<?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

và:

<?ph($n);

Gian lận PHP, 117

Đối với những người tò mò, nếu chúng ta gian lận bằng cách đọc nguồn của chính mình, chúng ta có thể làm 117:

<?=$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);

Chào mừng đến với trang web! Thật không may, chúng tôi có một số quy tắc về những gì được coi là Quine thích hợp cho những thách thức như thế này và không may đọc từ nguồn của bạn bị cấm.
Phù thủy lúa mì

Oh, tốt, cảm ơn bạn. Tôi đã tìm kiếm các quy tắc. Tôi sẽ phải sửa lại điều này.
Ô dù
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.