Quine transponieren

10

In dieser Quine-Variante muss Ihr Programm seinen Quellcode ausgeben, der über die Diagonale von links oben nach rechts unten transponiert ist. Beispielsweise:

Ihr Programm
auf
vier Zeilen

Ausgänge

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

Das Leerzeichen in der Ausgabe ist nicht beliebig. Leerzeichen werden in zwei Situationen angezeigt: Wenn im Original ein Leerzeichen vorhanden ist (z. B. zwischen rund lin der vierten Spalte) und wenn Zeichen aufgefüllt werden müssen (z. B. alle Leerzeichen in der ersten Spalte). Beide sind erforderlich, und Leerzeichen können nirgendwo angezeigt werden sonst in der Ausgabe.

Ein einzelner nachfolgender Zeilenumbruch in der Ausgabe kann optional ignoriert werden. Nachfolgende Zeilenumbrüche im Quellcode haben keine Auswirkungen auf die Ausgabe, und führende Zeilenumbrüche im Quellcode müssen wie im obigen Beispiel behandelt werden. Angenommen, jedes Zeichen, das keine neue Zeile ist, ist eine Spalte breit und eine Zeile hoch, obwohl dies bei Zeichen wie tab zu einer hässlichen Ausgabe führen kann.

Ihre Lösung muss mindestens zwei Zeilen mit jeweils mindestens zwei Zeichen ohne Zeilenumbruch enthalten und darf keine eigene Transponierung sein (die Ausgabe kann nicht mit der Quelle identisch sein.)

Das Betrügen von Quines , die aus der Datei lesen, die ihren Quellcode enthält, Daten von einer URL abruft, integrierte Quining-Funktionen verwendet usw. ist nicht zulässig.

Dies ist Code Golf: Der kürzeste Code in Bytes gewinnt.

Luke
quelle
Muss dies eine echte Quine sein?
Lirtosiast
2
@ThomasKwa Im Gegensatz zu?
Martin Ender
@ MartinBüttner Vielleicht gibt es eine Sprache, in der Literale transponiert wiedergegeben werden. Nur für den Fall.
Lirtosiast
@ThomasKwa Das ist in Ordnung, solange alle angegebenen Regeln eingehalten werden.
Luke
Ist die Verwendung externer Bibliotheken (wie Lodash in Javascript) verboten?
Mama Fun Roll

Antworten:

5

CJam, 14 Bytes

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

Testen Sie es hier.

Während kürzer, wahrscheinlich etwas weniger interessant als die Fission-Lösung.

Erläuterung

{       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
quelle
10

Spaltung , 17 Bytes

Immer noch meine Lieblingssprache für Quines ...

'"
!0
0+
;!
DN
"!

Probieren Sie es online aus!

Erläuterung

Dies ist dem grundlegenden Fission Quine ziemlich ähnlich . In der Tat, Regel „müssen mindestens zwei Leitungen mit mindestens zwei nicht-Zeilenumbrüche jeweils“ wenn es nicht für das war , konnte ich einfach umgesetzt haben , dass und ersetzen Rmit D. Diese Regel macht die Dinge allerdings etwas interessanter, da wir eine weitere Zeile drucken müssen.

Der Kontrollfluss beginnt am Dmit einem einzelnen Atom, das nach Süden geht. Da es auf das trifft ", wird es umwickelt und gedruckt

'!0;D

zu STDOUT, ähnlich wie bei der normalen Quine. '!setzt dann die Masse des Atoms auf den Zeichencode von !. Das 0ist ein Teleporter, der das Atom zur zweiten Säule transportiert, wo es sich noch nach Süden bewegt.

Mit +erhöhen wir die Masse des Atoms auf den Wert von ". !N!die Drucke Zitat, Zeilenvorschub, Zitat. STDOUT sieht jetzt so aus:

'!0;D"
"

Nach dem Umwickeln trifft das Atom ein anderes "und druckt nun die zweite Zeile wörtlich:

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

Wir sind jetzt fertig. Das Atom benutzt den Teleporter erneut und landet in dem, ;der ihn zerstört und dadurch das Programm beendet.

Ich nehme an, das Schönste hier ist, eins "unten und das andere oben zu platzieren, damit ich sie auf einmal drucken kann, ohne den Wert von noch !einmal einstellen zu müssen (weil es durch erneutes Aufrufen des String-Modus überschrieben würde).

Martin Ender
quelle
3

Javascript ES6, 90 Bytes

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

Nicht schlecht nicht schlecht.

Erläuterung

Hier ist das Standard-Quine-Framework:

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

Zum Ändern habe ich einfach die Quine-Zeichenfolge entlang Zeilenumbrüchen und Zeichen aufgeteilt, um eine Zeichenmatrix zu erstellen, die mit zwei Kartenfunktionen transponiert und zur Erstellung der Ausgabe zusammengefügt wurde.

Mama Fun Roll
quelle
3

Stax , 23 Bytes

"34bL:f2MMm
"34bL:f2MMm

Probieren Sie es online aus!

Anpassung der "34bL"34bLQuine, die auf einer Idee basiert, die in Quines in vielen Sprachen verwendet wird.

Weijun Zhou
quelle
2

Befunge-93 , 57 Bytes

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

Dies funktioniert, indem jedes Zeichen in der ersten Spalte des Stapels (mit Ausnahme des Zitats selbst) eingefügt und dann jedes Element vom Stapel gedruckt wird. Danach druckt es das Zitat, druckt eine neue Zeile und wechselt dann zur zweiten Spalte. Es funktioniert genauso, ohne eine neue Zeile zu drucken.

Sie können es über den Link im Titel testen, müssen den Code jedoch selbst kopieren und in das Fenster einfügen. Wenn Sie auf die Schaltfläche "Langsam" klicken, wird der Pfad des Zeigers und der Stapel angezeigt.

Kevin W.
quelle
Könnte es kürzer sein, das Zitat in der zweiten Spalte nach oben zu verschieben, wie ich es in meiner Fission-Antwort getan habe?
Martin Ender
Ich kann das Zitat nach oben verschieben und die zweite Spalte neu anordnen und es funktioniert immer noch, aber es endet immer noch mit 57 Bytes, da die erste Spalte immer noch dieselbe Höhe haben muss
Kevin W.
Hm okay, ich dachte, es könnte Ihnen erlauben, das "nur einmal zu generieren , so dass Sie etwas Code von der ersten Spalte in die zweite verschieben können.
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)
##

Probieren Sie es online aus

Erläuterung:

Dies verwendet eine Modifikation des Standardquins:

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

Nach der Modifikation:

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

Dies würde ausreichen, wenn eine einzelne Zeile zulässig wäre. Dann habe ich der 2. Zeile zwei Zeichen hinzugefügt, um diese Anforderung zu erfüllen. Das# Zeichen in der zweiten Zeile können durch alles ersetzt werden, solange Sie sie auch in der ersten Zeile ändern, und das Programm wird syntaktisch gültig.

Um es jetzt richtig zu drucken, muss ich #am Ende der ersten beiden Zeilen drucken . Also entferne ich die ersten beiden Zeichen aus der Zeichenfolge sund drucke diese #vor dem Drucken mit s%s. Ich habe eines der Zeichen #am Anfang gesetzt s, um einige Bytes durch Entfernen eines Zeilenumbruchliterals zu sparen.

mbomb007
quelle