Klein es un lenguaje 2D que he diseñado que puede integrarse en 12 superficies topológicas diferentes. Un programa de Klein se puede ejecutar en diferentes superficies cambiando los argumentos de la línea de comandos.
La topología determina a dónde va el puntero de instrucción cuando se sale del borde del programa. Al alejarse del borde, la ip saltará a un borde con el color correspondiente y mantendrá su posición con respecto a la flecha, es decir, el puntero conservará su distancia de la punta de la flecha.
Por ejemplo 000
, la topología , la topología utilizada por la mayoría de los lenguajes 2D, hace que el puntero de instrucción se ajuste al otro lado cuando se mueve fuera de un borde.
Tarea
La tarea es bastante simple, escriba un programa Klein que, cuando se ejecute, genere la topología en la que se ejecuta. Los números individuales pueden estar separados por espacios. (p. ej., 000
y 0 0 0
ambos son salida permitida). Puede optar por usar o ignorar el -A
indicador de línea de comando, ya que no le costará bytes si lo usa.
Este es el código de golf, por lo que la respuesta más corta será el ganador.
Aquí hay un controlador de prueba en línea que se puede usar para probar todas las topologías a la vez. Para ejecutar en modo entero, elimine el -A
.
Respuestas:
5248 bytesPruébalo en línea!
Conductor de prueba
Explicación
En Klein, la IP comienza en la esquina superior izquierda hacia la derecha. El primer paso que quería que hiciera mi programa era enviar la IP desde la parte superior del programa para determinar el primer y el tercer bit. La IP volvería a ingresar al programa de la siguiente manera, según la topología:
Decidí que mi programa registraría el tercer bit de la topología antes del segundo bit, pero los cambiaría (usando
$
) antes del final. Con ese fin, agregué código para empujar el primer y el tercer bit de cada topología en los puntos de entrada de IP descritos anteriormente.Luego me concentré en las topologías con
1
o2
como su primer bit. Decidí recombinarlos y enviarlos al lado no conectado al lado norte para poder determinar su segundo bit.Convenientemente, esto reagrupó las topologías en su segundo bit para poder empujar eso a la pila.
Después de eso, solo necesitaba intercambiar el segundo y tercer bit y hacer que el programa terminara.
Ahora que las topologías con
1
o2
como su primer bit funcionaron, podría concentrarme en hacer que las topologías0
den el resultado correcto. El primer paso fue recombinarlos para que pudieran separarse en dos grupos en función de su segundo bit.Primero me enfoqué en esas topologías con
1
su segundo bit. Estos presentaron un desafío porque para ellos la IP estaba en una línea ya utilizada por las topologías2
como primer bit. Como sería difícil ajustar más de una instrucción en esa línea (se puede saltar una sola instrucción usando la!
instrucción) y me estaba quedando sin espacio en general, decidí redirigir la IP fuera de esa línea y reutilizar una1
instrucción existente para empujar el segundo bit.Ahora todo lo que quedaba por hacer para las topologías con
1
su segundo bit era arreglar el orden del segundo y tercer bit y terminar.Finalmente quedaron las topologías con
0
su segundo bit. No quedaba mucho espacio en el programa con el mayor espacio no utilizado en la línea superior, por lo que fue allí donde redirigí la IP para las topologías con0
su segundo bit.Todavía necesitaba presionar
0
por el segundo bit y arreglar el orden del segundo y tercer bit, así como terminar el programa. Afortunadamente, pude reutilizar una$
instrucción existente para que las instrucciones0
y@
pudieran caber en los espacios restantes.Finalmente, los nops se pueden quitar de los extremos de las líneas para obtener el programa final.
fuente
1168886776961605958545350 bytesPruébalo en línea!
fuente
-d
bandera, hará exactamente eso. Lamentablemente no funciona en TIO.44 41 40 3837 bytesPruébalo en línea!
Conductor de prueba.
Utiliza un cuadrado de 6 por 6. Lo más corto que podría obtener con un cuadrado de 8 por 8 son 38 bytes si alguien quiere intentar mejorarlo.
Explicación:
Uno el primer paso del código codifica los dos primeros números para los prefijos
0
y1
. Para2
, codifica el tercer número y luego el primero.Luego pasamos las IP a través del tercer borde para decidir el número final. Combinamos las IP con el mismo prefijo.
Para los prefijos
0
y1
, ambos salen del borde superior para decidir el tercer número.Para el
2
prefijo, las IP salen de las esquinas desde el borde inferior.Ambos bordes intercambian el primer y tercer número, empujan el segundo número y lo intercambian con el tercero para obtener el orden correcto.
fuente