Este desafío se crea para celebrar mi primer lenguaje esotérico, ¡ Revés !
El revés es un lenguaje unidimensional con un flujo de puntero no lineal. El puntero se mueve tres pasos a la vez, solo ejecuta cada tercera instrucción.
El programa 1..1..+..O..@
agregará 1 + 1 y la salida 2 antes de finalizar. Se omiten las instrucciones intermedias, así que1<>1()+{}O[]@
es exactamente el mismo programa.
Cuando el puntero está a punto de salir del final de la cinta, en su lugar invierte la dirección y avanza hacia el otro lado, por lo que [email protected]+.
es el mismo programa. Tenga en cuenta que solo cuenta la instrucción final una vez. Esto nos permite comprimir la mayoría de los programas lineales, como1O+1@
Su desafío aquí es escribir un programa o función que tome una cadena y muestre las instrucciones que se ejecutarían si el programa se interpretara como Revés (no necesita manejar ninguna instrucción real de Revés). Solo debe generar hasta que el puntero caiga en el último carácter de la cadena (en cuyo punto la ejecución normalmente iría hacia atrás).
¡Pero espera , eso no es todo! Cuando su propio programa se interpreta de esta manera, el código resultante debería generar uno de los siguientes:
(Mostly) works
Turing complete
'Recreational'
(las comillas pueden ser'
o"
, pero no ambas)Perfectly okay
Only a few bugs
Por ejemplo, si su código fuente es code 2 backhand
, entonces el programace cankb od2ahd
debería generar una de estas frases.
Casos de prueba:
"1 1 + O @" -> "11+O@"
"1O+1@" -> "11+O@"
"HoreWll dlo!" -> "Hello World!"
"abcdefghijklmnopqrstuvwxyz" -> "adgjmpsvyxurolifcbehknqtwz"
"0123456789" -> "0369" (not "0369630369")
"@" -> "@"
"io" -> "io" (Cat program in Backhand)
"!?O" -> "!?O" (Outputs random bits forever in Backhand)
"---!---!" -> "-!-----!"
Y un programa de referencia escrito en, por supuesto, Revés ( esto podría ser un poco defectuoso Ok, creo que lo he solucionado).
Reglas.
- Las lagunas estándar están prohibidas
- La entrada del primer programa contendrá solo ASCII imprimible y nuevas líneas (es decir, bytes
0x20
,0x7E
así como 0x0A) - Puede elegir si su segundo programa se convierte del primero en bytes o en caracteres UTF-8.
- Segundo programa:
- El caso no importa, por lo que su salida podría ser
pErFectLy OKay
si lo desea. - Cualquier cantidad de espacios en blanco al inicio / final (nueva línea, tabulaciones, espacios) también está bien.
- El segundo programa debe ser el mismo idioma que el primero, aunque no necesariamente el mismo formato (programa / función)
- Me complace incluir sugerencias de los comentarios sobre frases adicionales (siempre que no sean demasiado cortas)
- El caso no importa, por lo que su salida podría ser
- Como se trata de código de golf , ¡su objetivo es obtener la respuesta más breve para su idioma!
- En dos semanas, otorgaré una recompensa de 200 a la respuesta de revés más corta.
fuente
"---!---!"
(o cualquier cadena donde aparezca el último carácter más de una vez)Respuestas:
R , 187 bytes
Pruébalo en línea!
El espacio único al final es necesario para que
\n
nunca se imprima cuando el programa se aplica a sí mismo.Explicación
Parte 1:
Sin golf:
Parte 2:
La función produce esto cuando actúa en todo el programa:
fuente
Python 2 ,
1631301271211159996 bytesPruébalo en línea!
Salidas:
fuente
Perl 6 ,
10186 bytesWow, -25 bytes gracias a nwellnhof al mejorar drásticamente el primer programa
Pruébalo en línea!
Espero que más personas aprovechen el rebote de esta manera. El programa Backhanded es
Lo que comenta solo
{"(Mostly) works"}
.fuente
05AB1E ,
43403837 bytes-2 bytes (40 → 38) gracias a @Emigna .
Pruébalo en línea . (PD: cambie el idioma de 05AB1E (heredado) a 05AB1E para el caso de prueba
0123456789
. La versión heredada es más rápida, pero muestra resultados incorrectos para entradas numéricas con ceros a la izquierda).El programa 'backhanded' se convertirá en:
Lo que saldrá
perfectly okay
en minúscula completa.Pruébalo en línea.
Explicación del programa base:
Explicación del programa 'backhanded':
Paso a paso sucede lo siguiente:
„ÃеÝ
: STACK se convierte["perfectly okay"]
[
: Iniciar bucle infinitoN©
: STACK se convierte["perfectly okay", 0]
I
: STACK permanece["perfectly okay", 0]
porque no hay entrada#
: STACK se convierte["perfectly okay"]
y el bucle continúaN
: STACK se convierte["perfectly okay", 0]
#
: STACK se convierte["perfectly okay"]
y el bucle continúaN©
: STACK se convierte["perfectly okay", 1]
I
: STACK permanece["perfectly okay", 1]
porque no hay entrada#
: STACK se convierte["perfectly okay"]
y el bucle se rompe debido a la1
(verdad)perfectly okay
Vea los pasos aquí con el depurador en TIO habilitado.
Ver este consejo 05AB1E mío (sección Cómo usar el diccionario? ) Para entender por qué
„€€Ã€„Ѐ€µ'€Ý
sonthe pointed
,dm one
ybeen
e„ÃеÝ
esperfectly okay
.Versión antigua de 38 bytes:
Pruébalo en línea . (PD: cambie el idioma de 05AB1E (heredado) a 05AB1E para casos de prueba
0123456789
y@
. La versión heredada es más rápida, pero muestra resultados incorrectos para entradas numéricas con ceros iniciales o entradas de un solo carácter).El programa 'backhanded' se convertirá en:
(Donde
q
sale del programa y hace que todo lo demás no funcione).Pruébalo en línea.
fuente
/
debería ser `\`?N>3*©
lugar deXU
guardar 2. También siento que debería haber alguna forma de imprimir todo en el bucle, lo que ahorraría aún más bytes./
debería haber sido\
... Y gracias por el -2. De hecho, tengo la sensación de que se puede jugar más al golf. Parece demasiado largo para la funcionalidad básica de imprimir cada tercer valor, incluido el rebote.[ûDN3*©è?®IgD#<ÖNĀ*#
sin el if-else de antemano, que es 2 bytes más corto que el if-else con loop. Desafortunadamente, todavía necesitamos elq
programa backhanded, por lo que también será de 38 bytes . Pero tengo la sensación de que el descanso definitivamente se puede mejorar de alguna manera teniendo en cuenta las entradas de un solo carácter, el índice 0 y la divisibilidad por longitud-1 al mismo tiempo ...Python 2 , 130 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 130 bytes
Intento temprano No muy satisfactorio
Pruébalo en línea!
Cuando el código se procesa solo, se aíslan los siguientes caracteres:
lo que da:
fuente
Jalea , 34 bytes
Un programa completo o enlace monádico que acepta una lista de caracteres que imprime o produce (respectivamente).
Pruébalo en línea! O vea el conjunto de pruebas .
El código analizado de revés es entonces:
Un programa completo o un enlace niladic imprimiendo o produciendo (respectivamente) Turing completo .
¿Cómo?
el código analizado de revés es entonces:
fuente
Encantamientos rúnicos , 294 bytes
Pruébalo en línea!
Versión sin comprimir (y casi legible):
Pruébalo en línea!
Esto ... es lo más cerca que puedo llegar.
Comprimirlo aún más requeriría encontrar una manera de manejar los diversos puntos de intercambio de bucles sin que colisionen con otras cosas. Se requiere que la primera línea (que es la única parte que se debe pasar como entrada a sí misma) permanezca separada: la cadena completa no puede caber en la segunda línea sin causar problemas (
_
para los espacios requeridos):Eso
?
no se puede alejar de lo!
que en sí mismo no se puede alejar de\
y ninguno de los mensajes permitidos permite ninguno de estos tres caracteres en esta posición.La alternativa sería utilizar la redirección de flujo, pero eso lleva a un problema en la línea inferior:
Como tenemos que evitar el cambio de bucle en el programa principal.
Problemas conocidos:
abcdefghijklmnopqrstuvwxyz
pero no la totalidad de su propia fuente). Y hay un límite independientemente de cuántas fusiones ocurran. Puede manejar hasta 58 bytes de entrada tal como está (además, aumentar la cantidad de IP requiere descubrir cómo fusionarlas sin usar más espacio). Puede caber dos entradas IP más en la línea de retorno de bucle (a la derecha delU
inicio de la línea\y<<
en la versión sin comprimir, o una izquierda en la línea sobre ely<<
versión comprimida) elevando la longitud máxima de entrada a 78.1\ \ 1\ \ +\ \ O\ \ @
). Esta es una limitación del análisis de entrada del idioma.0
s (como cuando se convierte en un número en la pila,0
se pierde). Nuevamente, limitación del análisis de entrada del idioma.Cómo funciona
Entrada:
Bucle principal (todo lo que aparece en la pila está precedido por un dup):
@
. Verdadero: terminar. (Terminar comando ejecutado)Bucle secundario:
fuente