¿Es este número al azar?

18

Le pedí a random.org 128 números enteros aleatorios entre 0 y 2 32 - 1. Como el generador de números aleatorios estaba tan ansioso por dar primero los primeros 64 números, obviamente son más aleatorios que los otros 64.

Escriba un programa o función completa que devuelva un resultado verdadero cuando se ingrese uno de los siguientes 64 enteros:

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

Y un resultado falso para los otros 64 números:

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

Cualquier entrada que no sea uno de estos 128 números es un comportamiento indefinido.

Si su solución se encuentra mediante programación, ¡también comparta el código utilizado para generarla!

Este es el , por lo que gana la solución más corta en bytes.

lirtosiast
fuente
19
Dado que el generador de números aleatorios dio primero los primeros 64 números, deben ser más aleatorios ಠ ___ ಠ
Luis Mendo
Puede distinguir los dos conjuntos módulo 834
CalculatorFeline
1
Esos números no son al azar.
CalculatorFeline
"Maybe, not enough information."&33 bytes, responde la pregunta.
CalculatorFeline
3
@CatsAreFluffy En realidad, siempre que la entrada no contenga 0 o 1 y no haya dos elementos diferentes en 1, puede separarlos por una cadena de módulos. por ejemplo, la separación [4 20 79]de [8 18 100]puede hacerse mediante [99 79 20 17 7 4](vea si puede detectar el patrón). Claro, la mitad inicial de su respuesta podría usar un módulo mucho más pequeño que la entrada, pero la mitad posterior consiste en cambiar un elemento a la vez.
Sp3000

Respuestas:

11

CJam, 53 52 47 bytes

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

No se pueden imprimir, pero las dos cadenas se pueden obtener mediante

[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

respectivamente. Esto también muestra que los puntos de código están por debajo de 256.

Esta es una respuesta de cadena de módulo, donde aplicamos los siguientes módulos al entero de entrada, en orden:

[1153 629 512 378 242 136]

Como esta lista contiene enteros mayores que 255, la lista se codifica utilizando dos caracteres cada uno. La decodificación se realiza mediante 2/Dfb, que divide la cadena en trozos de longitud dos y los convierte a partir de un número base 13 (p 88*13 + 9 = 1153. Ej .). Sin embargo, hay dos excepciones a la decodificación:

  • El último número ( 136) no está incluido (ver más abajo),
  • El penúltimo número está representado por un solo carácter, ya que el número ( 242) es menor que 256 y dividir una matriz de longitud impar en trozos de tamaño 2 dejará una matriz de tamaño 1 al final. ¡Gracias a @ MartinBüttner por este consejo!

Una vez que los módulos han reducido el número entero de entrada a un número relativamente pequeño, realizamos una búsqueda desde una tabla. Esta tabla se codifica a través de la segunda cadena, que se convierte en un 312número base y luego se decodifica en la base 2, que indexamos. Dado que la indexación de matriz de CJam se ajusta, podemos omitir el módulo final como se mencionó anteriormente.

Pruébalo en línea | Banco de pruebas

Sp3000
fuente
1
¿Cómo se les ocurre a los módulos mágicos?
CalculatorFeline
@CatsAreFluffy Solo un DFS simple con un límite en el número de módulos. Mi implementación actual es bastante lenta, por lo que si siento que el programa está atascado por un tiempo, intento un punto de partida inicial diferente.
Sp3000
¿Qué es un DFS? (Wikipedia no ayuda).
CalculatorFeline
@CatsAreFluffy Profundidad-primera búsqueda
Sp3000
Ah Acabo de usar un algoritmo codicioso.
CalculatorFeline
2

JavaScript (ES6) 233

Una función anónima que devuelve 0 como falsyy no cero comotruthy

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

Verificando los últimos 3 dígitos en la representación numérica en la base 36.

La cadena de verificación está construida así:

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

Prueba

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>  

edc65
fuente
1

Mathematica, 218 217 bytes

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

Por alguna razón, existe un conjunto de módulos que nos permite distinguir dos conjuntos solo por si, después de aplicar los módulos, el resultado es cero o no. La larga lista de módulos fue generada por este programa:

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

La primera salida son los módulos, la segunda y la tercera salidas son las dos listas, después de haber aplicado los módulos. Las dos largas listas son los conjuntos.

CalculadoraFeline
fuente
2
Probablemente pueda comprimir una parte de la lista en una cadena.
njpipeorgan
1

PowerShell, v3 + 194 bytes

$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 enfoque un poco diferente, así que pensé que lo publicaría. No va a ganar el más corto, pero puede dar ideas a otras personas para acortar su código.

Todavía estamos tomando el entero de entrada $args[0]y aplicando operaciones de módulo, por lo que no hay nada diferente allí. En lo anterior, estamos utilizando el -inoperador (de ahí el requisito v3 +), por lo que esto generaráTrue valores que están en el caso de prueba de verdad.

Sin embargo, estoy tratando de encontrar matrices resultantes donde podamos aprovechar el .. función de rango para acortar el recuento de bytes, pero todavía tengo matrices distintas entre los valores de verdadero y falso. Podemos hacer esto ya que el comportamiento que no sea la entrada de verdad / falsey no está definido, por lo que si el rango captura valores fuera de la entrada de verdad / falsey, no importa la salida.

Hasta ahora, es un proceso bastante manual, ya que el objetivo es tratar de encontrar el módulo donde una de las matrices de verdad o falsey tiene grandes espacios entre los números y la otra matriz tiene grandes cantidades de números en esa brecha. La mayoría de las veces he estado yendo por intuición y por instinto hasta ahora, pero eventualmente podría escribir un forzador de brutas para resolver esto. Lo anterior es el más corto que he encontrado (principalmente manualmente) hasta ahora.

AdmBorkBork
fuente