Tantangan
Saya mempersembahkan kepada Anda mata-mata lain vs obsesi pengadu mata-mata versus kerupuk. Namun dalam kasus ini, datum yang akan dilindungi bukanlah input tetapi output .
Aturan tantangannya sederhana. Tulis rutin dengan spesifikasi berikut:
- Rutin dapat ditulis dalam bahasa apa pun tetapi tidak boleh melebihi 320 byte.
- Rutin harus menerima tiga bilangan bulat bertanda 32-bit sebagai input. Ini dapat mengambil bentuk fungsi yang menerima 3 argumen, fungsi yang menerima array 3-elemen tunggal, atau program lengkap yang membaca 3 bilangan bulat dari input standar apa pun.
- Rutin harus menampilkan satu bilangan bulat 32-bit yang sudah ditandatangani.
- Dari semua input yang mungkin, rutin harus menghasilkan antara 2 dan 1000 (termasuk) nilai unik. Jumlah nilai unik yang bisa dihasilkan oleh rutin disebut kuncinya .
Sebagai contoh, program C.
int foo( int i1, int i2, int i3 ) {
return 20 + (i1^i2^i3) %5;
}
memiliki kunci dari 9, karena (mudah-mudahan) hanya bisa output nilai sembilan 16
, 17
, 18
, 19
, 20
, 21
, 22
, 23
, dan 24
.
Beberapa batasan tambahan adalah sebagai berikut:
- Rutin harus sepenuhnya deterministik dan waktu-invarian, mengembalikan output yang identik untuk input yang identik. Rutin seharusnya tidak membuat panggilan ke generator nomor pseudorandom.
- Rutin mungkin tidak bergantung pada "variabel tersembunyi" seperti data dalam file, variabel sistem, atau fitur bahasa esoterik. Misalnya, rutinitas umumnya tidak merujuk ke konstanta kecuali jika konstanta didefinisikan dengan jelas dalam kode itu sendiri. Rutin yang bergantung pada kebiasaan kompiler, output dari operasi yang tidak terdefinisi secara matematis, kesalahan aritmatika, dll. Juga sangat tidak disarankan. Jika ragu, harap tanyakan.
- Anda (pembuat kode) harus tahu persis berapa banyak output unik yang dapat dihasilkan oleh rutin, dan harus dapat memberikan setidaknya satu urutan input yang menghasilkan setiap output. (Karena berpotensi ada ratusan output unik, set ini hanya akan diminta jika kunci Anda diperebutkan.)
Karena masalah ini memiliki kemiripan yang jauh lebih sedikit dengan enkripsi klasik daripada yang sebelumnya, saya berharap ini akan dapat diakses oleh audiens yang lebih luas.
Semakin kreatif, semakin baik.
Skor
Pengajuan non-retak terpendek per byte byte akan dinyatakan sebagai pemenang.
Jika ada kebingungan, jangan ragu untuk bertanya atau berkomentar.
Counter-Challenge
Semua pembaca, termasuk mereka yang telah mengirimkan rutinitas mereka sendiri, didorong untuk "memecahkan" kiriman. Kiriman retak ketika kuncinya diposting di bagian komentar terkait. Jika kiriman bertahan selama 72 jam tanpa diubah atau di-crack, itu dianggap "aman" dan setiap keberhasilan selanjutnya dalam cracking itu akan diabaikan demi kontes.
Hanya satu upaya cracking per pengajuan per pembaca yang diizinkan. Misalnya, jika saya mengirim ke pengguna X: "kunci Anda adalah 20" dan saya salah, pengguna X akan menafikan tebakan saya sebagai salah dan saya tidak akan lagi dapat mengirimkan tebakan tambahan untuk pengiriman itu.
Pengajuan yang retak dihilangkan dari pertikaian (asalkan tidak "aman"). Tidak boleh diedit. Jika pembaca ingin mengirimkan rutinitas baru, ia harus melakukannya dalam jawaban yang terpisah.
Skor seorang cracker adalah jumlah pengajuan (baik yang memenuhi syarat atau tidak) yang dia crack. Untuk cracker dengan jumlah yang identik, peringkat ditentukan oleh jumlah byte total di semua pengiriman yang retak (semakin tinggi, semakin baik).
Para cracker dengan skor tertinggi akan dinyatakan sebagai pemenang bersama dengan para pengembang dari rutinitas yang menang.
Harap jangan merusak kiriman Anda sendiri.
Semoga berhasil. :)
Papan peringkat
Terakhir Diperbarui 2 September, 10:45 EST
Immovable Barriers (pengiriman tidak retak):
- CJam, 105 [Dennis]
Pasukan tak terhentikan (kerupuk):
- Dennis [ Jawa, 269 ; C, 58 ; Mathematica, 29 ]
- Martin Büttner [ Java, 245 ]
return
dll ...Jawaban:
CJam, 105 byte
Di atas menggunakan tanda sisipan dan M, karena mengandung karakter yang tidak patut dicetak. Setelah mengubah aliran byte menjadi integer (
256b
), kode berikut dijalankan:Anda dapat mencoba versi ini secara online di juru bahasa CJam .
Bagaimana itu bekerja
Pengajuan ini menggunakan teori bilangan alih-alih kebingungan. Program akan mengembalikan 0 untuk hampir semua input. Dari beberapa input yang menghasilkan output non-nol, sebuah modulus rahasia diturunkan yang diterapkan pada 10 bit paling tidak signifikan dari integer ketiga.
Cara paling efisien untuk menyelesaikan tantangan ini (yang dapat saya pikirkan) adalah memfaktorkan integer 512 bit, yang saya harap tidak akan dapat dicapai dalam 72 jam.
Contoh dijalankan
sumber
Jawa - 269
Terima kasih atas kesabaran semua orang, ini sekarang harus diperbaiki.
dipersingkat:
Tidak disingkat:
sumber
double e,f,d=...;e=...;f=...;
kedouble d=...,e=...,f=...;
1
dan jawaban Anda juga salah;) (123 benar ... seseorang datang dan mengambil skor retak ...). Dan saya kira Stretch Maniac tidak menjelaskansin == 1.0
ketika dia mengatakan bahwa 122 itu benar.A Sampler
Tentu saja bukan entri resmi, dan jumlah karakter terlalu tinggi, tetapi saya pikir jika ada yang menginginkan tantangan yang mematikan pikiran, mereka dapat mencoba menentukan berapa banyak output unik yang dihasilkan fungsi berikut (diberikan tiga input seperti yang dijelaskan dalam OP) :
Bahkan, saya sangat yakin bahwa itu tidak dapat dipecahkan, saya akan memberikan penghargaan kepada siapa pun yang menobatkannya sebagai "Penghargaan Kekuatan Alam Tertinggi yang Tak Terhentikan".
Karena sungguh, mereka layak mendapatkannya.
sumber
C, 58 byte (Retak)
Yang sederhana:
sumber
-15485867, -1299721, -104287, 0, 104287, 1299721, 15485867
).Jawa - 245
Retak oleh Martin Büttner
Pakan input sebagai array int:
a(new int[]{1,2,3})
. Saya tidak berharap untuk pergi 72 jam, tetapi bersenang-senang dengan itu.Ini dia dengan jeda baris, untuk membuatnya sedikit lebih mudah dibaca:
sumber
Mathematica, 29 bytes, Key: 715, Cracked oleh Dennis
Ini hanya versi tetap dari jawaban awal saya, yang tidak berfungsi untuk input non-positif.
Mengambil daftar bilangan bulat seperti
sumber
349
output yang unik. Kisarannya dari3
hingga717
.3 ... 717
).207 karakter, dalam C / C ++, belum dikaburkan:
sumber