Transposer la quine

10

Dans cette variante quine, votre programme doit sortir son code source transposé sur la diagonale du coin supérieur gauche au coin inférieur droit. Par exemple:

votre programme
sur
quatre lignes

les sorties

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

L'espace dans la sortie n'est pas arbitraire. Les espaces apparaissent dans deux situations: où il y a un espace dans l'original (par exemple entre ret ldans la quatrième colonne) et où il est nécessaire de remplir les caractères (par exemple tous les espaces dans la première colonne.) Les deux sont obligatoires et les espaces ne peuvent apparaître nulle part sinon dans la sortie.

Une seule nouvelle ligne de fin dans la sortie peut éventuellement être ignorée. Les sauts de ligne dans le code source n'ont aucun effet sur la sortie et les retours à la ligne de début dans le code source doivent être traités comme dans l'exemple ci-dessus. Supposons que chaque caractère qui n'est pas un saut de ligne ait une colonne de large et une ligne de haut, même si pour des caractères comme tabulation, cela peut conduire à une sortie moche.

Votre solution doit avoir au moins deux lignes avec au moins deux caractères non-retour à la ligne chacun, et ne doit pas être sa propre transposition (la sortie ne peut pas être identique à la source.)

Les tricheries quines qui lisent à partir du fichier qui contient leur code source, extraient des données d'une URL, utilisent des fonctions intégrées de quining, etc. ne sont pas autorisées.

C'est le code golf: le code le plus court en octets gagne.

Luc
la source
Est-ce que cela doit être une vraie quine?
lirtosiast
2
@ThomasKwa Par opposition à?
Martin Ender
@ MartinBüttner Peut-être y a-t-il un langage où les littéraux sont repris en écho transposés. Au cas où.
lirtosiast
@ThomasKwa C'est très bien tant qu'il suit toutes les règles spécifiées.
Luke
L'utilisation de bibliothèques externes (comme Lodash en Javascript) est-elle interdite?
Mama Fun Roll

Réponses:

5

CJam, 14 octets

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

Testez-le ici.

Bien que plus courte, probablement un peu moins intéressante que la solution de Fission.

Explication

{       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
la source
10

Fission , 17 octets

Toujours ma langue préférée pour les quines ...

'"
!0
0+
;!
DN
"!

Essayez-le en ligne!

Explication

Ceci est assez similaire au quine de base de la fission . En fait, sans la règle "doit avoir au moins deux lignes avec au moins deux caractères non-retour", j'aurais simplement pu transposer cela et remplacer Rpar D. Cette règle rend les choses un peu plus intéressantes, car nous devons imprimer une autre ligne.

Le flux de contrôle commence au Davec un seul atome vers le sud. Puisqu'il frappe le, "il s'enroulera et s'imprimera

'!0;D

à STDOUT, similaire à ce qu'il serait dans le quine normal. '!définit ensuite la masse de l'atome sur le code de caractère de !. Le 0est un téléporteur qui transporte l'atome vers la deuxième colonne, où il se déplace toujours vers le sud.

Avec +nous incrémentons la masse de l'atome à la valeur de ". !N!les tirages devis, saut de ligne, devis. STDOUT ressemble maintenant à ceci:

'!0;D"
"

Après s'être enroulé, l'atome en frappe un autre "et affiche maintenant la deuxième ligne textuellement:

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

Nous avons fini maintenant. L'atome utilise à nouveau le téléporteur et atterrit dans le ;qui le détruit et termine ainsi le programme.

Je suppose que le plus net ici est d'en mettre un "en bas et l'autre en haut pour que je puisse les imprimer en une seule fois sans avoir à définir la valeur de !nouveau (car il serait écrasé en entrant à nouveau en mode chaîne).

Martin Ender
la source
3

Javascript ES6, 90 octets

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

Pas mal pas mal.

Explication

Voici le cadre standard de quine:

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

Pour modifier, je viens de diviser la chaîne de quine le long de nouvelles lignes et de caractères pour créer une matrice de caractères, transposée à l'aide de 2 fonctions de carte et jointe pour créer la sortie.

Mama Fun Roll
la source
3

Stax , 23 octets

"34bL:f2MMm
"34bL:f2MMm

Essayez-le en ligne!

Adaptation de la "34bL"34bLquine, qui est basée sur une idée utilisée dans les quines dans de nombreuses langues.

Weijun Zhou
la source
2

Befunge-93 , 57 octets

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

Cela fonctionne en plaçant chaque caractère dans la première colonne de la pile (sauf la citation elle-même), puis en imprimant chaque élément hors de la pile. Après cela, il imprime le devis, imprime une nouvelle ligne, puis passe à la deuxième colonne. Il fait la même chose sans imprimer une nouvelle ligne.

Vous pouvez le tester dans le lien dans le titre, mais vous devrez copier-coller le code vous-même dans la fenêtre. Si vous appuyez sur le bouton «lent», il vous montrera le chemin emprunté par le pointeur et la pile à ce moment-là.

Kevin W.
la source
Pourrait-il être plus court de déplacer la citation dans la deuxième colonne vers le haut comme je l'ai fait dans ma réponse Fission?
Martin Ender
Je peux déplacer la citation vers le haut et réorganiser la deuxième colonne et la faire fonctionner, mais elle finit toujours par être de 57 octets car la première colonne doit toujours être de la même hauteur
Kevin W.
Hm ok, je pensais que cela pourrait vous permettre de générer la "seule fois, afin que vous puissiez déplacer du code de la première colonne à la seconde.
Martin Ender
1

Python 2, 91 75 69 octets

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

Essayez-le en ligne

Explication:

Cela utilise une modification du quine standard:

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

Après modification:

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

Ce serait suffisant si une seule ligne était autorisée. Ensuite, j'ai ajouté deux caractères à la 2e ligne pour répondre à cette exigence. Les #caractères de la deuxième ligne peuvent être remplacés par n'importe quoi, tant que vous les modifiez également dans la première ligne et que le programme est syntaxiquement valide.

Pour l'imprimer correctement maintenant, je dois imprimer #à la fin des deux premières lignes. Je retire donc les deux premiers caractères de la chaîne set #j'imprime ceux avec avant l'impression s%s. J'ai mis l'un des #au début de spour enregistrer quelques octets en supprimant un littéral de nouvelle ligne.

mbomb007
la source