Transponer quine

10

En esta variante de quine, su programa debe generar su código fuente transpuesto a través de la diagonal desde la parte superior izquierda a la parte inferior derecha. Por ejemplo:

su programa
en
cuatro lineas

salidas

 yof
 ono
 u u
 r r
    
 p l
 r i
 o n
 g e
 r s
 a
 m

El espacio en blanco en la salida no es arbitrario. Los espacios aparecen en dos situaciones: donde hay un espacio en el original (por ejemplo, entre ry len la cuarta columna) y donde es necesario rellenar caracteres (por ejemplo, todos los espacios en la primera columna). Ambos son obligatorios y los espacios no pueden aparecer en ninguna parte más en la salida.

Opcionalmente, se puede ignorar una nueva línea final en la salida. Las nuevas líneas finales en el código fuente no tienen efecto en la salida, y las nuevas líneas principales en el código fuente deben manejarse como en el ejemplo anterior. Suponga que cada carácter que no es una nueva línea tiene una columna de ancho y una fila de alto, aunque para caracteres como tabulación esto puede generar una salida fea.

Su solución debe tener al menos dos líneas con al menos dos caracteres que no sean de nueva línea cada una, y no debe ser su propia transposición (la salida no puede ser idéntica a la fuente).

No se permiten trampas que leen del archivo que contiene su código fuente, extraen datos de una URL, usan las funciones integradas de comillas, etc.

Este es el código de golf: el código más corto en bytes gana.

Luke
fuente
¿Esto necesita ser una verdadera quine?
lirtosiast
2
@ThomasKwa A diferencia de?
Martin Ender
@ MartinBüttner Quizás haya un lenguaje en el que los literales se repitan transpuestos. Por si acaso.
lirtosiast
@ThomasKwa Eso está bien siempre que siga todas las reglas especificadas.
Luke
¿Está prohibido el uso de bibliotecas externas (como Lodash en Javascript)?
Mama Fun Roll

Respuestas:

5

CJam, 14 bytes

{`"_~".+N*}
_~

Pruébalo aquí.

Si bien es más corto, probablemente sea un poco menos interesante que la solución de fisión.

Explicación

{       e# Quine framework. Runs the block while another copy of it is on the stack.
  `     e# Stringify the block.
  "_~"  e# Push the remaining code as a string.
  .+    e# Element-wise append... essentially puts the two strings in a grid and 
        e# transposes it.
  N*    e# Join with linefeeds.
}_~
Martin Ender
fuente
10

Fisión , 17 bytes

Sigue siendo mi idioma favorito para quines ...

'"
!0
0+
;!
DN
"!

Pruébalo en línea!

Explicación

Esto es bastante similar a la quine de fisión básica . De hecho, si no fuera por la regla "debe tener al menos dos líneas con al menos dos caracteres que no sean de línea nueva cada una", simplemente podría haber transpuesto eso y reemplazarlo Rpor D. Sin embargo, esa regla hace las cosas un poco más interesantes, porque necesitamos imprimir otra línea.

El flujo de control comienza en el Dcon un solo átomo hacia el sur. Como golpea ", se envolverá e imprimirá

'!0;D

STDOUT, similar a como lo haría en la quine normal. '!luego establece la masa del átomo al código de caracteres de! . El 0es un teletransportador que transporta el átomo a la segunda columna, donde todavía se mueve hacia el sur.

Con +nosotros incrementamos la masa del átomo al valor de ". !N!las impresiones cita, salto de línea, cita. STDOUT ahora se ve así:

'!0;D"
"

Después de envolverse, el átomo golpea a otro "y ahora imprime la segunda línea al pie de la letra:

'!0;D"
"0+!N!

Ya hemos terminado. El átomo usa el teletransportador una vez más, y aterriza en el ;que lo destruye y, por lo tanto, termina el programa.

Supongo que lo mejor es poner uno "en la parte inferior y el otro en la parte superior para que pueda imprimirlos de una vez sin tener que establecer el valor de !una vez más (porque se sobrescribirá al ingresar nuevamente al modo de cadena).

Martin Ender
fuente
3

Javascript ES6, 90 bytes

$=_=>[...(_=`$=${$};$()`.split`
`)[0]].map((x,y)=>_.map(v=>[...
v][y]).join``).join`
`;$()

No esta mal, no está mal.

Explicación

Aquí está el marco estándar de quine:

$=_=>`$=${$};$()`;$()

Para modificar, simplemente dividí la cadena de quine a lo largo de nuevas líneas y caracteres para crear una matriz de caracteres, transpuesta usando 2 funciones de mapa y unida para crear la salida.

Mama Fun Roll
fuente
3

Stax , 23 bytes

"34bL:f2MMm
"34bL:f2MMm

Pruébalo en línea!

Adaptación de la "34bL"34bLquine, que se basa en una idea utilizada en quines en muchos idiomas.

Weijun Zhou
fuente
2

Befunge-93 , 57 bytes

^
_^
,@
+,
5*
52
,+
*9
28
+|
9
8#
|!
 ,
##
!:
,^
#
:
^
""

Esto funciona colocando cada carácter en la primera columna de la pila (excepto la cita en sí), luego imprime cada elemento fuera de la pila. Después de eso, imprime la cita, imprime una nueva línea y luego pasa a la segunda columna. Hace lo mismo sin imprimir una nueva línea.

Puede probarlo en el enlace del título, pero deberá copiar y pegar el código en la ventana usted mismo. Si presiona el botón 'lento', le mostrará el camino que toma el puntero y la pila en ese momento.

Kevin W.
fuente
¿Podría ser más corto mover la cita en la segunda columna a la parte superior como hice en mi respuesta de fisión?
Martin Ender
Puedo mover la cita a la parte superior y reorganizar la segunda columna y hacer que siga funcionando, pero termina siendo de 57 bytes ya que la primera columna todavía debe tener la misma altura
Kevin W.
Bien, pensé que podría permitirte generar la "única vez, para que pudieras cambiar algo de código de la primera columna a la segunda.
Martin Ender
1

Python 2, 91 75 69 bytes

s='#%r;print"s#\\n="+"\\n".join(s%%s)';print"s#\n="+"\n".join(s%s)
##

Pruébalo en línea

Explicación:

Esto utiliza una modificación de la quine estándar:

s='s=%r;print s%%s';print s%s

Después de la modificación:

s='s=%r;print"\\n".join(s%%s)';print"\n".join(s%s)

Esto sería suficiente si se permitiera una sola línea. Luego, agregué dos caracteres a la segunda línea para cumplir con ese requisito. los# caracteres en la segunda línea se pueden reemplazar con cualquier cosa, siempre que los cambie también en la primera línea y haga que el programa sea sintácticamente válido.

Para imprimirlo correctamente ahora, tengo que imprimir #al final de las dos primeras líneas. Así que elimino los dos primeros caracteres de la cadena se imprimo con #antes de imprimir s%s. Puse uno de los #al principio de spara guardar algunos bytes eliminando un literal de nueva línea.

mbomb007
fuente