Una forma es quiral si ninguna cantidad de rotación puede hacer que parezca una imagen especular. En este rompecabezas escribiremos programas informáticos quirales.
Para este rompecabezas pensaremos en un programa como una matriz rectangular de caracteres. Como tal, todas las soluciones a este desafío deben ser rectangulares (es decir, todas las líneas deben tener la misma longitud). Podemos rotar estos programas en incrementos de cuarto de vuelta. Por ejemplo el programa
The quickish fish
lept deftly
rightwards
Cuando se gira un cuarto de vuelta en el sentido de las agujas del reloj parece
T
h
r e
i
glq
heu
tpi
wtc
a k
rdi
des
sfh
t
lf
yi
s
h
También podemos reflejar estos programas. Aquí está el mismo programa reflejado sobre un eje vertical:
hsif hsikciuq ehT
yltfed tpel
sdrawthgir
Un programa quiral es un programa que cuando se rota cualquier número de veces siempre generará " left
". Sin embargo, cuando se refleja produce un programa que emite " right
" sin importar cuántas veces se gire.
Su tarea es escribir un programa quiral en la menor cantidad de bytes posible.
Reglas Adicionales
La salida no distingue entre mayúsculas y minúsculas, pero debe ser coherente. (p. ej., puede mostrar "
LEFT
" y "rIgHt
" pero esta carcasa debe ser coherente bajo rotaciones)Las líneas deben dividirse en una nueva línea o una nueva línea y un salto de línea.
Su programa debe ser un rectángulo, puede rellenarlo con espacios o comentarios, pero cada línea debe tener la misma longitud.
Si lo desea, puede tener una nueva línea final (o nueva línea y salto de línea) en todos sus programas.
fuente
:set virtualedit=all
modo de bloqueo de Vim . LaBool
salida inicial verifica si la entrada es igual a su propia rotación, lo que simplifica las cosas. Eliminarlo{-
hace que imprima la entrada reflejada.Respuestas:
Pascal (FPC) ,
2161755349 bytesIntenta a la izquierda
Intenta bien
@tsh me motivó a intentarlo nuevamente cuando vi su programa (en un comentario) y aquí está.
El anterior con 755 bytes:
Intenta a la izquierda
Intenta bien
Si viste mi envío anterior, solo olvídalo :)
Todas las rotaciones para los programas izquierdo y derecho son iguales.
fuente
Klein (000) ,
10987 bytesPruébalo en línea!
Debería ser posible obtener una versión más corta de esta respuesta, ¡así que buena suerte!
Esta respuesta está inspirada en espirales. En particular, la idea es dos espirales entrelazadas, una para la izquierda y otra para la derecha. Tiene una simetría doble, por lo que podemos verificar los siguientes programas para saber si funciona:
Cuarto de vuelta
Pruébalo en línea!
Reflejado
Pruébalo en línea!
Espejo y cuarto de vuelta
Pruébalo en línea!
fuente
Klein (000) ,
2725 bytesPruébalo en línea! Rotado una vez! Giró dos veces! Giró tres veces!
Y volteado: ¡ Pruébelo en línea! Rotado una vez! Giró dos veces! ¡Giró tres veces!
El único que me dio un poco de problemas fue el volteado y girado una vez, que se ve así:
Esta es la única razón para los dos conjuntos de
((
.fuente
Klein (211) , 37 bytes
Esto tiene un programa diferente para cada rotación.
Explicación
Tenga en cuenta que cada uno de estos programas se rellena a un cuadrado sin operaciones antes de la ejecución
Ningún cambio
Pruébalo en línea!
!
hace que la ejecución salte\
y"left"@
cargue la cadena"left"
en la pila y finaliza el programa que imprime la pilaCuarto de vuelta
Pruébalo en línea!
La ejecución se ejecuta en la esquina superior derecha del cuadrado, continúa en la esquina inferior izquierda y una vez más
!\"left"@
imprime"left
.Media vuelta
Pruébalo en línea!
Aquí, la ruta de ejecución sale del lado norte, vuelve a entrar a través del lado oeste, sale nuevamente del este antes de entrar en el sur.
\
rebota el camino"left"@
para imprimirlo.Giro de tres cuartos
Pruébalo en línea
La ejecución sale de la esquina superior derecha y luego vuelve a entrar en la esquina inferior izquierda. Una vez más, los espejos
/\
redirigen el camino"left"@
para imprimirlo.Reflexión
Esto es esencialmente lo mismo que para la izquierda en todas las rotaciones.
fuente
JavaScript (Node.js) ,
1481599505461341305271 bytesReflejado
Pruébalo en línea!
(Consulte el enlace TIO para ver todos los casos de prueba, incluida la versión duplicada)
Aunque más golf, tamaño
22x22 -> 21x21
a crédito de @JoKing!Tamaño
38x3824x2422x2221x2118x1817x1716x16, simetría de 4 veces.Aquí viene una pregunta: ¿es posible tener 15x15 o menos para JS? Parece que lo que necesito al menos es el separador de comentarios entre dos subbloques y en el borde, por lo que al menos 7 + 2 + 2 + 5 = 16 líneas.
fuente
Lienzo ,
1098971 bytesPruébalo aquí | ¡Intenta al revés! Esos son los dos únicos programas posibles, ya que el programa es rotacionalmente simétrico.
Hecho en esto .
fuente
Gol> <> , 23 bytes
Pruébalo en línea!
Este es el mismo formato que mi respuesta Klein , pero 2 bytes más corto. Tal vez hay otro lenguaje 2D por ahí que puede eliminar esos últimos 2 bytes ... Pero por ahora, esto es lo más corto posible.
fuente
Alice , 25 bytes
Izquierda: Normal , 1/4 de vuelta en sentido horario , 1/2 de vuelta , 1/4 de vuelta en sentido antihorario
Derecha: reflejar a través de eje horizontal , abajo a la derecha en diagonal , eje vertical , diagonal arriba-derecha
Explicación
Este programa tiene tres partes. La primera parte son los tres
{
sy uno}
en las esquinas. El{
giro de la IP a la izquierda hasta que llegue a la}
, en cuyo punto se gira a la derecha. En la versión reflejada, la IP va a lo largo de la fila superior del programa original. En la versión original, girar a la derecha golpeará inmediatamente al adyacente{
, apuntando la IP a lo largo de la fila inferior del programa original.Luego están las dos barras en la segunda columna. Si el programa está orientado horizontalmente, cualquier tipo de barra simplemente cambiaría al modo ordinal, enviando la IP en la misma dirección izquierda / derecha que ya estaba yendo. Si el programa está orientado verticalmente, la IP rebota un poco más, pero al hacer ambas barras inclinadas se obtiene el mismo resultado final. (Dos barras invertidas darían el resultado opuesto, y una de cada una crearía un bucle infinito).
El resto del programa es sencillo. La IP en modo ordinal rebota diagonalmente, por lo que se ejecutará
"left"o@
o"right"o@
se ejecutará dependiendo de cómo se ingresó esta sección.fuente
Hexagonía , 98 bytes.
Pruébalo en línea! El | Girado 90 ° | Girado 180 ° | Girado 270 °
invertido | Girado 90 ° e invertido | Girado 180 ° e invertido |Girado 270 ° e invertido
La hexagonía fue un poco divertida para este desafío, porque una rotación o una reversión pueden cambiar drásticamente el programa real. Cada rotación / inversión es su propio programa único. Algunas de las rutas de ejecución del programa son mucho más interesantes que otras.
Admito que llegar a esto tomó más tiempo de lo que probablemente debería haberlo hecho. Estoy bastante seguro de que se puede hacer una respuesta más corta en Hexagony, ¡así que buena suerte!
fuente
Rubí , 131 bytes
Pruébalo en línea!
fuente
APL (dzaima / APL) , 181 bytes
El programa tiene simetría rotacional, por lo que solo se deben verificar dos casos
Izquierda
Pruébalo en línea!
Derecho
Pruébalo en línea!
Explicación
Este es mi primer programa APL, por lo que es bastante simple. Solo usa un truco que creo que es interesante.
Si comenzamos eliminando todos los comentarios, obtenemos los siguientes programas
Izquierda
Derecho
A partir del programa de la izquierda, hacemos tres cosas.
Asignar
'lef'
a la variablet
Imprime la variable
t
y la letra't'
Asignar
'righ'
a la variablet
Ahora, debido a que es el espejo, el programa correcto realiza estos tres pasos pero en el orden opuesto. Esto significa que imprimimos
'left'
para el programa izquierdo y'right'
para el programa correcto.El único truco aquí es que en
't'
realidad proviene de una copia rotada del código. Si observa la tercera columna de nuestro código, verá que es así't'
. Reutilizamos esto't'
en las versiones rotadas para agregar lot
que se necesita.fuente
Haskell ,
461379 bytes82 bytes guardados por Ørjan Johansen
Pruébalo en línea!
Como este tiene una simetría cuádruple, solo necesita probar el espejo:
Pruébalo en línea!
Este es un comienzo. Está lejos de ser ideal, pero hay algunas cosas interesantes que suceden aquí. Haskell es sin duda un lenguaje interesante para este desafío. Espero una respuesta que supere a esta, ya sea mía o de otra persona.
fuente
Prólogo (SWI) ,
649188 bytesSin voltear, sin rotar
Pruébalo en línea!
Sin voltear, girado
Pruébalo en línea!
Volteado, sin rotar
Pruébalo en línea!
Volteado, girado
Pruébalo en línea!
fuente
Prólogo (SWI) ,
239223209181 bytesPruébalo en línea!
Dado que el programa tiene una simetría de 4 veces, solo necesita verificar el espejo:
Pruébalo en línea!
fuente
Python 2 , 209 bytes (14 x 14)
Normal (izquierda):
Pruébalo en línea!
Reflejado (derecha):
Pruébalo en línea!
fuente
Limpio ,
13311055 bytes-276 bytes gracias a Ørjan Johansen
Intenta "izquierda" en línea!
¡Prueba "correcto" en línea!
Esto fue difícil por muchas razones:
module <filename>
esté presente al inicio, y solo el inicio del archivo. Desafortunadamente, esto significa que para que las rotaciones del programa reflejado sean válidas, también tiene que aparecer al final del archivo. Para empeorar esto,module ..
no es válido para globallet .. in
,where ..
ywith ..
definiciones; y la fichamodule
aparece si no se ha definido causa un error./* /* */
deja un nivel de comentario abierto, y también lo hace/* // */
(además de comentar el resto de la línea).Afortunadamente, podemos definir
module
como algo en una#..
expresión (y mucho antes), que es todo lo que necesitamos. Debido a que Clean no comprueba las alternativas de verificación de tipo que nunca se usan (y una variedad de otras cosas igualmente no utilizadas), la segunda definición necesaria deStart
puede ser basura completa. Esto nos permite utilizar la segundaStart
para consumir la cabecera del módulo en la parte inferior del archivo porque trata limpiasm module m
como llamar a la funciónm
demodule
ym
(que ya hemos definidomodule
ym
, no causa un error). No importa quem
sea una cadena y no una función, porque elStart
alternativa nunca se verifica por tipo.Esto es más fácil de ver si lo miras a través de los ojos del compilador:
fuente
m
ys
.Brachylog , 341 bytes
Pruébalo en línea!
! enilno ti yrT
Aprovecha que Brachylog toma el predicado principal como el que está en la primera línea y no se preocupa mucho por las otras líneas más allá de requerir que puedan compilarse. Sin reflejo, imprime una cadena vacía seguida de "izquierda" en la misma línea, y refleja que imprime una cadena vacía seguida de "derecha" en la misma línea. Estoy tentado a pensar que podría haber una manera de hacer una versión (útilmente) no cuadrada usando
ṇ
, pero eso podría ser bastante complicado sin tratar de hacer que funcione de manera diferente bajo reflexión.fuente
Rubí , 181 bytes
Pruébalo en línea!
Este es un puerto de la respuesta Python de Curtis Bechtel a Ruby, un poco más de golf.
En realidad, su programa Python es un políglota y también se ejecuta en Ruby, por lo que mi primera respuesta fue copiar y pegar, pero parecía injusto. Entonces escribí un script que genera una nueva respuesta a partir de un script base. Puedes probarlo aquí:
Construye tu propio
fuente
Lote,
438321 bytesExplicación: A
:
se usa para indicar una etiqueta, que es tan buena como un comentario, por lo que, dado que el programa tiene simetría rotacional, la única diferencia entre las dos versiones es cuál de las@
líneas es la primera, en cuyo caso se generaleft
oright
sale antes del script salidasIntenté superponer creativamente las líneas rotadas entre sí, pero mi intento realmente terminó con una cuadrícula más grande.
Editar: Guardado 117 bytes gracias a @ ØrjanJohansen.
fuente
&rem
por&:
.test.bat
en el símbolo del sistema Win10.CMD.EXE
o algo así.05AB1E (heredado) ,
8955 bytesEnfoque muy básico. Salidas en minúsculas completas.
Pruébelo en línea o en línea reflejado (cada rotación es la misma).
Explicación:
Invertido:
Vea esta sugerencia mía 05AB1E (sección ¿Cómo usar el diccionario? ) Para comprender por qué
'…¸
es"left"
y'ĩ
es"right"
.fuente
q
?(legacy)
versión de 05AB1E.Stax , 131 bytes
Ejecutar y depurarlo
Esta es la variante "correcta".
fuente
Encantamientos rúnicos , 116 bytes
Pruébalo en línea!
Y revertido
No es exactamente un puerto, pero utilizó la respuesta Klein 000 de Post Left Garf Hunter como punto de partida, dada la compatibilidad casi típica de los dos idiomas (la mayoría de los comandos son los mismos y el ajuste del borde en Runic es idéntico al Klein 000). El único problema era que las IP de Klein siempre comienzan desde la parte superior izquierda y las Runic no. Como tal
.
, todos son parte del código original y Runic todavía los trata como NOP, mientras queson NOP que tuve que agregar como parte del control del flujo.
Huellas dactilares
"left"
en las 4 rotaciones y"right"
cuando se refleja (y en todas las cuatro rotaciones de la misma). Dos columnas del medio no se utilizaron por completo después de mis modificaciones, por lo que pude eliminarlas.En teoría, una rotación con mucho espacio en blanco al final podría usarse para un recuento de bytes más bajo (por ejemplo, esta variante ), sin embargo, los espacios son necesarios para rotar correctamente la estructura usando herramientas externas, por lo que los incluí.
Las siguientes variantes contienen los fragmentos no utilizados que se eliminaron, pero que son idénticos:
Las cuatro izquierdas . Salidas
leftleftleftleft
(el hecho de que los cuatro puedan ejecutarse así es una coincidencia).Derecha 1 , Derecha 2 , Derecha 3 , Derecha 4
fuente
Gol> <> , 342 bytes
¡Guauu! Eso tardó más de lo que esperaba, a mitad de camino me di cuenta de que el reflejo era vertical , ¡no horizontal como había estado codificando! Estoy bastante seguro de que esto funciona, pero si cometí un error, avíseme. Lo más probable es que esto pueda jugarse una cantidad ridícula más, simplemente tomé un método de fuerza bruta extrema para hacerlo. La forma en sí es en realidad un cuadrado, es técnicamente simétrica, excepto en el eje x, por lo que cuando se voltea, devuelve "DERECHA".
¡El personaje que hizo posible este programa es la 'A', que permite la teletransportación al comienzo de una línea determinada!
Pruébalo en línea!
fuente