Ini adalah teka-teki polisi-dan-perampok benang yang dapat ditemukan perampok di sini .
Tugas Anda akan dua menulis dua program (atau fungsi) sehingga mereka adalah anagram satu sama lain dan satu melakukan kebalikan dari yang lain. Program-program ini dapat menerima dan menghasilkan bilangan bulat atau bilangan kompleks sebanyak yang Anda inginkan. Jika Anda memilih mengambil angka sebagai poin karakter atau cara lain yang masuk akal, Anda harus menunjukkan bahwa Anda melakukannya dalam jawaban Anda. Jika Anda memilih untuk membatasi domain fungsi Anda, Anda juga harus menunjukkan domain terbatas dalam jawaban Anda.
Anda kemudian akan mempresentasikan program pertama dalam bentuk jawaban dengan inversi kiri tersembunyi untuk ditemukan oleh perampok.
Program yang ditampilkan harus menerapkan fungsi injeksi (jika tidak, jawaban tersembunyi tidak mungkin ada).
Jika jawaban Anda belum retak dalam satu minggu, Anda dapat mengungkapkan jawaban yang tersembunyi dan menandainya sebagai aman . Jawaban aman tidak dapat dipecahkan oleh perampok dan akan tetap tidak terpecahkan tanpa batas.
Tujuannya adalah untuk membuat jawaban terputus-putus dalam bytes.
Contoh
Anda bisa menampilkan program python berikut yang menambahkan satu ke input
lambda x:~-x
Sebuah solusi bisa berupa:
lambda x:-~x
Ini mengurangi satu dari input
sumber
Jawaban:
Python 3, 80 byte ( Retak )
Domain: bilangan bulat positif. Fungsinya hanya mengkuadratkan angka. Input ke stdin, output ke stdout, serta dalam fungsi terbalik. Perhatikan bahwa Python mengabaikan baris ketiga di sini, karena secara sintaksis valid dan 1 sudah menjadi nilai yang benar, sehingga Python bahkan tidak melihat apakah bagian kanan 'atau' didefinisikan dengan baik.
Perampok harus menulis fungsi sqrt yang akan bekerja dengan benar pada semua kotak non-nol, mencetak nilai integer apa adanya, tanpa floating point (jadi pada input '4' output harus '2' atau '2 \ n', bukan '2.0' atau '2.0 \ n').
sumber
Python 3, 46 byte, retak
Menggandakan input.
sumber
/
juga divisi float.7 , 9 byte, Retak
Program ini penuh dengan karakter yang tidak dapat dicetak, jadi inilah hexdump:
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
dan7
hanyalah2
untuk5
tidak), nomor unbolded mewakili lolos setara mereka (0
untuk5
, yang semuanya representable dalam program asli; catatan yang0
lolos6
dan1
yang lolos7
):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
dan7
). 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):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:
Dengan kata lain, ini sebagian besar hanya sekelompok instruksi I / O. Mari kita analisis ini secara terperinci:
73
buang73363
yang masih ada di atas tumpukan.3
keluaran023
, dan buang34662
. Dengan demikian dapat dilihat bahwa34662
ini adalah komentar, yang digunakan untuk menyimpan byte yang diperlukan dalam versi lain dari program. Adapun apa yang023
dilakukan ketika output, ia memilih I / O format 0 (integer), kemudian23
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 ini7
) akan menjadi7777777777
. Jadi, kami menerima input dari pengguna dalam desimal, tetapi disimpan sebagai unary.6
keluar dari elemen stack atas (mengubah setiap instance7
menjadi1
; ini adalah bagaimana string yang seluruhnya terdiri dari7
s diloloskan), kemudian menambahkannya ke elemen stack sebelum (772
). Jadi data kami sekarang seperti ini7721111111111
.3
menampilkan elemen tumpukan yang dipertanyakan (dan muncul elemen tumpukan kosong yang merupakan bagian dari tumpukan awal default). Nilainya dihitung dengan mengambil jumlah1
s dan7
s, dan mengurangi jumlah0
s dan6
s. (Di2
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
ke00
, sehingga kita mengawali karakter untuk input yang membuatnya 2 lebih rendah, daripada 2 lebih tinggi. Ada00
delapan digit oktal yang tersembunyi lebih jauh di dalam program (sehingga digit dan byte oktal berbaris satu sama lain), jadi kita bisa menukarnya dengan11
di awal.sumber
JavaScript (ES6), 21 byte, Retak
Ini mudah.
Mengembalikan kubus input.
sumber
Python 2, 83 byte, retak
Ini mirip dengan jawaban saya yang lain. Namun, ini menggunakan RSA 64-bit, dan secara kriptografis cukup lemah. Jika Anda dapat merampok jawaban ini, Anda secara teoritis dapat merampok jawaban saya yang lain, diberikan waktu yang cukup.
sumber
Python 2, 47 byte, Retak
Domain untuk fungsi ini adalah {x ∈ ℤ | x> 0}. Ini kuadrat inputnya.
nmjcman101 menemukan solusi yang dimaksud:
sumber
JavaScript (ES6), 46 byte, Retak
Fungsi ini mengembalikan di
ln(x+1)
manax
angka non-negatif.Pemakaian
Catatan: Karena sifat angka floating point
f(g(x))
mungkin tidak persis samax
. Contoh:f(g(4))=3.9999999999999996
sumber
J, 8 byte, retak
Satu lagi yang sederhana untuk memulai.
Menggandakan input.
sumber
Memproses.js, 59 byte, Retak!
Fungsi ini mengalikan input dengan
204
(17*-4*-3=204
). Dibutuhkan int sebagai input dan output float. Seperti yang diharapkan, invers membagi input dengan204
.Juru bahasa online untuk pemrosesan-js dapat ditemukan di sini .
sumber
J, 10 byte, retak
Satu lagi yang sederhana. Pengembalian n 2 -1.
sumber
JavaScript (ES6), 15 byte, dipecahkan oleh Emigna
Anda dapat mengujinya seperti:
Retak
Solusi yang saya maksudkan sedikit berbeda dari celah Emigna:
sumber
J , 29 byte ( Cracked by miles)
Ini adalah kata kerja yang mengambil bilangan bulat positif sebagai input, dan melakukan hal berikut:
Cobalah online!
Solusi saya
Logikanya hampir sama dengan di celah. Konjungsi peringkat
"
dapat macet di banyak tempat yang berbeda (dan saya menggunakannya untuk menyingkirkan yang tidak perlu0
dan3
), karena itu tidak benar-benar melakukan apa pun dalam solusi.sumber
Memproses (java), 59 byte, AMAN
Fungsi ini mengalikan input dengan
204
(17*-4*-3=204
). Dibutuhkan int sebagai input dan output float. Seperti yang diharapkan, invers membagi input dengan204
. Catatan: kedua program mengambil int sebagai input dan output float.Jawaban ini persis sama dengan jawaban saya yang lain, kecuali bahwa jawaban saya yang lain ditulis dalam Processing.js. Bertemu Processing-java, sepupu Java yang kurang banyak bicara. Anda dapat mengunduh Pemrosesan di sini di processing.org.
Retaknya
Program ini membagi argumen dengan
204
. Tapi bagaimana caranya? Mari kita masuk ke dalam fungsi.Cukup sederhana, tetapi bagaimana
blue( get(0, 0) )
jadinya204
? Ini adalah inti dari pengajuan ini. Pertama-tama,get(0,0)
dapatkan warna dari piksel yang terletak di(0,0)
(sudut kiri atas jendela, yang selalu terbuka dalam sketsa Pemrosesan). Selanjutnya,blue()
dapatkan nilai biru dari piksel itu, yaitu204
!Untuk mendapatkan kiriman ini, saya bereksperimen dengan mencetak atribut berbeda dari warna yang diperoleh
get(0,0)
. Saya telah menemukan bahwa merah, hijau, biru, nilai-nilai alpha adalah204
,204
,204
dan255
masing-masing. Dari sini, saya memutuskan untuk melakukan operasi sederhana dengan nomor ini dan berakhir dengan posting ini.sumber
JavaScript (ES6), 63 byte Retak oleh Ilmari Karonen
Waktunya untuk
atob
omong kosong. Fungsi ini mengembalikan dix*x+1
manax
angka non-negatif.Pemakaian
Dimaksudkan
Ada sejumlah besar solusi potensial, tetapi saya berharap bahwa karakter utama akan membuang urutan byte yang cukup untuk membuat ini lebih sulit. C'est la
atob
sumber
Brain-Flak , 26 byte, Retak
Asli
Retak saya
Retak 1000000000
sumber
Python 2, 225 byte, dipecahkan oleh Sp3000
Domain dari fungsi ini adalah [0, n), di mana n adalah angka besar di atas. Ya, fungsi ini tidak dapat dibalik di domain ini. Dan kecuali saya kacau, melanggar jawaban ini sama sulitnya dengan melanggar 512 bit RSA.
sumber
J, 15 byte
Mengambil bilangan bulat non-negatif n , mengubahnya menjadi daftar angka biner, dan menggabungkan angka-angka itu sebagai angka dasar 10.
Cobalah online!
sumber