Tuliskan periode terpanjang iterasi quine yang dibatasi 500 byte

16

Tugas Anda adalah membuat quine iterating periode terpanjang , di mana panjang setiap program dalam urutan dibatasi oleh 500 byte.

Yaitu, jika Anda mengulangi langkah-langkah berikut:

  1. Mulailah dengan program awal Anda
  2. Jalankan program saat ini
  3. Kembali ke langkah 2

Anda akhirnya akan kembali ke program semula. Jumlah program dalam siklus adalah skor Anda, yang Anda coba maksimalkan.

Tak satu pun dari program dapat menimbulkan kesalahan. Setiap program harus dijalankan dengan cara yang sama juga (mis. Tidak ada versi yang berbeda, implementasi, opsi kompiler, platform, dll ...) (EDIT: Ya, setiap kondisi eksternal seperti generator nomor acak semu termasuk dalam yang terakhir pernyataan. Status eksternal harus "reset" setelah setiap kali dijalankan. Jika Anda menggunakan angka acak benar, kasus terburuk dianggap.)

Apa yang membedakan tantangan ini dari Periode iterating quine terpanjang (selain 100 vs 500) adalah bahwa setiap program dalam siklus juga harus 500 byte atau kurang. Ini berarti bahwa siklus terpanjang yang mungkin adalah (256 ^ 501 - 1) / 255 atau kurang. Tentu saja itu adalah angka yang besar, tetapi tidak seberapa besar dalam hal berapa banyak kode yang diperlukan untuk menghitung. Jadi tantangannya adalah tentang menggunakan sebanyak mungkin (256 ^ 501 - 1) / 255 kemungkinan yang Anda bisa, bukan tantangan berang-berang yang sibuk.

Program tidak diizinkan mengakses kode sumbernya sendiri. Namun program kosong yang diizinkan jika Anda ingin (selama Anda mengikuti aturan lainnya).

Karena memeriksa program secara manual akan sulit, Anda dapat mengetahui skor menggunakan metode teoritis. Anda harus memasukkan penjelasan tentang skor dan kebenaran dengan program Anda. Jika Anda tidak dapat mengetahui skor, Anda dapat menggunakan batas bawah dari jumlah program dalam siklus sebagai skor defacto. Anda diizinkan untuk memperbarui ini karena Anda menemukan batas bawah yang lebih baik, atau jika Anda menemukan skor aktual yang sebenarnya.

Ini adalah , jadi skor tertinggi menang!

EDIT: Disarankan agar Anda menulis berapa skor Anda dalam notasi ilmiah, sehingga jawabannya lebih mudah dibandingkan. Sangat baik untuk memiliki bentuk skor lain juga, terutama jika mereka lebih jelas terhubung ke program Anda. Selain itu, pembaca didorong untuk mengedit jawaban sebelumnya untuk mematuhi ini.

PyRulez
sumber
2
"siklus terpanjang yang mungkin adalah (256 ^ 501 - 1) / 255 atau kurang" --- ini tidak selalu benar, program dapat melewati keadaan yang sama beberapa kali sebelum kembali ke yang asli jika memanipulasi objek eksternal ( seperti negara RNG atau seed)
JDL
2
@ JDL yang seharusnya melanggar aturan, IMHO - jika ia menyimpan negara bagian lain dari pada kode sumber, maka itu bukan quine iterating yang tepat.
Nathaniel
1
@Nathaniel Saya tidak akan mengkategorikannya sebagai keadaan penyimpanan di tempat lain, itu hanya menggunakan titik masuk yang merupakan bagian yang valid dari bahasa pemrograman yang diterapkan. Bisa dibilang, apa pun yang memanggil fungsi lain dalam bahasa pemrograman adalah mengakses keadaan yang diadakan di luar kode sumbernya sendiri.
JDL
1
@ JDL tidak, itu adalah hal yang berbeda. Setiap program dalam bahasa apa pun jelas harus bergantung pada hal-hal yang diimplementasikan di luar kode sumber, tetapi keadaan penyimpanan di luar kode sumber berbeda. Itu berarti output dari program bukan fungsi deterministik dari kode sumbernya, tetapi tergantung pada beberapa konteks eksternal lain yang telah diubah oleh menjalankan sebelumnya. Itu seharusnya tidak diperbolehkan dalam tantangan quine, IMHO, dan pernyataan OP tentang panjang siklus maksimum menunjukkan bahwa itu dimaksudkan untuk dianulir di sini.
Nathaniel
3
@JDL karena saya yakin Anda tahu, dalam bahasa deterministik pointer instruksi hanya menyimpan status selama eksekusi suatu program, dan bukan di antara pemanggilannya. Contoh 5-negara Anda tidak dimungkinkan jika output program adalah fungsi deterministik dari sumbernya.
Nathaniel

Jawaban:

12

Perl 6 , 1263988.86×10835 iterasi

$!=Q~~;<say "\$!=Q~{chrs(my@a=[R,] polymod :126[$!.ords]+1: 126 xx*)x?(@a-399)}~;<$_>~~.EVAL">~~.EVAL

Cobalah online!

Ini beralih melalui semua kombinasi yang mungkin dari 126 byte pertama panjang 398 dan di bawah (tidak termasuk string dengan NUL byte terkemuka). Jika Anda ingin melihat bahwa itu benar-benar kembali ke iterasi pertama, Anda dapat mengurangi panjangnya menjadi 1 dengan mengubah batas seperti itu .

Penjelasan:

Setiap iterasi menambah string, disimpan dalam bentuk basis 126, dan kemudian mengubahnya kembali ke basis 126. Ia melakukan ini hingga mencapai string dengan panjang 399, dan kemudian mengatur ulang string kembali menjadi kosong lagi. Jika Anda kesulitan membuat konsep angka, bayangkan dengan sepuluh byte saja. Mulai dari 0, kenaikan hingga 4 digit, 1000dan reset. Ini adalah 104-1 iterasi (termasuk 0atau string kosong dalam kasus program saya).

$!=Q~~;         # Start with an empty string
< ... >~~.EVAL  # Set a string to $_ and EVAL it
  say "\$!=Q~{...}~;<$_>~~.EVAL"   # Print the program with the string replaced by
                       :126[$!.ords]   # The string converted from base 126
                                    +1 # Incremented
          [R,] polymod                : 126 xx*  # Back to base 126
chrs(                                )  # Back to a string
     my@a=                            x?(@a-399)  # Only if it isn't 399 characters
Jo King
sumber
1
Wow, kau melakukannya dengan sangat cepat, aku hampir selesai dengan milikku, tapi aku mungkin akan menyelesaikannya besok (milikku akan ada di Gol> <>)
KrystosTheOverlord
Perhitungan ini menunjukkan bahwa Anda memperkirakan skor Anda. Pembilangnya adalah berapa banyak string dengan panjang 397 ada yang menggunakan 126 simbol. (Saya harus mendistribusikan pecahan ke dalam jumlah karena wolfram alpha bertingkah aneh.)
PyRulez
@PyRulez Saya pikir nomor saya benar, karena pada dasarnya iterasi basis 126 nomor hingga 399 digit ... Saya pikir penjelasan saya tidak aktif
Jo King
@ Menjawab ah ya, saya pikir penjelasannya adalah masalahnya. Anda mengubah 397 menjadi 398, yang membuat skor Anda tidak lagi menjadi terlalu tinggi. Anda mungkin meremehkannya (karena Anda hanya memasukkan string dengan panjang persis 398 dalam skor), tetapi itu tidak masalah.
PyRulez
2

Pesona Rise , 64654 106 ; 122 387 -1 ≈ 2,638 × 10 807 iterasi

"3X4+kSq'ƃZ,r{1?{1[:1Z%1+:a=+:d=+:3X4+=+:6X2+=+:'€(c*?~1-1kq}͍f1+0Bl1=6*?S1-Skql͗2=4*?{͍]}B͍l1=6*?kS1-Sq]}@

Cobalah online!

Peringatan: Tampilannya salah, seharusnya `` (0x80).

Daripada stack, gunakan string dan operator stack dimodifikasi dengan ͍ untuk memodifikasi string daripada stack (lihat revisi sebelumnya). Karenanya, setiap karakter dibatasi hingga 1 byte (rentang 0-127, minus karakter bermasalah), tetapi dengan karakter lebih dari 3 kali lebih banyak (karena pemrosesan pelat pelat lebih sedikit karena tidak harus melewati karakter kombinasi Unicode, seperti serta beberapa penghematan byte lainnya) itu mencapai jumlah iterasi yang lebih tinggi.

Jika pengkodean sebagai big endian sejati diizinkan (yaitu, memiliki nilai byte di atas 127 tanpa memotong 0x00byte) ini dapat mencapai 251 387 -1 ≈ 4,717 × 10 928 iterasi. Namun, pengkodean Latin TIO mencegah hal ini sebagaimana dicatat oleh Erik the Outgolfer dalam jawaban Python 2-nya. Saya perlu memeriksa apakah itu berfungsi secara lokal sebelum mengklaim skor ini.

Seharusnya bisa diganti f1+0Bdengan '0B(ada yang belum dicetak di 0x16sana), tapi itu melelahkan saya (hal-hal tidak ingin bercabang / melompat / kembali dengan benar), jadi saya meninggalkannya sendirian. Ini akan meningkatkan struktur big-endian dari 387 menjadi 388.

Draco tidak lagi percaya pada SE
sumber
1

DOS COM, 49 byte, periode 2 ^ 3608

00000000  be 31 01 89 f7 b9 f4 02  f9 ac 14 00 aa 39 ce 72  |.1...........9.r|
00000010  f8 31 c9 b4 3c ba 2b 01  cd 21 89 c3 b4 40 b9 f4  |.1..<.+..!...@..|
00000020  01 ba 00 01 cd 21 b4 3e  cd 21 c3 71 2e 63 6f 6d  |.....!.>.!.q.com|
00000030  00                                                |.|

Perakitan asli untuk dibuat:

 BITS 16
 ORG 0100h
   mov si, l
   mov di, si
   mov cx, 500 + 0100h
   stc
n: lodsb
   adc al, 0
   stosb
   cmp si, cx
   jb n
   xor cx, cx
   mov ah, 3ch
   mov dx, f
   int 21h
   mov bx, ax
   mov ah, 40h
   mov cx, 500
   mov dx, 0100h
   int 21h
   mov ah, 3eh
   int 21h
   ret
f: db "q.com", 0
l: db 0

Permata kecil ini menulis fase berikutnya ke q.com daripada output standar karena nulls dan hal-hal lain yang tidak dapat ditangani terminal. Teknik quine root setara dengan stringifikasi dan ruang payload digunakan sebagai penghitung 3608 bit. Karena cara kerja DOS, keadaan awal penghitung berisi puing-puing dari apa pun yang ada dalam memori sebelum eksekusi pertama.

Input 49 byte asli tidak dapat dijangkau, jadi jika Anda ingin memberi nilai 500 byte, silakan.

Joshua
sumber
1

C # (Visual C # Interactive Compiler) , flags: /u:System.Numerics.BigIntegerdan/r:System.Numerics

Nilai: 10 332

Terima kasih kepada JoKing yang meningkatkan skor saya dari 10 255 * 2 - 1 hingga sekarang!

var i=Parse("0");var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";Write(s,(char)34,s,(++i).ToString().Length<333?i:0);

Cobalah online!

Penjelasan

Menambah BigInteger setiap iterasi, hingga panjangnya menjadi terlalu besar, yang dalam hal ini kami langsung kembali ke quine asli.

//The BigInteger that will be incremented
var i=Parse("0");
//The string that encodes the quine
var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";
//Print out the string, with every {0} replaced with quotes and the {1} replaced with the original string
Write(s,(char)34,s,
//And the {2} is replaced to the BigInteger+1 if the BigInteger wouldn't be too long, else 0
(++i).ToString().Length<333?i:0);
Perwujudan Ketidaktahuan
sumber
1

Python 2 , 500 byte,252219

#coding=L1
s=""""""
for i in range(220-len(s.lstrip("ÿ")))[:219]:s=s[:i]+chr(ord(s[i])%255-~(s[i]in"!$&"))+s[i+1:]
S='#coding=L1\ns="""%s"""\nfor i in range(220-len(s.lstrip("\xff")))[:219]:s=s[:i]+chr(ord(s[i])%%%%255-~(s[i]in"!$&"))+s[i+1:]\nS=%%r;print S%%%%s%%%%S';print S%s%S

Perhatikan bahwa ada baris baru yang tertinggal. Mungkin akan dihapus di atas jika highlighter sintaks memaksa masuk

Sayangnya, Anda tidak dapat menjalankan program ini di TIO, karena disandikan dalam bahasa Latin-1.

Di atas, sberisi 219 0x01 byte. Setelah program berjalan, sumbernya dicetak, kecuali untuk satu perbedaan: stelah bertambah seperti angka base-252 big-endian, jadi karakter paling kiri telah "bertambah" menjadi 0x02. Bytes 0x00, 0x22, 0x25, dan 0x5C dihindari, jadi, jika karakter string apa pun menjadi salah satu dari mereka setelah penambahan, karakter itu sendiri akan bertambah lagi.

  • 0x00 (null): File sumber Python tidak dapat berisi karakter null.
  • 0x22 ( "): Ada bahaya tiga 0x22 byte terbentuk dalam satu baris, yaitu """,, atau karakter terakhir dari string menjadi ", sehingga string akan ditutup sebelum waktunya.
  • 0x25 ( %): printf-seperti format string digunakan sebelum menyelesaikan kerangka Quine, sehingga %tidak berdekatan dengan yang lain %di sakan menimbulkan masalah. Sayangnya, tidak mungkin untuk menyusun ulang format untuk menghindari peringatan ini.
  • 0x5C ( \): Ada kemungkinan bahwa \itu digunakan sebagai tanda pelarian dalam string, bukan kata demi kata, jadi itu dihindari.

Oleh karena itu, 252 dari 256 byte dapat digunakan. Jika smengandung 219 0xFF ( ÿ) byte, itu hanya dikembalikan ke 219 0x01 byte, karenanya menyelesaikan siklus.

Diberikan di atas, kita punya 252219 string yang mungkin, maka banyak program secara keseluruhan.

252219=8067118401622543607173815381864126969021321378412714150085501148172081568355283332551767558738710128769977220628694979838777041634307806013053042518663967641130129748108465109552157004184441957823830340121790768004370530578658229253323149648902557120331892465175873053680188287802536817909195292338112618632542000472094347226540339409672851252596442228662174845397731175044304251123874046626291460659909127172435776359148724655575878680270692451120531744950544969860952702932354413767504109600742385916705785109741289800204288

Erik the Outgolfer
sumber
1

Bersih ,2512262.1×10542

  • 251 39 menghapus ketergantungan padaText
  • 251 122 fungsi penambahan golf
  • 251 128 string sumber awalan dan sufiks gabungan
  • 251 188 menghapus ketergantungan padaGast.GenLibTest

Disajikan dalam format xxd karena tidak dapat dicetak / UTF-8 tidak valid:

00000000: 6d6f 6475 6c65 2071 3b69 6d70 6f72 7420  module q;import 
00000010: 5374 6445 6e76 3b53 7461 7274 3d28 7325  StdEnv;Start=(s%
00000020: 2830 2c34 3129 2c3f 5b27 0101 0101 0101  (0,41),?['......
00000030: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000040: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000050: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000060: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000070: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000080: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000090: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000a0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000b0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000c0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000d0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000e0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000f0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000100: 0101 0101 0101 0101 0101 0101 275d 2c73  ............'],s
00000110: 2528 3432 2c39 3939 292c 712c 732c 7129  %(42,999),q,s,q)
00000120: 3b71 3d69 6e63 2721 273b 3f5b 683a 745d  ;q=inc'!';?[h:t]
00000130: 2363 3d68 2b69 6628 616e 7928 283d 3d29  #c=h+if(any((==)
00000140: 6829 5b27 ff09 0c26 5b27 5d29 2702 2727  h)['...&['])'.''
00000150: 0127 3d5b 633a 6966 2863 3e68 2969 643f  .'=[c:if(c>h)id?
00000160: 745d 3b3f 653d 653b 733d 226d 6f64 756c  t];?e=e;s="modul
00000170: 6520 713b 696d 706f 7274 2053 7464 456e  e q;import StdEn
00000180: 763b 5374 6172 743d 2873 2528 302c 3431  v;Start=(s%(0,41
00000190: 292c 3f5b 2727 5d2c 7325 2834 322c 3939  ),?[''],s%(42,99
000001a0: 3929 2c71 2c73 2c71 293b 713d 696e 6327  9),q,s,q);q=inc'
000001b0: 2127 3b3f 5b68 3a74 5d23 633d 682b 6966  !';?[h:t]#c=h+if
000001c0: 2861 6e79 2828 3d3d 2968 295b 27ff 090c  (any((==)h)['...
000001d0: 265b 275d 2927 0227 2701 273d 5b63 3a69  &['])'.''.'=[c:i
000001e0: 6628 633e 6829 6964 3f74 5d3b 3f65 3d65  f(c>h)id?t];?e=e
000001f0: 3b73 3d22                                ;s="

Cobalah online!

Increment string 226-byte melalui semua nilai byte tidak termasuk \0, \n, \r, 'dan \.

Alasan kami menghindari karakter ini adalah:

  • \0 membuat kompiler marah
  • \ndan \rtidak dapat muncul di daftar nama
  • ' akan mengakhiri daftar charlist
  • \ dapat menyebabkan masalah jika muncul sebelum karakter yang dapat melarikan diri

Setelah semua string \377s itu membungkus ke semua \001s, memberikan program aslinya.

Suram
sumber
Output (setidaknya pada TIO) adalah karakter dengan nilai ordinal 128, tetapi terdiri dari dua byte C2 80. Apakah ini sama dengan perilaku pada mesin lokal Anda?
Jo King
1
@JoKing Oh, tidak, saya mendapatkan satu byte pada mesin saya. TIO mengeluarkan output saat UTF-8 tidak valid (dan juga memasukkan file).
Kamis
1
@JoKing Saya sudah mengubah jawaban ke format baru yang memungkinkan untuk melihat perilaku yang benar di TIO.
Kamis
0

Gol> <> , 70 byte, 39039000 iterasi

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||lPaa*5*=?1:1=Q$~$~|:1)lPaa*5*(Q?:|r2ssH##

Wow, itu jauh lebih rendah daripada yang saya kira akan ... Langkah selanjutnya! Membuatnya memiliki lebih banyak iterasi !!!

Cobalah online!

KrystosTheOverlord
sumber
tampaknya tidak menghapus apa pun setelah mencapai 500, hanya menambahkan byte NUL
Jo King
Apakah ini bekerja sama sekali? Saya tidak bisa mendapatkan "kenaikan char terakhir" untuk bekerja
ASCII-satunya
@ Hanya ASCII Sekarang ini berfungsi, maaf tentang sebelumnya, saya telah mengacaukan satu bagian ketika sedang memperbaiki semuanya. Ini bekerja sekarang, maaf atas ketidaknyamanan ini !!!
KrystosTheOverlord
@JoKing Byte NUL adalah proses penghapusan, sekarang program harus menghapus sampai hampir hilang, kemudian menghapus NUL dan menambah char terakhir, jika itu ~, maka akan dikonversi ke '#', kembali ke normal !!!
KrystosTheOverlord