Dua-Banyak Keluaran

17

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:

  1. Rutin dapat ditulis dalam bahasa apa pun tetapi tidak boleh melebihi 320 byte.
  2. 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.
  3. Rutin harus menampilkan satu bilangan bulat 32-bit yang sudah ditandatangani.
  4. 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:

  1. Rutin harus sepenuhnya deterministik dan waktu-invarian, mengembalikan output yang identik untuk input yang identik. Rutin seharusnya tidak membuat panggilan ke generator nomor pseudorandom.
  2. 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.
  3. 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):

  1. CJam, 105 [Dennis]

Pasukan tak terhentikan (kerupuk):

  1. Dennis [ Jawa, 269 ; C, 58 ; Mathematica, 29 ]
  2. Martin Büttner [ Java, 245 ]
COTO
sumber
11
Bolehkah saya menyarankan [polisi dan perampok] sebagai tanda untuk tantangan ini? Saya pikir itu nama yang cukup mapan untuk game semacam itu di bidang keamanan dan itu mungkin akan memancing lebih banyak minat daripada [permusuhan].
Martin Ender
Tentu. Saya akan mengubahnya sekarang.
COTO
Output apa yang bisa diterima? STDOUT,, returndll ...
Ypnypn
2
Contoh Anda salah; tanda tangannya adalah 9.% 5 dapat mengembalikan apa pun dari -4 hingga 4, inklusif.
Keith Randall
1
@ Dennis saya akan baik-baik saja dengan Anda mencoba lagi. Adalah kesalahan saya bahwa itu kacau.
Stretch Maniac

Jawaban:

7

CJam, 105 byte

1q~]4G#b2A#md"M-k^XM-WHM-n^GM-0%M-uwM-gM-^XeM-kM-^VO^Ph,M-^MM-^PM-qM-!M-8M-AM-OM-~tM-^FM-cM-h^AM-0M-0M-lM-@M-^[MF=M-^Z^SM-1M-KM-T2M-9M-UmSM-N
M-8M-^^M-n$4M-^M^SM-x M-OM-^@^?"256b@D#Y256#%2+md!A3#*)%)%

Di atas menggunakan tanda sisipan dan M, karena mengandung karakter yang tidak patut dicetak. Setelah mengubah aliran byte menjadi integer ( 256b), kode berikut dijalankan:

1q~]4G#b2A#md
12313030820310059479144347891900383683119627474072658988524821209446180284434934346766561958060381533656780340359503554566598728599799248566073353154035839
@D#Y256#%2+md!A3#*)%)%

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.

" Prepend 1 to the numbers read from STDIN and convert the resulting array into an integer
  (“N”) by considering them digits of a base 2**32 number.                                 ";

1q~]4G#

" Compute “N / 1024” and “N % 1024”.                                                       ";

2A#md

" Push a carefully selected 512 bit semi-prime (“S”).                                      ";

12313030820310059479144347891900383683119627474072658988524821209446180284434934346766561958060381533656780340359503554566598728599799248566073353154035839

" Compute P = (N / 1024) ** 13 % 2 ** 256 + 2.                                             ";

@D#Y256#%2+

" Compute “S / P” and “S % P”.                                                             ";

md

" Compute “M = (S / P) % (1000 * !(S % P) + 1) + 1”.

  “M” is the key if P is a divisor of S; otherwise, “M == 1”.                              ";

!A3#*)%)

" Compute the final output: “N % 1024 % M”.                                                ";

%

Contoh dijalankan

$ base64 -d > outputs.cjam <<< MXF+XTRHI2IyQSNtZCLrGNdI7gewJfV355hl65ZPEGgsjZDxobjBz/50huPoAbCw7MCbTUY9mhOxy9QyudVtU84KuJ7uJDSNE/ggz4B/IjI1NmJARCNZMjU2IyUyK21kIUEzIyopJSkl
$ wc -c outputs.cjam
105 outputs.cjam
$ LANG=en_US cjam outputs.cjam < outputs.secret; echo
1
$ LANG=en_US cjam outputs.cjam <<< '1 2 3'; echo
0
Dennis
sumber
Anda terlalu baik dengan hal-hal enkripsi. ;)
COTO
11
"Kiriman ini menggunakan teori bilangan alih-alih kebingungan." Melihat kode "Hmm, benar."
ɐɔıʇǝɥʇuʎ
4

Jawa - 269

Terima kasih atas kesabaran semua orang, ini sekarang harus diperbaiki.

dipersingkat:

int a(int a,int b,int c){double d=180-360.0/(int)(Math.abs(Math.sin(a*60))*50+2),e=180-360.0/(int)(Math.abs(Math.cos(b*60))*50+2),f=180-360.0/(int)(Math.atan2(c*60, a*60)*51+2);if(Math.abs(d+e+f-360)<.1)return Integer.valueOf((int)d+""+(int)e+""+(int)f);else return 1;}

Tidak disingkat:

int a(int a, int b, int c) {
    double d = 180 - 360.0 / (int) (Math.abs(Math.sin(a * 60)) * 50 + 2);
    double e = 180 - 360.0 / (int) (Math.abs(Math.cos(b * 60)) * 50 + 2);
    double f = 180 - 360.0 / (int) (Math.atan2(c * 60, a * 60) * 51 + 2);
    if (Math.abs(d + e + f - 360) < .1)
        return Integer.valueOf((int) d + "" + (int) e + "" + (int) f);
    else
        return 1;
}
Regangkan Maniac
sumber
Anda dapat menyimpan empat karakter dengan mengubah double e,f,d=...;e=...;f=...;kedouble d=...,e=...,f=...;
Ypnypn
@Ypnypn Terima kasih! ditambahkan ke versi golf.
Stretch Maniac
1
Upaya kedua ( dengan izin eksplisit ): 122
Dennis
1
@Dennis kerja bagus! (Hanya itu)
Stretch Maniac
1
@ Dennis Dalam hal itu, Anda lupa 1dan jawaban Anda juga salah;) (123 benar ... seseorang datang dan mengambil skor retak ...). Dan saya kira Stretch Maniac tidak menjelaskan sin == 1.0ketika dia mengatakan bahwa 122 itu benar.
Martin Ender
2

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) :

function z(y,_,$){M=[];N=[];O=[];C=1792814437;P=72;r=t=0;(f=function(a,k,L){if(k<a.length){for(L=a[k],a[k]=0;a[k]<L;a[k]++)f(a,k+1)}else
if(!t){f([P-1,P-1],0,++t);N=M;while(t<2*P){s=!(t&1);f([P,P,P,P],0,++t);r=r||(s?0:t);t&1&&(N=O);O=[]}}else
((t<2)&&(((d=P*a[0]+(P+1)*a[1]+P)<(P<<6))&&(M[d]=(((y^~_)>>a[0])+((_^~$)>>(a[0]-32)))&1),((a[1]<P-a[0])&&
(M[a[1]+(P+1)*a[0]]=(($^C)>>a[0]+16-a[1])&1))||1))||((t&1)&&((O[P*a[2]+a[3]]|=M[a[1]+P*a[2]]&N[P*a[0]+a[3]]&&
!(a[0]-a[1]))||1))||(s|=N[(a[0]+1)*a[1]+a[3]]);})([],0,0);return r;}

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.

COTO
sumber
1
Anda harus memberikan hadiah untuk itu!
Orby
1
@Orby Itu bagus, tapi sulit untuk memberikan hadiah untuk komentar.
Geobits
@COTO apakah masih ada tantangan ini?
Soham Chowdhury
@SohamChowdhury: Tentu saja. Jika Anda mengetahuinya, saya akan menguraikan kemenangan Anda di OP. Jika tidak, beri tahu saya dan saya akan mengirimkan solusinya.
COTO
2

C, 58 byte (Retak)

Yang sederhana:

f(a,b,c){return(long long)a*b*c-0x1d21344f8479d61dLL?0:a;}
Orby
sumber
2
7 ( -15485867, -1299721, -104287, 0, 104287, 1299721, 15485867).
Dennis
Itu cepat :)
Orby
2

Jawa - 245

Retak oleh Martin Büttner

int a(int[]_$){return $($($_(_$[0],0)))+$_(_$[1],1)*11+$($($_(_$[1+1],0)))*(1+1);}int $_(int $,int $_){int OO=0,o=1,O=1;for($=$<0?-$:$;++O*O<=$;OO+=$%O<1?O:0,o+=$%O<1?1:0,$/=$%O<1?O--:1);return $_>0?o:OO+$;}int $(int $){return(int)Math.sqrt($);}

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:

int a(int[]_$){return $($($_(_$[0],0)))+$_(_$[1],
1)*11+$($($_(_$[1+1],0)))*(1+1);}int $_(int $,int
$_){int OO=0,o=1,O=1;for($=$<0?-$:$;++O*O<=$;OO+=
$%O<1?O:0,o+=$%O<1?1:0,$/=$%O<1?O--:1);return $_>
0?o:OO+$;}int $(int $){return(int)Math.sqrt($);}
Geobit
sumber
Hanya dari bruteforcing ... 90?
Vektor
@bitpwner Tidak, maaf.
Geobits
1
Saya deobfuscated sedikit: pastebin.com/8pvvfFYB (Saya harap saya tidak membuat kesalahan saat mengganti nama variabel.)
Martin Ender
4
Oke, ini usahaku: 965?
Martin Ender
1
@ MartinBüttner Benar. Terima kasih untuk versi yang membingungkan: D
Geobits
1

Mathematica, 29 bytes, Key: 715, Cracked oleh Dennis

Ini hanya versi tetap dari jawaban awal saya, yang tidak berfungsi untuk input non-positif.

f=Plus@@Mod[NextPrime@#,240]&

Mengambil daftar bilangan bulat seperti

f[{1,2,3}]
Martin Ender
sumber
Saya menemukan 349output yang unik. Kisarannya dari 3hingga 717.
PhiNotPi
@PhiNotPi Salah. (Saya mengecek ulang)
Martin Ender
Yah, saya menemukan kesalahan saya dan jawaban yang tepat. Terlambat.
PhiNotPi
1
Jika hal-hal yang saya kumpulkan bersama dari dokumentasi Mathematica dan WolframAlpha benar, kuncinya adalah 715 ( 3 ... 717).
Dennis
2
Mathematica terlihat seperti bahasa yang bagus, tapi terlalu mahal atau terlalu murah ...
Dennis
0

207 karakter, dalam C / C ++, belum dikaburkan:

int x(int a, int b, int c) {
    int d, e, f;
    for (int i=0; i!=1<<31; ++i) {
        d=10*(b-a);
        e=a*(28-c)-b;
        f=a*b-2.7*c;
        a += d;
        b += e;
        c += f;
    }
    return ((a%5+5)*10+(b%5+5))*10+c%5+5;
}
ldgabbay
sumber
Hanya mencoba keberuntunganku ... 729.
Vektor
@bitpwner Sial, aku hanya akan mengatakan itu. : D ... Jika itu salah, itu batas atas.
Martin Ender
2
Ini bukan pengiriman yang valid. Semua tugas di dalam loop dapat mengakibatkan limpahan bilangan bulat yang ditandatangani , yang memiliki perilaku tidak terdefinisi.
Dennis