Su desafío es desarrollar un programa que imite un flujo de transmisión de datos. Su programa debe leer la entrada de stdin y enviarla directamente a stdout. Para hacer que el problema sea más interesante, la secuencia de salida es 'defectuosa' y debe cumplir varios requisitos:
- Debería haber un 10% de posibilidades de que cada personaje se cambie +1 código ascii (por ejemplo, 'a' se convierte en 'b', '9' se convierte en ':'), etc.
- La entrada y la salida solo deben cubrir valores ascii imprimibles ('!' A '~', decimal 33 a decimal 126, inclusive). Si el +1 aleatorio ocurre en un '~' (decimal 126), un '!' (decimal 33) se debe generar en su lugar.
- Si tres caracteres se desplazan aleatoriamente en una fila, el programa debe mostrar "CÓDIGO DE ERROR 4625: ERROR INVERTIRABLE, CONTACTE CON SU ADMINISTRADOR DE SISTEMA" (línea posterior opcional) y detener la ejecución.
Para simplificar el problema, aquí hay algunos otros criterios:
- Puede suponer que la entrada siempre será válida; es decir, solo contendrá valores '!' a través de '~'.
- El programa debe continuar hasta que tres caracteres se desplacen aleatoriamente en una fila; es seguro asumir que EOF nunca ocurrirá.
- La aleatoriedad debe diferir entre corridas; Si su generador de números aleatorios necesita ser sembrado para obtener un resultado único en cada ejecución, entonces su código debe ser inicializado.
- Debe escribir un programa, no una función.
- Debe tomar la entrada de stdin y escribir la salida en stdout.
- No puede utilizar ninguna biblioteca o recurso externo.
- Su código debe tener un intérprete o compilador disponible y que funcione libremente.
Aplican reglas estándar de código de golf. El ganador es quien tiene el programa más corto publicado dentro de dos semanas (jueves 20 de febrero de 2014).
Respuestas:
Befunge-98,
166159156155148Este mejora con respecto a la otra excelente respuesta Befunge con la probabilidad correcta (1/10) y es un poco más compacto:
fuente
x
se usa en dos lugares como un "goto". El ajuste de bordes se usa (ab) ampliamente, incluido el control que fluye a través del espacio entreASE
yCONTACT
. El contador "3 en una fila" se mantiene en la parte inferior de la pila; la barra invertida se usa para intercambiar y acceder a ella donde sea necesario.?
instrucciones (una de las cuales es golpeada por dos caminos, por lo que la probabilidad sigue siendo exactamente 1/10) e hizo algunos otros ajustes menores para eliminar 7 caracteres más!C, 168 caracteres
La siembra de esta solución del PRNG aprovecha el hecho de que los sistemas operativos modernos cambian la ubicación de la pila en la memoria en cada ejecución, como una medida básica contra las vulnerabilidades de destrucción de la pila.
fuente
c
por completo moviendo lagetchar()
llamadaputchar()
y usando algunas matemáticas elegantes ...c
para poder probargetchar()
el valor contra 126 además de pasárseloputchar()
.putchar((getchar()-33+(rand()%10?i=0:1))%94+33))
debería funcionar. Usando su solución como base, me lleva a 165 caracteres.Ruby, 156
fuente
:3while
?:3
es en realidad el final de esta declaración:e=r>0?e-r :3
que establece el valor de e (número de errores secuenciales restantes antes de abortar) en función de r (1 si el último carácter procesado fue un error, 0 si no). Simplemente se empujó contra el tiempo para ahorrar espacio:>while
sin espacio antes? ¡Eso es tan oscuro e ilegible! ;)Lote - 359
Abierto a sugerencias para que sea completamente compatible con las reglas de desafío.
Trabajaré para hacerlo más pequeño / mejor: quería publicarlo mientras funciona, antes de romperlo.
Definitivamente hay bastantes maneras de jugar golf.
Sin golf -
fuente
Befunge-93 (206)
Tiene 142 caracteres que no son espacios en blanco. Técnicamente no es conforme, ya que tiene una probabilidad de 1/9 no 1/10 de error.
Corre como
cat /dev/urandom | tr -dc '!-~' | ./befungee.py -c 100 ../rand
.Con esta entrada
!!!!aaaaaaa~~~~~~~~~~
obtenemos la salida!"!!aabaaba~~~!~~~~!!
que indica que los errores se manejan correctamente.fuente
PHP 190
eso es lo más lejos que podría jugarlo, pero creo que es bastante bueno que esté a menos de 100 caracteres del líder
fuente
C # -
346330313309297288278274Un poco largo pero hace el trabajo.
fuente
c=n==0?c+1:0
es más corto quec+=(n==0?1:-c)
...(n==1?1:0)
es más corto que(n==1?n--:(--n-n))
(y luego, por supuesto, cambia el más tarden==0
an==1
)(false)
? En todo caso, ¿no quieres(true)
?shbash, en OSX,211,208,203,200,196, 185Ligeramente mejor que el 10% ya que aleatorio generará números entre 0 y 32767, por lo que realmente es 3,277 en 32,768 probabilidades (10,0006%).
Gracias, @Gilles (pero no estoy seguro de lo que quieres decir con la reestructuración de tiempo. También tenía algunas otras ideas en la ducha.
fuente
[ $RANDOM -gt 3276 ]
hacia((RANDOM>3276))
y[ $[t++] -eq 2 ]
hacia((t++==2))
. Creo que también puede guardar algunos caracteres reestructurando comowhile read -n1 a;((RANDOM>3276))&&…
.while read...
parte?while …;do :;done
ountil …;do :;done
deberías poder afeitar algunos caracteres.C,
260257237225189174Mi primer golf, sugerencias apreciadas.
7 es muy aleatorio.
Compilar te dará advertencias.
Gracias por la ayuda de breadbox y Josh.
fuente
#include
; C aceptará (con advertencias) llamadas a funciones no declaradas (dentro de los límites). Use variables globales para obtener una inicialización cero automática. Encuentre formas de usar el operador ternario en lugar deif
/else
declaraciones. El usofor
en lugar dewhile
brinda más oportunidades para reducir el número de declaraciones de nivel superior y omitir los corchetes alrededor del cuerpo del bucle. Mucho más que podría mencionarse: examine otras soluciones de C en este sitio.n
yc
en el ámbito global. Esto le permitiría descartar laint
declaración y permitir que la inicialización a cero sea automática.c
el valor no inicializado ensrand
. Supongo que podría usar&c
o en su&n
lugar, que es lo que utiliza breadbox.