Descargo de responsabilidad
Si bien sé que existe esta pregunta relacionada en particular , mi pregunta usa dos puertas de garaje, un componente aleatorio, y también estoy basando esto en eventos de la vida real, al ver que mi hijo bajó accidentalmente una de dichas puertas de garaje mientras salía del garaje la semana pasada ... ¡Nada como un golpe en la cabeza para que fluyan los jugos creativos! ;)
El fondo
A Lucas (mi hijo de 15 meses) le gusta jugar con el control remoto del garaje. Hay dos botones en este control remoto, uno para la puerta de garaje izquierda y otro para la puerta de garaje derecha. Ambos botones funcionan de la misma manera; presione una vez para que la puerta comience a abrir, presione nuevamente para detener, presione nuevamente para comenzar a cerrar, presione nuevamente para detener nuevamente, y así sucesivamente.
A Lucas le encanta este control remoto, presionará aleatoriamente uno de los botones, o ambos, o ninguno. Si se presionan ambos, no se envía ninguna señal, pero al presionar un botón se enviará una señal.
Entonces, el desafío del código-golf se divide en dos partes:
Parte uno
Genere una cadena larga de 60 caracteres que represente las pulsaciones aleatorias de los botones de Lucas durante un minuto. "Aleatorio" en este caso significa "con la misma probabilidad de cada entrada en cada tic". Los personajes son los siguientes:
- 0: Lucas no presionó ningún botón o presionó ambos botones. De cualquier manera, no se ha enviado ninguna señal.
- 1: Lucas ha presionado el botón de la puerta de garaje izquierda
- 2: Lucas ha presionado el botón de la puerta de garaje derecha
La segunda parte
Usando la cadena generada en la Parte Uno, simule la apertura y el cierre del garaje para dos autos usando los números como disparadores para abrir, detener y cerrar estas puertas.
Las puertas de mi garaje son bastante rápidas (consulte el descargo de responsabilidad anterior para saber por qué). Una vez que presiona el botón, tarda cuatro segundos en abrirse o cerrarse por completo.
Entonces, si está cerrado:
- 0 segundos: 0% abierto (cerrado); Cuando se presiona el botón, la puerta comienza a abrirse
- 1 seg: 25% abierto
- 2 segundos: 50% abierto
- 3 segundos: 75% abierto
- 4 segundos: 100% abierto, la puerta se detiene
Y por lo tanto, si está abierto:
- 0 segundos: 100% abierto; Cuando se presiona el botón, la puerta comienza a cerrarse
- 1 seg .: 75% abierto
- 2 segundos: 50% abierto
- 3 seg: 25% abierto
- 4 seg: 0% abierto (cerrado), la puerta se detiene
Si una puerta en particular está en movimiento, una señal a esa misma puerta la detendrá. La siguiente señal enviada a esa misma puerta después de eso la enviará moviéndose en la dirección opuesta. Si una puerta se detiene cuando anteriormente estaba en movimiento y ahora está completamente abierta o completamente cerrada cuando se recibe la señal de "parada", la puerta se registrará como "detenida" en el estado completamente abierto o completamente cerrado, lista para moverse en la dirección opuesta cuando recibe una nueva señal.
Con esta simulación, ambas puertas de garaje estarán inicialmente en la posición cerrada. Entonces, echemos un vistazo a una lista de comandos de 10 segundos y veamos qué sucede si Lucas los ejecuta en el control remoto:
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Salida
La primera parte de la salida requiere la visualización de la cadena de 60 caracteres de caracteres aleatorios "0", "1" y "2" generados a partir de la Parte Uno. p.ej.
212022112021202211202120221120212022112021202211202120221120
Debajo de esta cadena, se encuentra el procesamiento de estas "señales" de acuerdo con las reglas mencionadas anteriormente sobre cómo se comportarán las puertas de garaje con cada carácter respectivo (segundo a segundo). Debe terminar con 60 líneas como resultado debajo de la cadena de visualización inicial.
Cada una de estas líneas procesadas tendrá la forma de:
N: (L:X% XXXXXXX, R:Y% YYYYYYY)
donde:
- N es el enésimo carácter de la cadena aleatoria respectiva, que tendrá la forma de 0, 1 o 2.
- X% es el porcentaje de apertura de la puerta izquierda (no hay relleno cero)
- XXXXXXX es el estado de la puerta izquierda. Si la puerta no está en movimiento (es decir, no se abre ni se cierra), se aplica el estado "detenido", lo que significa que se ha detenido en movimiento (solo es posible al 25%, 50% o 75%) o se detiene cuando está completamente abierto (100% ) o completamente cerrado (0%). De lo contrario, la puerta estará "abriéndose" o "cerrándose".
- Y% es el porcentaje de apertura de la puerta derecha (no hay relleno cero)
- AAAAAA es el estado de la puerta derecha. Si la puerta no está en movimiento (es decir, no se abre ni se cierra), se aplica el estado "detenido", lo que significa que se ha detenido en movimiento (solo es posible al 25%, 50% o 75%) o se detiene cuando está completamente abierto (100% ) o completamente cerrado (0%). De lo contrario, la puerta estará "abriéndose" o "cerrándose".
Ejemplo que se muestra a continuación utilizando 10 "señales" y 10 líneas procesadas
2120221120
2: (L:0% stopped, R:0% opening)
1: (L:0% opening, R:25% opening)
2: (L:25% opening, R:50% stopped)
0: (L:50% opening, R:50% stopped)
2: (L:75% opening, R:50% closing)
2: (L:100% stopped, R:25% stopped)
1: (L:100% closing, R:25% stopped)
1: (L:75% stopped, R:25% stopped)
2: (L:75% stopped, R:25% opening)
0: (L:75% stopped, R:50% opening)
Este es el código de golf, por lo que el código más corto será el claro ganador. He hecho esto un poco fácil usando frases como "abrir", "detener" y "cerrar", que son las siete letras ... así que es posible que desee incluir eso en su estrategia.
¡La mejor de las suertes!
1
comando no detiene la puerta izquierda al 75% en su ejemplo?Respuestas:
Pyth,
156149145 bytesUna traducción directa de mi respuesta de Python .
Pruébalo en línea!
Explicación:
fuente
Javascript (ES6),
277275263253250247234 bytesUngolfed y comentó
Manifestación
fuente
112200001100122021010101012100000010011200201022122021012211 [ "L:25% stopped", "R:25% stopped" ]
(nuevas líneas después de comas y corchetes)v^=(c-i-1?0:v&8||24)
para guardar dos bytes.Python 2,
377370361357345335326316312306304 bytesEl segundo nivel de sangría es una pestaña sin formato (
\t
), que juega muy mal con Markdown, por lo que ha sido reemplazado por dos espacios.Estoy casi seguro de que esto se puede jugar más.
Sin golf, con comentarios:
¡Guardado
41415 bytes gracias a @TheBikingViking!¡Guardado 6 bytes gracias a @ValueInk!
fuente
range(60)
a[0]*60
.'p'[1::3]
(reemplazar los apóstrofos con comillas invertidas) en lugar de''.join(map(str,p))
.(4,0)[q<0]==c[i]and q
->((4,0)[q<0]==c[i])*q
n
esa cadena.n
se utiliza en la línea final para extraerclosing
,stopped
,opening
de esa cadena.Rubí,
263261260254 bytes¿Cómo se acortó la respuesta de JavaScript? Sobrepasó la mía mientras estaba fuera y todavía está ganando actualmente ...
fuente
C,
420433424374 bytesNo siembra el generador aleatorio, pero usa aleatorio para una mejor distribución. Sin embargo, debe haber una mejor manera de jugar esta lógica ...
Versión anterior 1:
Versión anterior 2:
fuente
PHP,
254247246245235230226 bytesvenciendo a ES otra vez!
golfed desde estos 311 (la primera versión completa, ya tenía algo de golf):
Descompostura
fuente
Java 8 lambda, 500 caracteres
Hice lo mejor que pude, esto es lo que se me ocurrió:
Sin golfista en una clase completa:
Muy claro. Las variables stepLeft / stepRight circulan de 0-3. Al hacer algunas matemáticas simples, changeLeft / changeRight mantiene los respectivos cambios relativos por paso, que se agregarán a leftDoor / rightDoor. Muchas declaraciones if para atrapar cuando la puerta tiene que detenerse por sí sola.
Siéntase libre de ayudarme a acortar esto, creo que hay mucho que hacer.
fuente
Haskell (lambdabot) - 409 bytes
fuente
imports
, por ejemplo,randoms
a su código (y número de bytes). Si hay un intérprete que importa por defecto, consúltelo en el nombre del idioma.