Tujuan dari tantangan ini adalah (pada akhirnya) mengeluarkan setiap program penghentian yang mungkin dalam bahasa pilihan Anda. Pada awalnya ini mungkin terdengar mustahil, tetapi Anda dapat melakukannya dengan pilihan perintah eksekusi yang sangat hati-hati.
Di bawah ini adalah diagram ASCII untuk menggambarkan hal ini. Biarkan kolom mewakili penomoran dari setiap program yang mungkin (setiap program adalah jumlah simbol hingga dari alfabet terbatas). Biarkan setiap baris mewakili langkah tunggal dalam pelaksanaan program itu. Sebuah X
mewakili eksekusi yang dilakukan oleh program itu pada langkah-waktu itu.
step# p1 p2 p3 p4 p5 p6
1 X X X X X X
2 X X X X X
3 X X X X
4 X X X X
5 X X X
6 X X
7 X X
8 X X
9 X X
∞ X X
Seperti yang Anda tahu, program 2 dan 4 tidak berhenti. Jika Anda menjalankannya satu per satu, controller Anda akan terjebak dalam infinite loop yaitu program 2 dan tidak pernah menghasilkan program 3 dan seterusnya.
Sebagai gantinya, Anda menggunakan pendekatan dovetailing . Surat-surat tersebut mewakili kemungkinan urutan eksekusi untuk 26 langkah pertama. Ini *
adalah tempat di mana program itu terhenti dan dikeluarkan. Ini .
adalah langkah-langkah yang belum dijalankan.
step# p1 p2 p3 p4 p5 p6
1 A C F J N R V
2 B E I M Q * Z
3 D H * P U
4 G L T Y
5 K O X
6 * S .
7 W .
8 . .
9 . .
∞ . .
Persyaratan untuk bahasa target
Bahasa target (yang ditafsirkan paralel) harus Turing-complete. Selain itu, itu bisa bahasa apa pun yang Turing-lengkap, termasuk himpunan bagian Turing dari bahasa yang jauh lebih besar. Anda juga bebas menafsirkan hal-hal seperti aturan sistem tag siklik. Anda juga diizinkan membuat bahasa untuk diuji, selama Anda dapat menunjukkan mengapa bahasa Turing-lengkap.
Sebagai contoh, jika Anda memilih untuk menguji brainfuck, maka yang terbaik adalah hanya menguji []-+<>
subset, karena input tidak didukung dan output dibuang begitu saja (lihat di bawah).
Ketika datang ke program "controller" (yang Anda main golf), tidak ada persyaratan khusus. Pembatasan bahasa normal berlaku.
Cara membuat daftar program tanpa batas
Mayoritas bahasa pemrograman dapat direpresentasikan sebagai serangkaian simbol dari alfabet hingga. Dalam hal ini, relatif mudah untuk menyebutkan daftar setiap program yang mungkin dalam urutan bertambah panjang. Alfabet yang Anda gunakan harus mewakili persyaratan bahasa target. Dalam kebanyakan kasus, ini adalah ASCII yang dapat dicetak. Jika bahasa Anda mendukung Unicode sebagai fitur tambahan, Anda tidak boleh menguji setiap kemungkinan kombinasi karakter Unicode, cukup ASCII. Jika bahasa Anda hanya menggunakan []-+<>
maka jangan menguji berbagai kombinasi karakter "komentar" ASCII. Bahasa seperti APL akan memiliki huruf khusus mereka sendiri.
Jika bahasa Anda dijelaskan dengan cara non-alfabet, seperti Fractran atau Turing Machines, maka ada metode lain yang sama-sama valid untuk membuat daftar semua program yang mungkin valid.
Menafsirkan daftar program yang terus berkembang
Bagian penting dari tantangan ini adalah menulis penerjemah paralel untuk daftar program yang terus bertambah. Ada beberapa langkah dasar untuk ini:
- Tambahkan sejumlah program ke dalam daftar
- Menafsirkan setiap program dalam daftar secara individual untuk periode waktu yang terbatas. Ini dapat dicapai dengan melakukan satu langkah instruksi untuk masing-masing. Simpan semua status.
- Hapus semua program terminating / melempar kesalahan dari daftar
- Keluarkan program * yang terhenti dengan bersih
- Tambahkan beberapa program lagi ke daftar
- Simulasikan setiap program secara bergantian, ambil eksekusi dari program yang lebih lama di mana ia tinggalkan
- Hapus semua program terminating / melempar kesalahan dari daftar
- Keluarkan program * yang terhenti dengan bersih
- ulangi
* Anda seharusnya hanya mengeluarkan program yang berhenti dengan bersih. Ini berarti bahwa tidak ada kesalahan sintaksis atau pengecualian yang tidak tertangkap selama eksekusi. Program yang meminta input juga harus dihentikan tanpa mengeluarkannya. Jika suatu program menghasilkan keluaran, Anda tidak harus menghentikannya, buang saja hasilnya.
Lebih banyak aturan
- Anda tidak boleh menelurkan utas baru untuk memuat program yang telah diuji, karena ini melepaskan kerja paralelisasi ke OS host / perangkat lunak lain.
- Sunting: Untuk menutup celah potensial di masa depan, Anda tidak diizinkan untuk
eval
(atau fungsi terkait lainnya) menjadi bagian dari kode program yang diuji . Anda dapateval
membuka kunci kode dari kode juru bahasa. (Jawaban BF-in-Python masih valid berdasarkan aturan ini.) - Ini adalah kode-golf
- Bahasa tempat Anda menulis kiriman tidak harus sama dengan bahasa yang Anda uji / hasilkan.
- Anda harus mengasumsikan bahwa memori yang tersedia tidak terikat.
- Saat membuktikan kelengkapan Turing, Anda dapat mengasumsikan bahwa input di-hardcode ke dalam program, dan hasilnya dapat dibaca dari kondisi internal program.
- Jika program Anda menghasilkan sendiri, itu mungkin salah atau polyglot.
"If your program outputs itself, it is probably wrong or a polyglot."