Sobre la serie
En primer lugar, puede tratar esto como cualquier otro desafío de golf de código y responderlo sin preocuparse por la serie. Sin embargo, hay una tabla de clasificación en todos los desafíos. Puede encontrar la tabla de clasificación junto con más información sobre la serie en la primera publicación .
Hoyo 8: baraja una lista infinita
Debe escribir una función o programa que tome una lista infinita como entrada y devuelva una versión aleatoria de esa lista.
Acerca de E / S infinitas
Hay varias formas en que puede tomar datos y producir resultados para este desafío:
- Puede tomar una lista de enteros positivos, o una representación de cadena de los mismos, o una cadena o lista de caracteres ASCII imprimibles (0x20 a 0x7E, inclusive). El formato de salida debe coincidir con el formato de entrada. Me referiré a los datos como "la lista" de ahora en adelante, independientemente de la opción que elija.
- Puede leer la lista desde una secuencia de entrada estándar infinita y escribir la salida continuamente en una secuencia de salida estándar infinita. La solución no debe depender de ningún valor o secuencia de valores en particular para garantizar que la secuencia de salida se escriba y se vacíe regularmente (por ejemplo, no puede escribir la salida siempre que haya una
5
en la lista de entrada). Por supuesto, si lee una representación de cadena de una lista, está bien esperar hasta encontrar el separador de lista. - En los idiomas que los admiten, puede escribir una función que tome y devuelva una lista o cadena infinita perezosa.
- En los idiomas que los admiten, puede implementar un generador infinito que tome otro generador como entrada.
- Alternativamente, puede escribir una función que no tome argumentos y devuelva un valor de salida cada vez que se llame. En este caso, puede suponer que se ha definido una función que no toma argumentos y devuelve el siguiente valor de entrada cada vez que se llama. Puedes elegir libremente el nombre de esa función.
Puede suponer que su programa se ejecuta para siempre y que hay memoria infinita disponible. (Es posible resolver esto con una cantidad finita de memoria, pero lo que esto significa es que se le permite perder memoria).
Sobre la aleatoriedad
Para cualquier valor v que se lea en una posición i de la entrada infinita, debe haber una probabilidad positiva de que termine en cualquiera de las posiciones i-9 a i + 9 de la salida infinita (a menos que esa posición sea negativa ) Estas probabilidades no tienen que ser las mismas para diferentes posiciones de salida o incluso para diferentes posiciones de entrada. Está bien si su solución también puede barajar los valores a otra posición que esté más lejos.
Por lo tanto, no es necesario que su solución pueda barajar el primer valor muy abajo en la lista, o que pueda barajar un valor muy tardío hasta la primera posición, aunque está bien si lo hace, siempre que todas las posiciones estén a 9 pasos del La entrada es posible.
Por ejemplo, si tomó la siguiente cadena como entrada, ___
indica todas las posiciones que X
deben poder terminar en la salida:
___________________
abcdefghijklmnopqrstuvwxyzXabcdefghijklmnopqrstuvwxyz...
Si su idioma carece de un generador de números aleatorios incorporado o no desea usarlo, puede tomar un valor semilla adicional como entrada e implementar su propio RNG adecuado utilizando la semilla. Esta página puede ser útil para eso.
Independientemente de la distribución real que utilice su solución, es casi seguro que debe producir el siguiente valor después de un tiempo finito (pero arbitrario).
Incluya una breve explicación sobre cómo su implementación satisface estos requisitos.
Tanteo
Este es el código de golf , por lo que gana la respuesta válida más corta, medida en bytes .
Tabla de clasificación
La primera publicación de la serie genera una tabla de clasificación.
Para asegurarse de que sus respuestas aparezcan, comience cada respuesta 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
(El idioma no se muestra actualmente, pero el fragmento sí lo requiere y analiza, y puedo agregar una tabla de clasificación por idioma en el futuro).
fuente
Respuestas:
Python 3 , 78 bytes
Pruébalo en línea!
Toma datos de STDIN (uno por línea), imprime en STDOUT.
Mantiene un búfer
l
de hasta 10 elementos. El búfer se baraja con cada paso. Cuando su longitud es 10, el último elemento se imprime y se elimina.Si un elemento se imprime tan pronto como se insertó, se saltará por delante de otros 9 elementos que esperan en el búfer, por lo que parece que quedan 9 puntos. Un elemento puede esperar en el búfer arbitrariamente largo, por lo que su posición puede mover cualquier cantidad a la derecha.
No parece haber una buena manera de producir y eliminar un elemento aleatorio de una lista. Barajar parece una exageración. Son 2 bytes más largos de uso
l.pop(randint(0,9))
(que usa que la lista tiene 10 elementos).No es mejor hacerlo
x=choice(l);l.remove(x)
. Un lenguaje con mepoprandom
gustapodría hacer muy limpiamente
fuente
Befunge ( sabor peculiar ), 4 bytes
,
lee un personaje de la secuencia y lo empuja a la pila.~
saca el carácter superior de la pila (si está presente) y lo imprime.?
aleatoriza qué comando se ejecuta a continuación. Entonces, el algoritmo aquí es "En un bucle infinito, con la misma probabilidad de empujar un personaje o reventar un personaje". Creo que esto satisface los requisitos: un personaje puede ver arbitrariamente muchos caracteres agregados encima de él en la pila, por lo que puede moverse arbitrariamente hacia la derecha, y puede imprimirse cuando la pila es arbitrariamente grande, por lo que puede moverse arbitrariamente lejos hacia la izquierda.fuente
>> document.getElementById("output").innerHTML = "a\0b"
>> document.getElementById("output").innerHTML
"ab"
C (gcc) , 94 bytes
Pruébalo en línea!
Ok, un enlace TIO no tiene mucho sentido. Para facilitar la prueba, creé el siguiente programa en C que generará caracteres ascii aleatorios o repetirá una cadena infinitamente.
Este programa se denominará
iro
.Corrección del programa
Lo que hago aquí es leer
9
valores en un búfer. Después de esto, los índices aleatorios se eligen de esta matriz y se emiten, luego se reemplazan por el siguiente carácter en la secuencia.fuente
SILOS , 149 bytes
Pruébalo en línea!
Esencialmente, sigue recibiendo información (en el intérprete en línea a través de argumentos, pero en el intérprete oficial fuera de línea le permitirá escribir en la consola (infinitamente) en bloques de 15 a la vez (30 el primer bloque).
Carga la entrada en una cola temporal y elige un 15 afortunado (al azar, pero no distribuido equitativamente en términos de probabilidad o distribución).
El resto permanece mientras las nuevas entradas llenan la cola, la primera entrada podría barajarse hasta el final (básicamente, creo que los caracteres siguen una distribución normal). Es interesante notar que este programa es solo dos veces más detallado que Python y quizás "más golfista" que Java.
Para ver mejor los resultados, tengo una versión no compatible que toma la entrada como una cadena (sin embargo, solo puede tener aproximadamente 8,000 caracteres).
Pruébalo en línea!
Solo por diversión, aquí está esta publicación alimentada a través de la versión de cadena.
fuente
Aceto , 24 bytes, no competidor
No competir porque tuve que corregir un error en el intérprete.
Toma una secuencia infinita de líneas y las produce en un orden aleatorio. Cada elemento tiene la posibilidad de ocurrir en cualquier punto aleatorio.
Comenzamos con un
?
en la esquina inferior izquierda, que nos mueve en una dirección aleatoria. Si eso es hacia abajo o hacia la izquierda, nos empujan hacia atrás.Si nos mueven hacia arriba,
r
añadimos un valor, barajamos la pila (Y
) y volvemos alO
rigin.Si nos
d
movemos hacia la derecha, duplicamos el valor de la pila superior, presionamos ay probamos la0
igualdad (dado que estamos leyendo cadenas, nunca podremos tener el entero 0). Si los valores son iguales, eso significa que hemos llegado al final de la pila (desde la que no queremos imprimir). Nos negamos la comparación (!
), yp
rint sólo si (`
) las cosas no eran iguales. Luego también volvemos a saltar alO
rigin.fuente
Ruby, 43 bytes
Mi respuesta original usaba una lista infinita de evaluación diferida, pero esta es más corta. Oh bien.
fuente
MATL , 11 bytes
Pruébalo en línea!
La respuesta Befunge del puerto de histocrat .
Explicación: (Gracias a Luis Mendo por -1 byte)
Esto produce casi seguramente en tiempo finito, y casi seguramente solo requiere memoria finita .
Para completar, aquí hay una versión de 15 bytes que mantiene un búfer de 10 elementos y genera un elemento aleatorio a partir de eso:
Me gusta esta versión para los muy idiomáticos (en la medida en que los idiomas de golf pueden ser idiomáticos)
tn...Yr&)
, que extrae un elemento aleatorio de la lista y devuelve la lista sin ese elemento. Sin embargo, la logística particular de este desafío agrega muchos bytes (los requeridosw
para la visualización,t9>?
para verificar si la lista está lo suficientemente llena ...).fuente
Alice , 7 bytes
Pruébalo en línea!
Esto debería funcionar en una entrada infinita con tiempo y memoria infinitos, pero no es tan fácil de probar en la práctica :)
Explicación
En cada iteración, se leen 10 caracteres de la entrada y solo uno va a la salida, por lo que el uso de la memoria aumenta linealmente durante la ejecución. Con una entrada finita, esto llega rápidamente a EOF, desde el cual diez -1 serán empujados a la pila en cada iteración. Intentar generar -1 como un carácter no tiene ningún efecto, pero es poco probable que todos los caracteres de la entrada se impriman en un tiempo razonable.
La posición i de la salida puede ser tomada por cualquier carácter en la entrada hasta la posición 10i , esto cumple con el desafío que requiere al menos un rango de i-9 a i + 9 .
fuente
C, 214 bytes
Cómo funciona
Probar en línea (UNIX)
fuente
Vi
se intercambia conVj
dóndej = RAND [ i-9, i+9 ]
satisfacer los criterios de la preguntav which is read at a position i of the infinite input, there must be a positive probability for it to end up in any of the positions i-9 to i+9 of the infinite output
05AB1E , 13 bytes
Pruébalo en línea! (modificado para tomar 20 elementos)
fuente
Bash , 17 bytes
Pruébalo en línea!
xargs toma continuamente 9 letras de STDIN y las envía a barajar
Una lista infinita puede ser generada por:
que imprime abcde .. z infinitas veces.
La prueba puede hacerse por:
fuente
xargs shuf -e
cumple con los requisitosR, 70 bytes
Comienza con un vector vacío
x
. En un bucle infinito, toma un nuevo valor de STDIN, luego baraja el vector. Luego comprueba si la longitud de la lista acumulada es 10 o superior. Si es así, puede comenzar a imprimir. De esta forma, el vector tiene un búfer de 10 entradas, cada una barajada en cada iteración. Por lo tanto, es posible que la entrada se imprima 10 lugares antes e infinitamente muchos lugares después (siguiendo una distribución geométrica conp=1/10
). Cuando el búfer es lo suficientemente largo, el primer elemento se imprime y se elimina del vector.fuente
Javascript, 78 bytes
Utiliza el mismo método que la respuesta de xnor.
fuente
Perl 5 , 39 bytes
38 bytes de código +
-n
bandera.Pruébalo en línea!
Agregue cada elemento a la
@F
matriz (conpush@F,$_
). Cuando@F
contiene 10 elementos (por lo tanto,push
devuelve el número de elementos en la matriz9<push...
), se elimina e imprime un elemento aleatorio (splice@F,rand 10,1
para eliminar el elemento,print
imprimirlo).La salida comienza a suceder después de que se haya leído el décimo elemento. Por lo tanto, cada elemento puede comenzar a aparecer al menos 9 posiciones antes de su original, y puede desplazarse a la derecha infinitamente.
fuente
SmileBASIC,
6158 bytesCada carácter de la lista infinita se agrega al final del búfer. Cuando la longitud del búfer es 11, se imprime y elimina un carácter aleatorio.
La función
R
genera el siguiente carácter.fuente
Prólogo, 70 bytes
fuente