Program ini penuh dengan karakter yang tidak dapat dicetak, jadi inilah hexdump:
00000000: 2573 dc01 7e13 dcb6 1f %s..~....
Catatan: ini menggunakan rutin input numerik yang tidak mampu memasukkan angka negatif, jadi pengiriman ini dibatasi hanya untuk bilangan bulat non-negatif.
Satu masalah dengan tantangan polisi dan perampok adalah Anda tidak menulis penjelasan kode (untuk membuatnya lebih sulit untuk di-crack). Di sisi lain, ini berarti bahwa saya tidak harus pergi ke masalah di sini.
Saya memilih 7 sebagai bahasa karena, terutama dalam notasi yang dikompresi, cukup sulit untuk dibaca, dan saya tidak mengerti mengapa hanya saya yang harus repot mencari sekitar 8-bit program yang ditulis dalam penyandian 3-bit. Semoga berhasil!
Penjelasan
Sekarang programnya sudah retak (dengan kekerasan, sayangnya; itu selalu berbahaya dalam solusi singkat ini), saya mungkin juga menjelaskan apa yang saya maksudkan. Ini sebenarnya cukup dipecahkan dengan membaca program; Saya bisa membuatnya jauh lebih sulit, tetapi itu terasa seperti ide yang buruk ketika ada brute force crack.
Kami akan mulai dengan mewakili program dalam penyandian yang lebih alami. Seperti biasa, nomor tebal menunjukkan perintah yang dijalankan segera (tidak semua yang representable dalam sebuah program, 6
dan 7
hanyalah 2
untuk 5
tidak), nomor unbolded mewakili lolos setara mereka ( 0
untuk 5
, yang semuanya representable dalam program asli; catatan yang 0
lolos 6
dan 1
yang lolos 7
):
112 7 1 7 34002 77 023 67 13303
Himpunan perintah yang tersedia dalam sumber program 7 berarti bahwa itu pada dasarnya hanya sebuah literal yang mewakili tumpukan asli (tidak ada lagi yang dapat Anda lakukan dengan hanya perintah yang lolos, 6
dan 7
). Jadi, hal pertama yang akan dilakukan program adalah mendorong banyak barang ke tumpukan. Begini cara tumpukan terlihat setelah program dijalankan ( |
memisahkan elemen tumpukan, seperti biasa dalam 7):
772 | 7 | 34662 | 023 | 73363
Elemen tumpukan terakhir kemudian disalin untuk menjadi kode yang akan dijalankan (sambil tetap berada di tumpukan). Seperti yang terjadi, ini adalah satu-satunya bagian dari program yang memiliki kode; yang lainnya hanyalah data. Inilah yang diterjemahkan menjadi:
73363
7 Dorong elemen kosong ke tumpukan 3 Keluarkan elemen tumpukan
atas, buang elemen di bawahnya
73 Efek gabungan dari ini: buang elemen tumpukan atas
3 Keluarkan elemen tumpukan atas, buang elemen di bawah ini
6 Lepaskan elemen tumpukan atas, kemudian menambahkannya ke elemen di bawah
3 Output elemen stack atas, buang elemen di bawah ini
Dengan kata lain, ini sebagian besar hanya sekelompok instruksi I / O. Mari kita analisis ini secara terperinci:
73
buang 73363
yang masih ada di atas tumpukan.
3
keluaran 023
, dan buang 34662
. Dengan demikian dapat dilihat bahwa 34662
ini adalah komentar, yang digunakan untuk menyimpan byte yang diperlukan dalam versi lain dari program. Adapun apa yang 023
dilakukan ketika output, ia memilih I / O format 0 (integer), kemudian 23
adalah arahan yang meminta implementasi untuk memasukkan integer (dalam 7, Anda melakukan input melalui mengeluarkan kode spesifik yang meminta input). Input dilakukan dengan membuat salinan elemen stack di bawah ini, misalnya jika integer input adalah 10, elemen stack berikutnya (saat ini 7
) akan menjadi 7777777777
. Jadi, kami menerima input dari pengguna dalam desimal, tetapi disimpan sebagai unary.
6
keluar dari elemen stack atas (mengubah setiap instance 7
menjadi 1
; ini adalah bagaimana string yang seluruhnya terdiri dari 7
s diloloskan), kemudian menambahkannya ke elemen stack sebelum ( 772
). Jadi data kami sekarang seperti ini 7721111111111
.
- Akhirnya,
3
menampilkan elemen tumpukan yang dipertanyakan (dan muncul elemen tumpukan kosong yang merupakan bagian dari tumpukan awal default). Nilainya dihitung dengan mengambil jumlah 1
s dan 7
s, dan mengurangi jumlah 0
s dan 6
s. (Di 2
bagian tengah diabaikan dalam kebanyakan kasus; jika di akhir string, itu akan menjadi baris baru alih-alih diabaikan, tetapi aturan PPCG tidak peduli tentang itu.) Dengan demikian, output adalah asli input tambah 2.
Pada titik ini, tidak ada yang berguna pada stack dan tidak ada dalam program, sehingga program keluar.
Bagaimana kita membalikkan ini? Ini masalah sederhana mengubah 11
ke 00
, sehingga kita mengawali karakter untuk input yang membuatnya 2 lebih rendah, daripada 2 lebih tinggi. Ada 00
delapan digit oktal yang tersembunyi lebih jauh di dalam program (sehingga digit dan byte oktal berbaris satu sama lain), jadi kita bisa menukarnya dengan 11
di awal.