Una representación de doble precisión de un decimal solo puede garantizar una precisión de 15 decimales, por lo que pi se aproxima como:
3.141592653589793
Puede ver que el dígito 3
está en posiciones 1, 10, 16
, el dígito 1
está en posiciones, 2, 4
etc.
Reto
Su tarea es crear un programa o función que cree un número doble aleatorio entre 0 y 1, y asigne los valores de ese número al valor de pi. Para ello, coloca los diferentes dígitos en los números aleatorios en la posición que ese dígito tiene en pi. Si el dígito no se encuentra en pi, lo omitirá, y cada dígito en pi que no esté en el número aleatorio estará representado por un x
. Cada valor solo se puede usar una vez, comenzando desde la izquierda.
Algunos ejemplos probablemente aclararán esto. En los siguientes ejemplos, el primer número es pi, el segundo es el número aleatorio y el último es el resultado deseado.
3.141592653589793
0.111111111111111
x.1x1xxxxxxxxxxxx
3.141592653589793
0.531000000000000
3.1xx5xxxxxxxxxxx
3.141592653589793
0.123456789123456
3.141592653x8x7xx
3.141592653589793
0.967552381459391
3.14159265358979x
Reglas:
- La función no debe tomar ninguna entrada (una posible excepción se explica en el punto 3)
- La salida consistirá solo en la cadena de salida, con una nueva línea opcional (también se acepta un espacio final simple)
- Si su programa no tiene un valor Pi incorporado y / o un RNG, puede codificar Pi y tomar el número aleatorio como entrada. No puede codificar el número aleatorio o tomar Pi como entrada.
- Tanto el valor codificado para Pi como los 15 dígitos aleatorios (puede omitir
0.
ya que sabe que estará entre 0 y 1) se incluirán en el recuento de bytes. - Si su idioma no tiene la precisión requerida, puede usar menos precisión bajo las siguientes restricciones
- Los dígitos de Pi deben ser precisos hasta la precisión que tenga
- No puede generar más valores de los que se garantiza que tiene la correcta, es decir, no puede generar 15 dígitos si la precisión solo permite 8 decimales precisos.
- El valor codificado de Pi contará como 16 bytes (no necesita el punto decimal), incluso si su programa solo admite 8 dígitos.
- El valor de entrada para el número aleatorio contará como 15 bytes (no es necesario
0.
. Esto se debe a que los idiomas con baja precisión no deberían tener una ventaja injusta. - El programa debe admitir 5 decimales de precisión (al menos).
- Editar: Para validar la respuesta: el número aleatorio debe imprimirse de alguna manera, pero esta operación no tiene que incluirse en el recuento de bytes. Entonces, por ejemplo, si es posible insertar un
print r
al final del guión, esa parte no aumentará la puntuación. - No puede restar los bytes si es parte de otra operación necesaria. Es decir, si el código es
print pi, r
, entonces solo puedes restar, r
. - Si tiene que insertar partes en varios lugares del código, incluya ambas versiones (la que imprime el número aleatorio y la que no lo hace con un comentario como:
_p
y_oNo
son necesarios para imprimir el número aleatorio._p
Does xxx and_oNo
does aaa._p
y_oNo
no se incluirán en el recuento de bytes.
El código más corto en bytes gana.
Tabla de clasificación
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [><>](http://esolangs.org/wiki/Fish), 121 bytes
0 < random < 1
o0 <= random <= 1
?Respuestas:
Pyth, 25 bytes
Pruébelo en línea: demostración o prueba que muestra el número aleatorio
Explicación:
fuente
LabVIEW, 53 primitivas de LabVIEW
Combino cadenas y pongo el número en una cadena "vacía" x.xxx y elimino el número de pi para que no vuelva a aparecer.
el número aleatorio y los caracteres individuales aquí son algo visibles, ¿está bien o tengo que rehacer la grabación?
fuente
Mathematica, 105 o 147 caracteres
Si el número aleatorio " entre 0 y 1" significa
0 <= random <= 1
, es decir, incluye 0 y 1.(105 caracteres)
De lo contrario, tomar el número aleatorio " entre 0 y 1" significa
0 < random < 1
.Bucle para obtener 15 enteros aleatorios, no todos cero. Seleccione el complemento del rango de 0 a 9, es decir, aquellos números del 0 al 9 que no están en la lista aleatoria. Convierta esos enteros en cadenas y reemplace los caracteres coincidentes en una cadena pi.
(147 caracteres)
Dígitos aleatorios: -
fuente
True
es decir1>0
,RandomInteger
puede usar la notación infija{0,9}~RandomInteger~15
. Probablemente pueda guardar algunos bytes dandor
algún valor y, de hecho, utilizando la condición de enWhile
lugar de usarBreak.
ThenFor
podría guardar otro byteWhile
. Aunque no entiendo por qué necesita el bucle si asume el número aleatorio en el rango[0,1)
.1>0
:-)JavaScript (ES6),
8987 bytesExplicación
Editar: la cadena aleatoria ahora no se trunca como lo aclara el póster.
Recorre cada dígito de pi y elimina el dígito del número aleatorio si se encontró, de lo contrario, reemplaza el dígito en pi con
x
.Prueba
La prueba también genera el número aleatorio.
Mostrar fragmento de código
fuente
Math.random()
produce un número del rango,[0,1)
por lo que podría0
pero nunca1
. El OP no especificó específicamente si el rango era inclusivo o exclusivo, por lo que supuse que todo lo que fuera razonable está bien. Este es también el rango que utilizan las otras respuestas. Sin embargo, me has hecho consciente de que si es exactamente0
fallará porque.
in pi no coincidirá y se convertiráx
. Esto tiene una probabilidad de 1 en 2 ^ 53 de ocurrir, pero decidí arreglarlo de todos modos.[0,1]
está bien (también lo es(0,1)
).CJam,
4846423836 bytesPruébalo aquí.
Y aquí está la versión que imprime tanto π como el número aleatorio:
Pruébalo aquí.
No trunco el número aleatorio a 15 decimales, como lo aclara el OP en un comentario.
Explicación
La idea es convertir cada carácter en la representación de cadena de π en un par de ese carácter y
x
. Para cada carácter en el número aleatorio, intercambiamos el primer par que comienza con ese carácter. Al final sacamos el segundo carácter de cada par.fuente
Lua,
231230 bytesExplicaciones
Lamentablemente, lua no me ayuda en absoluto aquí. math.pi alrededor del último dígito de pi devuelve:
Tengo que truncar este número:
El segundo gran defecto para hacer este desafío fue la falta de string.replace (). Como estoy haciendo esta acción dos veces
s:sub(1,l-1)..c..s:sub(l+1)
, quería hacer una función anónima, pensando que sería más corta. No lo es, así que lo escribí dos veces.La razón por la que tengo que tener cuidado con el punto, es cómo lua vuelve a su posición. En expresiones regulares, un punto significa "cualquier carácter", por lo que cuando estoy evaluando el carácter
.
en mi bucle, coincide con el primer carácter:Puedes probar lua en línea . Como no estoy enviando el PRNG, aquí hay un código que le permite ejecutar varias pruebas sin dejar de ver los valores.
fuente
Python 2.7,
117110 bytesProbado en la última aplicación de Android QPython, pero debería funcionar en cualquier lugar.
Edición 1: cambiado
str(pi)
a backticks.Para las pruebas:
fuente
Python, 147 bytes
Bastante autoexplicativo: la función lambda convierte flotante a lista; luego recorremos la lista pi intentando eliminar cada dígito de la lista aleatoria. Si podemos, bien, añádelo a la respuesta; si no, agregue una 'x' en su lugar.
fuente
str(t)
solo le da 11 dígitos de precisiónt
,repr(t)
le da todost
los 15 dígitos de.Perl, 70 bytes
Con comentarios:
Esta versión imprimirá pi, el número aleatorio y el resultado:
Salida de ejemplo:
Espero que esté bien:
9
) es exacto.fuente