Un hombre tiene dos dispositivos.
- Una máquina del tiempo : puede controlar esta máquina pensando. Le permite viajar desde cualquier punto en el tiempo a otro punto en el pasado o en el futuro (o incluso en el presente) en muy poco tiempo. Tenga en cuenta que si viaja al pasado de B a A, entonces todos los eventos normales (máquinas del tiempo, alternadores excluidos) de A a B deben repetirse exactamente de la misma manera. Luego, desde el punto B, vuelve al punto A. Por lo tanto, un solo viaje en el tiempo crea un bucle infinito.
- Alternador : al darse cuenta de este problema, crea otra máquina. Se da cuenta de que, aunque todos los eventos físicos se repiten en un bucle, sus pensamientos pueden ser diferentes. Por lo tanto, esta máquina también fue diseñada para ser controlable por pensamiento. La máquina se puede usar en cualquier momento para proporcionar un futuro alternativo (pero no pasado) con respecto al tiempo que la usó.
Ejemplo
Explicaré todos los detalles con un extenso ejemplo.
1000 T+250 250 T+0 500 T-200 100 T-50 125 A 225 T-400 500 A 100 T-200 150 T-25 100 T+100 50 A 25
- Pasan 1000 años. Es el año 1000 ahora.
- Viaja de 1000 a 1250.
- Pasan 250 años. Es el año 1500 ahora.
- Viaja de 1500 a 1500. Esto no tiene ningún efecto (y puede ser ignorado).
- Pasan 500 años. Ahora es el año 2000
- Viaja de 2000 a 1800.
- Pasan 100 años. Es el año 1900 ahora.
- Viaja de 1900 a 1850.
- Pasan 125 años: sin embargo, esta vez, como él está en un bucle, las cosas son diferentes. Pasan 50 años desde 1850 hasta 1900. Vuelve en bucle hasta 1850. Pasan otros 50 años desde 1850 hasta 1900. Vuelve en bucle nuevamente. Pasan 25 años y es 1875, completando así 125 años.
- Él usa el alternador. Ahora existe un futuro alternativo para el año 1875, en el que se encuentra ahora. El pasado no ha cambiado.
- Pasan 225 años. Ahora es el año 2100.
- Viaja de 2100 a 1700.
- Pase de 500 años: 175 años de 1700 a 1875 pasan normalmente. No, vuelve a encontrarse con el alternador, lo que significa que ahora se ha creado un tercer futuro después de 1875. 325 años pasan normalmente, por lo que es el año 2200.
- El uso de un alternador ahora no tiene ningún efecto (y puede ignorarse) ya que solo existe un futuro para 2200 que aún no se ha definido.
- Pasan 100 años. Ahora es 2300.
- Viaja de 2300 a 2100.
- Pase de 150 años: 100 años de 2100 a 2200 pasan normalmente. A partir de 2200 se crea un segundo futuro. Pasan 50 años y ahora es el año 2250.
- Se supone que debe ir de 2250 a 2225. Sin embargo, ahora existen dos 2225 en dos líneas de tiempo diferentes. Por lo tanto, esto lleva a una paradoja, ya que no podemos determinar a qué punto en el tiempo llegará. (No asumiremos que va a la línea de tiempo más reciente) Por lo tanto, esto termina nuestra simulación.
- Todo lo demás
100 T+100 50 A 25
se ignora por completo ya que ha ocurrido una paradoja y nuestra simulación ha dejado de funcionar.
Sugerencia: si te cuesta entender el ejemplo, imagina que el tiempo es como un camino que estás cavando en la tierra. Si viaja en el tiempo, está creando un teletransportador. Si está utilizando el alternador, está cavando una nueva ruta en la pared de una ruta existente.
Paradoja
Suponga que A, B y C son tres puntos en el tiempo (uno tras otro). Se dice que ocurrió una paradoja si:
- estás en un punto C, existe un alternador en un punto B, existe más de un futuro para el punto B (y estás en uno de ellos) e intentas acceder a cualquier punto entre B y C a través del viaje en el tiempo.
- usted está en un punto A, existe un alternador en un punto B, existe más de un futuro para el punto B e intenta acceder a un punto C (después de B) a través del viaje en el tiempo.
Entrada
Una serie de eventos, similar al ejemplo. (El formato es flexible).
Salida
Un valor verdadero / falso, que indica si se ha producido una paradoja.
Desafío
El código más corto (en bytes) gana.
flexible
es elformat
?Respuestas:
Rubí,
510460bytesEntrada
Como por ejemplo
Salida
0 = sin paradoja, 1 = paradoja
Muestra
La entrada de muestra proporcionada:
1000 T+250 250 T+0 500 T-200 100 T-50 125 A 225 T-400 500 A 100 T-200 150 T-25 100 T+100 50 A 25
retorna1
, indicando que ocurrió una paradoja.Notas
Este no es solo el primer ejercicio de codegolf que intento, sino que también es el primer programa de Ruby que he escrito. Por lo tanto, probablemente podría ser aún más corto.
Breve explicacion
Los bucles infinitos solo ocurrirán mientras se viaja hacia adelante en el tiempo. Me alegra cualquier comentario, especialmente si señala una mejor manera de resolver esto.
fuente
then
s son innecesarios y se pueden eliminar. Además, debe usar en{...}
lugar dedo...end
guardar más caracteres.map
guarda un byteeach
y sesplit
divide en espacios en blanco de forma predeterminada. Las primeras cuatro líneas de inicialización pueden acortarse ap=[];w=[n=x=0]
.05AB1E ,
93928682 bytesLa entrada está en el mismo formato que en la descripción del desafío, excepto que el alternador
A
esabcdefghijklmnopqrstuvwxyz
para guardar un byte.Salidas
1
si ocurrió una paradoja, o la entrada en sí si no (solo1
es verdad en 05AB1E, todo lo demás es falsey).Basada en mi respuesta de Java 10 .
Pruébalo en línea.
O pruébelo en línea con líneas de depuración agregadas ( TODO: Cree un conjunto de pruebas adecuado con todos los casos de prueba a la vez ... ):
- Caso de prueba con paradoja de viaje en el tiempo hacia atrás: Pruébelo en línea.
- Caso de prueba con paradoja de viaje en el tiempo hacia adelante: Pruébelo en línea.
- Caso de prueba sin paradoja de viaje en el tiempo: Pruébelo en línea.
Explicación:
fuente
Java 10,
498485478 bytesLa entrada está (por ahora) en el mismo formato que en la descripción del desafío.
-13 bytes gracias a @BenjaminUrquhart .
-7 bytes gracias a @ceilingcat .
Pruébelo en línea o pruébelo en línea con líneas de depuración adicionales .
Explicación:
fuente
Long
?int
era más corto, pero eso dio errores con los pares de valores-clave de entrada de mapa. No pensé en cambiar todo a mucho después de eso ... ¡Gracias por -13!