Números que son fáciles de recordar pero que en teoría no son fáciles de hacer.
Su desafío es crear un programa / función en cualquier idioma que genere números uniformemente aleatorios que se ajusten a estos criterios:
La longitud es de 5 dígitos.
Hay dos pares de dígitos repetidos separados
Un conjunto de dígitos repetidos está al principio o al final y los dígitos están uno al lado del otro
El número impar está rodeado por el otro par de dígitos.
Los dos pares de dígitos y el otro número deben ser únicos.
Su programa puede admitir números con ceros a la izquierda o no, a su discreción. Si los ceros iniciales son compatibles, deben incluirse en la salida: 06088, no 6088. Si los ceros iniciales no son compatibles, entonces no deberían generarse números como 06088.
Casos de prueba
Salidas aceptadas:
55373 55494 67611 61633 09033 99757 95944 22808 65622 22161
Salidas no aceptadas:
55555 77787 85855 12345 99233 12131 a B C D e 5033
Se pueden encontrar casos de prueba más aceptables en este enlace de pastebin .
Estos se hicieron con este programa de Python:
importar al azar para i en rango (100): if random.randint (0,100)> = 50: #Poner par tocando al principio si es verdadero temp = [] # matriz de trabajo temp.append (random.randint (0,9)) #append dígito aleatorio temp.append (temp [0]) #aplica el mismo dígito nuevamente x = random.randint (0,9) mientras x == temp [0]: x = random.randint (0,9) temp.append (x) #append otro dígito único y = random.randint (0,9) mientras y == temp [0] o y == temp [2]: y = random.randint (0,9) temp.append (y) #append otro dígito único y el dígito único anterior temp.append (x) más: #Ponga el par tocando al final temp = [] # matriz de trabajo temp.append (random.randint (0,9)) #append dígito aleatorio # Si bien no es único, intente nuevamente x = random.randint (0,9) mientras x == temp [0]: x = random.randint (0,9) temp.append (x) #append otro dígito único temp.append (temp [0]) #aplica nuevamente el mismo 0º dígito y = random.randint (0,9) mientras y == temp [0] o y == temp [1]: y = random.randint (0,9) temp.append (y) #append dos dígitos únicos dos veces temp.append (y) tempstr = "" para yo en temp: tempstr + = str (i) imprimir tempstr
Este es el código de golf , ¡así que la respuesta más corta en bytes gana!
random
no significa uniformemente asíRespuestas:
05AB1E , 11 bytes
Pruébalo en línea!
Explicación
fuente
CJam (16 bytes)
Demostración en línea
Nota: He asumido que por OP "único" realmente significa "distinto".
También para 16 bytes:
Disección
Las otras variantes generan usando
[1 0 1 2 2]
y luego seleccionan el resultado o su reverso.fuente
Perl 5 ,
816356 bytesCorte 7 bytes con inspiración de @DomHastings
Construyendo el número a partir del patrón apropiado.
Pruébalo en línea!
Perl 5 , 89 bytes
Selecciona números aleatorios de 5 dígitos hasta que encuentre uno que cumpla con los criterios.
Pruébalo en línea!
fuente
time%2
lo suficientemente aleatorio, ya que, en cierto sentido, está bajo el control del usuario.Python 2 , 80 bytes
Pruébalo en línea!
Emite una lista de dígitos.
Python 2 , 83 bytes
Pruébalo en línea!
La salida es un número.
fuente
APL (Dyalog Unicode) ,
22 21 20 1817 bytesPruébalo en línea!
Si es aceptable generar los números siempre en el mismo formato, esto se puede acortar a 12 bytes, ya sea
1⌽1↓,∘⌽⍨3?10
o3⌽1↓,∘⌽⍨3?10
.Guardado un byte eliminando lo innecesario
∘
.Guardado un byte gracias a H.PWiz, y luego 2 bytes más debido a su propina.
Guardado un byte gracias a ngn.
La función asume
⎕IO←0
( I ndex O rigin).¿Cómo?
fuente
Input
se usa para llamar a la funcióng
. Además,g←
no se cuenta en el recuento de bytes porque no es necesario, solo se usa para llamar a la función.g
se llame en la sección de entrada es solo una peculiaridad de cómo APL está configurado para ejecutarse en TIO(4∨?2)
guarda un byte sobre1 4[?2]
f
y utilizar un tren. Aunque te lo dejo :) :)Java 8,
145136125119 bytes-9 bytes gracias a @ OlivierGrégoire.
-11 bytes gracias a @RickHitchcock .
-6 bytes gracias a @Nevay .
Explicación:
Pruébalo en línea.
fuente
v->{String r="";for(;!r.matches("(.)\\1(.).\\2|(.).\\3(.)\\4")|r.chars().distinct().count()!=3;r=(int)(Math.random()*1e5)+"");return r;}
(.).*\\1(.).*\\2
, ahorrando 11 bytes.v->{String r;for(;!(r=(int)(Math.random()*1e5)+"").matches("((.).?\\2){2}")|r.chars().distinct().count()<3;);return r;}
Jalea , 23 bytes
Pruébalo en línea!
fuente
Jalea ,
1211 bytesPruébalo en línea!
Explicación
(*) El argumento correcto de
ṃ
es que la lista['0','1','2',...,'9']
, aleatoriamente barajada, tiene 10 elementos. Por lo tanto, el número13122
se convertirá en la base biyectiva 10 ([1,3,1,2,2]
) y se indexará en la lista (por lo tanto, si la lista esl
, el valor de retorno del átomo es[l[1],l[3],l[1],l[2],l[2]]
, donde Jelly usa la indexación basada en 1)fuente
JavaScript (ES6), 79 bytes
Pruébalo en línea!
¿Cómo?
Math.random()
da un flotante aleatorio en [0..1) . Usamos+f
para forzar la coerción a una cadena. Ignoramos el cero inicial y el punto decimal haciendo[,,
( desestructurando la asignación de los dos primeros caracteres a nada) y recolectamos los primeros 4 dígitos decimales en d , a , b y c .Si un , b y c son números enteros distintos 3, construimos el resultado final, ya sea en AABCB o BCBAA formato (utilizando la paridad de d para decidir). De lo contrario, lo intentamos nuevamente hasta que lo estén.
En el caso altamente improbable de
Math.random()
devolver un valor sin suficientes decimales, al menos c se establecerá en un carácter que no sea un dígito, lo que obligará a que la prueba falle y se produzca la llamada recursiva. Si un , b y c son números enteros válidos entonces d se garantiza que sea un número entero válido también, así que ésta no tiene que ser probado.fuente
&&
pueden ser&
. Además, ¿cómo[,,a,b,c,d]
funciona? Nunca he visto una entrada como[,,
antes.a=4, b=2, c=1
porque4-2&4-1&2-1 == 2&3&1 == 0
. He agregado una breve explicación sobre la asignación de variables.&&
que&
en TIO y se lo di salidas correctas, así que supuse que era posible. No se dio cuenta de que en&
lugar de&&
filtraría las salidas válidas. Y gracias por la explicación adicional sobre la tarea de desestructuración, nunca la había visto antes.Perl 6 , 42 bytes
Pruébalo en línea!
fuente
Sucio , 33 bytes
Utiliza la
--numeric-output
bandera para que sea legible, de lo contrario, generaría una cadena de caracteres de control con puntos de código correspondientes a los dígitos.Pruébalo en línea!
Explicado:
fuente
Carbón , 34 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
Retina , 40 bytes
Pruébalo en línea!
Puede imprimir cadenas con ceros a la izquierda.
Explicación
Inicialice la cadena a 10 guiones bajos.
Transliterar cíclicamente caracteres de palabras a dígitos. Esto es un poco raro Los
w
yd
son cortos para las siguientes cadenas, respectivamente:La transliteración cíclica significa que primero, ambas cadenas se repiten a la longitud de su LCM:
Dado que las longitudes de cadena 53 y 10 son coprimas, cada copia de
_
se empareja con un dígito diferente. Y ahora transliteración cíclica sustituirá a la i ª copia de_
la i º emparejamiento en esa lista ampliada. Entonces terminamos con la siguiente cadena:Todo eso para guardar un solo byte sobre la cadena literal
0369258147
, así que, supongo. :REDe todos modos, tenemos una cadena de los 10 dígitos ahora.
Esto baraja los dígitos. Por lo tanto, los primeros tres dígitos serán una selección aleatoria uniforme de tres dígitos distintos.
Emparejamos la cuerda
...ABC
y la convertimosBABCC
. Sin embargo, la forma en que hacemos esto es un poco loco y, de nuevo, solo guarda un byte en comparación con un enfoque más directo. Primero hacemos coincidir todos losv
pares de caracteres superpuestos ( ), capturando el segundo (.(.)
). Luego conservamos solo la octava coincidencia (7
basada en cero) que estáAB
en...ABC
. Luego lo reemplazamos ($
) con:B
($1
),ABC
($<'
que es el sufijo del separador de coincidencias a la izquierda de la coincidencia),C
($'
que es el sufijo de la coincidencia misma).Finalmente, combinamos 3 o 2 caracteres y barajamos las coincidencias, dándonos al azar
BABCC
oCCBAB
al azar.fuente
R , 78 bytes
Pruébalo en línea!
sample
recoge 3 valores aleatorios de0:9
, que se colocan en un vector de este modo:a b a c c
. Ahora tenemos una posibilidad de 50/50 de revertir este vector, y luego concatenar e imprimir.fuente
rt
, pero por alguna razón pensé que era más largo ...(
como no-op es un buen hallazgo :)PHP,
737266 bytesEditar: 66 bytes gracias a la sugerencia de @David.
Pruébalo en línea!
fuente
<?=strtr(rand()%2?AABCB:BCBAA,ABC,rand(0,9).rand(0,9).rand(0,9));
rand(0,3).rand(4,6).rand(7,9)
, pero de nuevo no es "uniformemente aleatorio". Por cierto. No estaba familiarizadorand()%2
, por lo que su comentario me ayudó a mejorar ligeramente mi solución de todos modos.<?=strtr(rand()%2?AABCB:BCBAA,ABC,join(array_rand(range(0,9),3)));
. Puede probar que elarray_rand
segundo parámetro del '' solo devuelve resultados únicos aquí (probado más de 10000 iteraciones).Rojo ,
147, 146125bytesPruébalo en línea!
Sin golf:
fuente
Wolfram Language (Mathematica) , 59 bytes
Pruébalo en línea!
fuente
Ruby ,
6059 bytesPruébalo en línea!
Devuelve una lista de dígitos.
fuente
Python 3 + numpy, 69 bytes
Explicación
fuente
C (gcc) ,
126119 bytes-6 bytes de @ceilingcat
Pruébalo en línea!
fuente
J , 35 bytes
Pruébalo en línea!
Estoy seguro de que se puede jugar mucho más.
Explicación:
fuente