Questo numero è casuale?


18

Ho chiesto a random.org 128 interi casuali tra 0 e 2 32 - 1. Dato che il generatore di numeri casuali era così ansioso di dare prima i primi 64 numeri, sono ovviamente più casuali degli altri 64.

Scrivi un programma o una funzione completi che restituiscono un risultato veritiero quando viene immesso uno dei seguenti 64 numeri interi:

[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]

E un risultato falso per gli altri 64 numeri:

[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]

Qualsiasi input diverso da uno di questi 128 numeri è un comportamento indefinito.

Se la tua soluzione viene trovata a livello di codice, condividi anche il codice utilizzato per generarla!

Questo è , quindi vince la soluzione più breve in byte.


19
Dato che il generatore di numeri casuali ha dato prima i primi 64 numeri, devono essere più casuali ಠ ___ ಠ
Luis Mendo

Puoi distinguere i due set modulo 834
CalculatorFeline

1
Quei numeri non sono casuali.
CalcolatriceFeline

"Maybe, not enough information."&33 byte, risponde alla domanda.
CalculatorFeline

3
@CatsAreFluffy In realtà, purché l'input non contenga 0 o 1 e non vi siano due elementi diversi per 1, è possibile separarli da una catena di moduli. ad es. la separazione [4 20 79]da [8 18 100]può essere eseguita da [99 79 20 17 7 4](vedere se è possibile individuare il motivo). Certo, la metà iniziale della tua risposta potrebbe usare un modulo molto più piccolo dell'input, ma la metà posteriore consiste nello spostare un elemento alla volta.
Sp3000,

Risposte:


11

CJam, 53 52 47 byte

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

Ci sono non stampabili, ma le due stringhe possono essere ottenute da

[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

rispettivamente. Ciò dimostra anche che i punti di codice sono inferiori a 256.

Questa è una risposta a catena modulo, in cui applichiamo i seguenti moduli all'intero di input, nell'ordine:

[1153 629 512 378 242 136]

Poiché questo elenco contiene numeri interi maggiori di 255, l'elenco viene codificato utilizzando due caratteri ciascuno. La decodifica viene eseguita da 2/Dfb, che divide la stringa in blocchi di lunghezza due e converte ciascuno da un numero di base 13 (ad es 88*13 + 9 = 1153.). Tuttavia, ci sono due eccezioni alla decodifica:

  • L'ultimo numero ( 136) non è incluso (vedi sotto),
  • Il penultimo numero è rappresentato da un singolo carattere, poiché il numero ( 242) è inferiore a 256 e la divisione di un array di lunghezza dispari in blocchi di dimensione 2 lascerà un array di dimensione 1 alla fine. Grazie a @ MartinBüttner per questo suggerimento!

Una volta che i moduli hanno ridotto il numero intero di input a un numero relativamente piccolo, eseguiamo una ricerca da una tabella. Questa tabella viene codificata tramite la seconda stringa, che viene convertita in un 312numero di base, quindi decodificata in base 2, che indicizziamo. Poiché il wrapping dell'indicizzazione dell'array di CJam, possiamo tralasciare il modulo finale come menzionato in precedenza.

Provalo online | Suite di test


1
Come state inventando i moduli magici?
Calcolatrice

@CatsAreFluffy Solo un semplice DFS con un limite al numero di moduli. La mia attuale implementazione è piuttosto lenta, quindi se sento che il programma è bloccato per un po 'provo un diverso punto di partenza iniziale.
SP3000

Che cos'è un DFS? (Wikipedia non aiuta.)
CalculatorFeline

@CatsAreFluffy Profondità prima ricerca
Sp3000

Ah. Ho appena usato un algoritmo greedy.
CalcolatriceFeline


2

JavaScript (ES6) 233

Una funzione anonima che restituisce 0 as falsye diverso da zerotruthy

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

Verifica delle ultime 3 cifre nella rappresentazione numerica nella base 36.

La stringa di controllo è costruito in modo:

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

Test

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

Per qualsiasi motivo, esiste un insieme di moduli che ci consente di distinguere due insiemi solo se, dopo aver applicato i moduli, il risultato è zero o no. La lunga lista di moduli è stata generata da questo programma:

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]}}
 ]

Prima uscita è i moduli, secondo e terzo uscite sono le due liste, aver applicato il moduli. Le due lunghe liste sono i set.


2
Probabilmente puoi comprimere una parte dell'elenco in una stringa.
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)

Un approccio un po 'diverso, quindi ho pensato di pubblicarlo. Non vincerà il più breve, ma potrebbe dare a qualcun altro le idee per abbreviare il proprio codice.

Stiamo ancora prendendo il numero intero di input $args[0]e applicando le operazioni del modulo ad esso, quindi niente di diverso lì. In quanto sopra, stiamo usando l' -inoperatore (quindi v3 + requisito), quindi questo verrà emesso Trueper i valori che sono nel vero caso di test.

Tuttavia, sto cercando di trovare array risultanti in cui possiamo sfruttare la ..funzione range per accorciare il conteggio dei byte, ma ho ancora array distinti tra i valori di verità e falsità. Possiamo farlo poiché un comportamento diverso dall'input di verità / falsità non è definito, quindi se l'intervallo rileva valori al di fuori dell'input di verità / falsità, non importa l'output.

Finora è un processo piuttosto manuale, poiché l'obiettivo è quello di provare a trovare il modulo in cui uno degli array di verità o falsità ha uno o più spazi tra i numeri e l'altro array ha grandi quantità di numeri in quello spazio. Ho seguito per lo più l'intuizione e l'intestino mi sento così lontano, ma alla fine potrei scrivere un bruto-forcer per risolvere questo. Quanto sopra è il più breve che abbia trovato (principalmente manualmente) finora.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.