Levenquine Siklik

45

Latar Belakang

Seperti yang diketahui oleh kebanyakan PPCG, adalah program yang mengeluarkan kode sumbernya sendiri ketika dijalankan; dan jarak Levenshtein antara dua string adalah jumlah minimum penyisipan, penghapusan, dan pengeditan yang diperlukan untuk mengubah satu string menjadi yang lain. Dalam tantangan ini, kami menggabungkan dua konsep menjadi "levenquine": program yang menampilkan kode sumbernya sendiri, tetapi dengan satu instance dari satu karakter yang dimasukkan, dihapus, atau diganti dengan karakter yang berbeda. (Dengan kata lain, jarak Levenshtein antara program dan outputnya adalah 1.)

Tugas

Tulis levenquine sehingga outputnya adalah levenquine, output dari program itu juga levenquine, dan seterusnya. Selain itu, pada titik tertentu, urutan menjalankan program berulang kali, menjalankan outputnya, menjalankan output outputnya, dll. Pada akhirnya harus kembali ke program semula.

Ada satu batasan tambahan yang membuat segalanya lebih sulit: harus ada dua program berbeda di suatu tempat dalam siklus ini yang tidak memiliki karakter yang sama (dengan kata lain, tidak ada karakter yang ada dalam satu program dan juga ada dalam program lain). Program Anda karena itu harus secara bertahap mengubah dirinya menjadi rangkaian karakter yang berbeda, dan kembali lagi.

Jika Anda menggunakan bahasa pemrograman yang memiliki boilerplate yang tidak terhindarkan yang diperlukan dalam setiap program yang menghasilkan output (mis. Hanya memiliki satu cara untuk menulis printpernyataan dan tidak ada bentuk output lain yang berguna), Anda dapat memperlakukan boilerplate itu sebagai tidak ada untuk tujuan tersebut menentukan karakter yang memiliki dua program yang sama. Anda harus, bagaimanapun, masih menghitung bahwa boilerplate untuk tujuan menentukan properti Levenquine dari kode.

Klarifikasi

  • Setiap "program" dalam siklus dapat berupa program lengkap atau fungsi. Mereka tidak semua harus sama, misalnya beberapa bisa menjadi program penuh dan beberapa bisa menjadi fungsi.
  • Tidak semua program dalam siklus perlu menggunakan bentuk output yang sama. Sebagai contoh, beberapa dapat mengeluarkan melalui keluaran standar, dan beberapa dapat mengeluarkan melalui kesalahan standar.
  • Program Anda akan dijalankan tanpa input (atau dalam bahasa yang memerlukan input untuk melakukan apa saja, input sesederhana mungkin).
  • Aturan quine yang tepat berlaku; walaupun Levenquine bukan quine yang sebenarnya, Anda mungkin tidak melakukan apa pun yang ilegal saat menulis quine yang tepat. Secara khusus, program nol tidak pernah merupakan keluaran yang valid dari Levenquine yang tepat (dan karenanya tidak dapat menjadi bagian dari siklus Anda).
  • Pembatasan Levenquine diukur dalam hal karakter, bukan byte (misalnya êsatu karakter bahkan ketika sumber dikodekan dalam UTF-8). Pembatasan no-karakter-dalam-umum juga diukur dari segi karakter. Kondisi kemenangan, bagaimanapun, dihitung dalam byte.

Kondisi kemenangan

Silakan kirimkan setidaknya tiga program berikut dari siklus: program terpendek (diukur dalam byte); dan dua program dari siklus yang tidak memiliki karakter yang sama. Mungkin saja keduanya sama, dan mungkin juga ketiganya berbeda. Skor didasarkan pada panjang dalam byte dari program terpendek, dengan yang lebih pendek lebih baik, sehingga membuat ini semacam kompetisi .


sumber
Untuk orang-orang yang dapat melihat posting yang dihapus: posting Sandbox ada di sini .
Saya pikir itu juga akan baik untuk jawaban untuk memasukkan lamanya siklus.
mbomb007
Bagaimana jika, katakanlah, bahasa memiliki beberapa fungsi untuk melakukan output, tetapi mereka semua berbagi karakter secara berpasangan?
Ørjan Johansen
2
@ ØrjanJohansen: Saya kira saya tidak akan terlalu menentang untuk hanya memilih salah satu dari mereka dan tetap menggunakannya dalam kasus itu. Namun, ini bisa dibilang tidak bersaing; Saya ingin aturan menjadi obyektif, karena jika tidak, orang cenderung mencoba menyodok celah di dalamnya, dan jika Anda mencoba membuat aturan terlalu rumit, cenderung ada pertengkaran mengenai apa artinya.
Bisakah itu levenquine sedikit bijaksana? Seperti dalam jarak dari kode sumber asli adalah 1 byte off?
Guci Gurita Ajaib

Jawaban:

34

Gol> <> , 252 167 byte

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_

Cobalah online!

Dan program ( Verifikasi ) yang berbeda:

0<CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Cobalah online!

Ini sebagian besar terinspirasi oleh jawaban saya untuk tantangan Mutual Exclusive Quines , dengan pujian juga masuk ke Bubbler's Gol> <> answer .

Berikut adalah program verifikasi yang dapat Anda jalankan. Sayangnya, waktu habis, tetapi Anda dapat melihat bagaimana satu bagian kode membangun bagian lainnya dan kemudian Anda dapat menyalin versi terakhir yang dicetak dan menempelnya ke input untuk melanjutkan. Akhirnya, Anda akan mencapai program pertama yang Anda masukkan.

Penjelasan

Kedua bagian kode terdiri dari dua bagian, bagian pelaksana aktual dan data yang berisi bagian kode lainnya. Keduanya berfungsi secara praktis identik:

Mereka bergantung pada bendera (karakter pertama dari kode, baik 1atau 0). Jika flag diset, mereka akan mulai membangun bagian kode yang lain dengan menurunkan karakter ke-252, menambah / mengurangi 28dari itu dan menambahkannya ke kode.

Sebagai contoh, berikut adalah dua iterasi pertama dari kode setelah program pertama di atas:

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_C

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽ

Akhirnya ketika mencapai akhir bagian saat ini, ia membalik karakter kedua kode ( <ke >dan kembali lagi) untuk menunjuk ke bagian lain.

Berikut adalah kedua bagian bersama-sama, akan beralih dari mengeksekusi bagian pertama ke mengeksekusi bagian kedua.

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

Cobalah online!

Bendera adalah kebalikan dari setiap bagian, sehingga bagian yang baru akan mulai menghapus bagian kode lainnya hingga mencapai kode sendiri. Pada titik ini, ia membalik bendera dan siklus berulang lagi.

Jo King
sumber