Apakah angka ini acak?


18

Saya meminta random.org untuk 128 bilangan bulat acak antara 0 dan 2 32 - 1. Karena generator angka acak sangat ingin memberikan 64 angka pertama terlebih dahulu, mereka jelas lebih acak daripada 64 lainnya.

Tulis program atau fungsi lengkap yang mengembalikan hasil yang benar ketika salah satu dari 64 integer berikut adalah input:

[1386551069, 1721125688, 871749537, 3410748801, 2935589455, 1885865030, 776296760, 614705581, 3841106923, 434616334, 1891651756, 1128215653, 256582433, 310780133, 3971028567, 2349690078, 489992769, 493183796, 3073937100, 3968540100, 777207799, 515453341, 487926468, 2597442171, 950819523, 1881247391, 3676486536, 3852572850, 3498953201, 2544525180, 297297258, 3783570310, 2485456860, 2866433205, 2638825384, 2405115019, 2734986756, 3237895121, 1560255677, 4228599165, 3106247743, 742719206, 2409129909, 3008020402, 328113612, 1081997633, 1583987616, 1029888552, 1375524867, 3913611859, 3488464791, 732377595, 431649729, 2105108903, 1454214821, 997975981, 1764756211, 2921737100, 754705833, 1823274447, 450215579, 976175934, 1991260870, 710069849]

Dan hasil pemalsuan untuk 64 nomor lainnya:

[28051484, 408224582, 1157838297, 3470985950, 1310525292, 2739928315, 3565721638, 3568607641, 3857889210, 682782262, 2845913801, 2625196544, 1036650602, 3890793110, 4276552453, 2017874229, 3935199786, 1136100076, 2406566087, 496970764, 2945538435, 2830207175, 4028712507, 2557754740, 572724662, 2854602512, 736902285, 3612716287, 2528051536, 3801506272, 164986382, 1757334153, 979200654, 1377646057, 1003603763, 4217274922, 3804763169, 2502416106, 698611315, 3586620445, 2343814657, 3220493083, 3505829324, 4268209107, 1798630324, 1932820146, 2356679271, 1883645842, 2495921085, 2912113431, 1519642783, 924263219, 3506109843, 2916121049, 4060307069, 1470129930, 4014068841, 1755190161, 311339709, 473039620, 2530217749, 1297591604, 3269125607, 2834128510]

Input apa pun selain salah satu dari 128 angka ini adalah perilaku yang tidak terdefinisi.

Jika solusi Anda ditemukan secara terprogram, silakan juga bagikan kode yang digunakan untuk menghasilkannya!

Ini adalah , jadi solusi terpendek dalam byte menang.


19
Karena generator angka acak memberikan 64 angka pertama terlebih dahulu, mereka harus lebih acak ಠ ___ ಠ
Luis Mendo

Anda dapat membedakan dua set modulo 834
CalculatorFeline

1
Angka-angka itu tidak acak.
CalculatorFeline

"Maybe, not enough information."&33 byte, jawab pertanyaannya.
CalculatorFeline

3
@CatsAreFluffy Sebenarnya, selama input tidak mengandung 0 atau 1 dan tidak ada dua elemen berbeda dengan 1, Anda dapat memisahkannya dengan rantai modulo. mis memisahkan [4 20 79]dari [8 18 100]dapat dilakukan oleh [99 79 20 17 7 4](lihat apakah Anda dapat menemukan polanya). Tentu, bagian awal dari jawaban Anda mungkin menggunakan modulo yang jauh lebih kecil daripada input, tetapi bagian belakang terdiri dari pengalihan satu elemen pada satu waktu.
Sp3000

Jawaban:


11

CJam, 53 52 47 byte

l~"X    0'ò"2/Dfb+:%"gÇâì6Ô¡÷Ç8nèS¡a"312b2b=

Ada yang tidak diinginkan, tetapi dua string dapat diperoleh

[88 9 48 5 39 5 29 1 242]:c
[8 103 199 226 236 54 212 15 161 247 199 56 110 232 83 161 97]:c

masing-masing. Ini juga menunjukkan bahwa titik kode di bawah 256.

Ini adalah jawaban berantai modulo, tempat kami menerapkan modulos berikut ke integer input, secara berurutan:

[1153 629 512 378 242 136]

Karena daftar ini berisi bilangan bulat lebih besar dari 255, daftar dikodekan menggunakan dua karakter masing-masing. Penguraian dilakukan oleh 2/Dfb, yang membagi string menjadi potongan-potongan dengan panjang dua dan mengkonversi masing-masing dari nomor basis 13 (misalnya 88*13 + 9 = 1153). Namun, ada dua pengecualian untuk decoding:

  • Angka terakhir ( 136) tidak termasuk (lihat di bawah),
  • Angka kedua-terakhir diwakili oleh char tunggal, karena angka ( 242) kurang dari 256 dan memecah array panjang-aneh menjadi potongan-potongan ukuran 2 akan meninggalkan array ukuran 1 di akhir. Terima kasih kepada @ MartinBüttner untuk tip ini!

Setelah modulos mengurangi integer input ke jumlah yang relatif kecil, kami melakukan pencarian dari sebuah tabel. Tabel ini dikodekan melalui string kedua, yang dikonversi ke 312nomor basis kemudian diterjemahkan ke basis 2, yang kami indeks. Karena array indexing CJam membungkus, kita dapat meninggalkan modulo final seperti yang disebutkan sebelumnya.

Cobalah online | Suite uji


1
Bagaimana kalian membuat moduli ajaib?
CalculatorFeline

@CatsAreFluffy Hanya DFS sederhana dengan batas jumlah modulos. Implementasi saya saat ini cukup lambat, jadi jika saya merasa seperti program macet untuk sementara saya mencoba titik awal awal yang berbeda.
Sp3000

Apa itu DFS? (Wikipedia tidak membantu.)
CalculatorFeline

@CatsAreFluffy Pencarian pertama yang
mendalam

Ah. Saya hanya menggunakan algoritma serakah.
CalculatorFeline


2

JavaScript (ES6) 233

Fungsi anonim mengembalikan 0 sebagai falsydan bukan nol sebagaitruthy

x=>~"lnhp2wm8x6m9vbjmrqqew9v192jc3ynu4krpg9t3hhx930gu8u9n1w51ol509djycdyh077fd1fnrzv6008ipkh0704161jayscm0l6p4ymj9acbv5ozhjzxo3j1t20j9beam30yptco033c9s3a8jwnre63r29sfbvc5371ulvyrwyqx3kfokbu66mpy9eh" // newline added for readability
.search((x.toString(36)).slice(-3))

Memeriksa 3 digit terakhir dalam representasi angka dalam basis 36.

String cek dibuat demikian:

a=[1386551069, 1721125688, ... ]
H=x=>(x.toString(36)).slice(-3)
Q=a.map(x=>H(x)).join('')

Uji

f=x=>~"lnhp2wm8x6m9vbjmrqqew9v192jc3ynu4krpg9t3hhx930gu8u9n1w51ol509djycdyh077fd1fnrzv6008ipkh0704161jayscm0l6p4ymj9acbv5ozhjzxo3j1t20j9beam30yptco033c9s3a8jwnre63r29sfbvc5371ulvyrwyqx3kfokbu66mpy9eh"
.search((x.toString(36)).slice(-3))

a=[1386551069, 1721125688, 871749537, 3410748801, 2935589455, 1885865030, 776296760, 614705581, 3841106923, 434616334, 1891651756, 1128215653, 256582433, 310780133, 3971028567, 2349690078, 489992769, 493183796, 3073937100, 3968540100, 777207799, 515453341, 487926468, 2597442171, 950819523, 1881247391, 3676486536, 3852572850, 3498953201, 2544525180, 297297258, 3783570310, 2485456860, 2866433205, 2638825384, 2405115019, 2734986756, 3237895121, 1560255677, 4228599165, 3106247743, 742719206, 2409129909, 3008020402, 328113612, 1081997633, 1583987616, 1029888552, 1375524867, 3913611859, 3488464791, 732377595, 431649729, 2105108903, 1454214821, 997975981, 1764756211, 2921737100, 754705833, 1823274447, 450215579, 976175934, 1991260870, 710069849]
b=[28051484, 408224582, 1157838297, 3470985950, 1310525292, 2739928315, 3565721638, 3568607641, 3857889210, 682782262, 2845913801, 2625196544, 1036650602, 3890793110, 4276552453, 2017874229, 3935199786, 1136100076, 2406566087, 496970764, 2945538435, 2830207175, 4028712507, 2557754740, 572724662, 2854602512, 736902285, 3612716287, 2528051536, 3801506272, 164986382, 1757334153, 979200654, 1377646057, 1003603763, 4217274922, 3804763169, 2502416106, 698611315, 3586620445, 2343814657, 3220493083, 3505829324, 4268209107, 1798630324, 1932820146, 2356679271, 1883645842, 2495921085, 2912113431, 1519642783, 924263219, 3506109843, 2916121049, 4060307069, 1470129930, 4014068841, 1755190161, 311339709, 473039620, 2530217749, 1297591604, 3269125607, 2834128510]

A.textContent=a.map(x=>f(x))
B.textContent=b.map(x=>f(x))
<table>
  <tr><th>first 64 - truthy</th></tr><tr><td id=A></td></tr>
  <tr><th>other 64 - falsy</th></tr><tr><td id=B></td></tr>
</table>  


1

Mathematica, 218 217 byte

Fold[Mod,#,{834,551,418,266,228,216,215,209,205,199,198,195,178,171,166,162,154,151,146,144,139,137,122,120,117,114,110,106,101,98,95,88,84,67,63,61,60,57,55,51,45,44,43,41,40,35,34,30,27,26,25,23,20,14,13,11,10,9}]<1

Untuk alasan apa pun, satu set moduli ada yang memungkinkan kita untuk membedakan dua set hanya dengan apakah atau tidak, setelah menerapkan moduli, hasilnya nol atau tidak. Daftar panjang moduli dihasilkan oleh program ini:

Block[{data1, data2, n, mods}, 
 data1 = {1386551069, 1721125688, 871749537, 3410748801, 2935589455, 
   1885865030, 776296760, 614705581, 3841106923, 434616334, 
   1891651756, 1128215653, 256582433, 310780133, 3971028567, 
   2349690078, 489992769, 493183796, 3073937100, 3968540100, 
   777207799, 515453341, 487926468, 2597442171, 950819523, 1881247391,
    3676486536, 3852572850, 3498953201, 2544525180, 297297258, 
   3783570310, 2485456860, 2866433205, 2638825384, 2405115019, 
   2734986756, 3237895121, 1560255677, 4228599165, 3106247743, 
   742719206, 2409129909, 3008020402, 328113612, 1081997633, 
   1583987616, 1029888552, 1375524867, 3913611859, 3488464791, 
   732377595, 431649729, 2105108903, 1454214821, 997975981, 
   1764756211, 2921737100, 754705833, 1823274447, 450215579, 
   976175934, 1991260870, 710069849};
 data2 = {28051484, 408224582, 1157838297, 3470985950, 1310525292, 
   2739928315, 3565721638, 3568607641, 3857889210, 682782262, 
   2845913801, 2625196544, 1036650602, 3890793110, 4276552453, 
   2017874229, 3935199786, 1136100076, 2406566087, 496970764, 
   2945538435, 2830207175, 4028712507, 2557754740, 572724662, 
   2854602512, 736902285, 3612716287, 2528051536, 3801506272, 
   164986382, 1757334153, 979200654, 1377646057, 1003603763, 
   4217274922, 3804763169, 2502416106, 698611315, 3586620445, 
   2343814657, 3220493083, 3505829324, 4268209107, 1798630324, 
   1932820146, 2356679271, 1883645842, 2495921085, 2912113431, 
   1519642783, 924263219, 3506109843, 2916121049, 4060307069, 
   1470129930, 4014068841, 1755190161, 311339709, 473039620, 
   2530217749, 1297591604, 3269125607, 2834128510};
 n = 1;
 mods = {};
 While[Intersection[Mod[data1, n], Mod[data2, n]] != {}, n++];
 FixedPoint[
  (mods = Append[mods, n]; data1 = Mod[data1, n]; 
    data2 = Mod[data2, n]; n = 1;
    While[Intersection[Mod[data1, n], Mod[data2, n]] != {}, n++]; 
    n) &
  , n];
 {mods, {Fold[Mod, data1, mods], Fold[Mod, data2, mods]}}
 ]

Output pertama adalah moduli, output kedua dan ketiga adalah dua daftar, setelah menerapkan moduli. Dua daftar panjang adalah set.


2
Anda mungkin dapat mengompres bagian daftar menjadi string.
njpipeorgan

1

PowerShell, v3 + 194 byte

$args[0]%834%653-in(40..45+4,8,12,51,60,64,69,76,84,86,93,97,103,117+137..149+160,162,178+195..209+215..227+255,263+300..329+354,361,386,398,417,443,444+469..506+516,519,535,565,581,586,606,618)

Sedikit pendekatan yang berbeda, jadi saya pikir saya akan mempostingnya. Ini tidak akan menang sesingkat mungkin, tetapi mungkin memberikan ide kepada orang lain untuk mempersingkat kode mereka.

Kami masih mengambil integer input $args[0]dan menerapkan operasi modulo, jadi tidak ada yang berbeda di sana. Dalam contoh di atas, kami menggunakan -inoperator (maka persyaratan v3 +) sehingga ini akan menampilkan Truenilai yang ada dalam kasus uji kebenaran.

Namun, saya mencoba untuk menemukan array yang dihasilkan di mana kita dapat memanfaatkan ..fungsi rentang untuk mempersingkat jumlah byte, namun masih memiliki array yang berbeda antara nilai-nilai yang benar dan palsu. Kita bisa melakukan ini karena perilaku selain input truey / falsey tidak terdefinisi, jadi jika rentang menangkap nilai di luar input truey / falsey, itu tidak masalah output.

Ini adalah proses yang cukup manual sejauh ini, karena tujuannya adalah untuk mencoba dan menemukan modulo di mana salah satu array yang benar atau salah memiliki kesenjangan besar antara angka dan array lainnya memiliki jumlah angka yang besar di celah itu. Sebagian besar saya telah pergi dengan intuisi dan naluri merasa sejauh ini, tetapi saya mungkin akhirnya menulis brute-forcer untuk menyelesaikan ini. Di atas adalah yang terpendek yang saya (kebanyakan manual) temukan sejauh ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.