Baris baru ditambahkan untuk kejelasan:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
Saya memberi diri saya batasan yang harus dibaca dari STDIN daripada dari atas tumpukan seperti jawaban Underload biasanya. Saya juga menggunakan input desimal yang tepat, yang merupakan sebagian besar kode.
Penjelasan:
Saya membungkus program dalam quine-wrapper: (a(:^)*and ):^. Ini berarti semua kode di dalam pembungkus quine akan memiliki kode sumber program di bagian bawah tumpukan.
Untuk mengubah angka menjadi angka Gereja yang normal, saya menggunakan teknik mengganti setiap digit dengan kode untuk dikalikan dengan 10 dan menambahkan angka itu:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
Ada banyak pengulangan di sini, jadi mari kita mengemasnya menjadi subprogram yang akan mengambil angka Gereja dari atas tumpukan dan menggunakannya untuk membangun "string angka:"
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
Saya memasukkan ini ke lingkungan baru sehingga dapat diakses dengan cepat:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
Sekarang saya dapat membuat kode pengganti untuk R. Rmenggunakan elemen atas tumpukan untuk membentuk tabel pencarian untuk mengganti string dari STDIN dengan kode Betaload. Ini berfungsi seperti ini:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
Namun, kita dapat menggunakan subprogram yang baru saja kita buat untuk menghasilkan segmen kode:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
Ketika Rdijalankan, itu akan mengubah input menjadi serangkaian subprogram yang membangun angka Gereja. Ketika subprogram ini dieksekusi, ia menciptakan angka Gereja pada elemen berikutnya pada stack (0, yang diletakkan sebelumnya) Ini berarti bahwa, setelah R^, nilai teratas di tumpukan adalah angka Gereja. Kami kemudian ^sekali lagi menerapkan angka Gereja pada elemen terakhir dalam tumpukan (kode sumber program) untuk mendapatkan jawabannya.
Fakta menyenangkan: Saya sudah memiliki MD untuk pengiriman ini selama beberapa bulan. Saya menyimpannya setelah salah paham pertanyaan (yang sepertinya tidak bisa saya temukan lagi). Saya harus menggalinya dari Recycle Bin untuk mempostingnya di sini.