Einführung
Schreiben Sie ein vollständiges Programm, das einen rechteckigen Block mit ASCII-Zeichen um 90 Grad im Uhrzeigersinn dreht. Wenn das Programm selbst um 90 Grad im Uhrzeigersinn gedreht wird, wird ein Block mit ASCII-Zeichen um 90 Grad gegen den Uhrzeigersinn gedreht.
Regeln
- Sie verwenden häufig keine integrierten Funktionen, mit denen Sie Matrizen drehen oder transponieren können. Beispielsweise sind in MATLAB / Octave
rot90
und dem Transponierungsoperator'
nicht zulässig. - Sie müssen ein vollständiges Programm schreiben, das STDIN und STDOUT oder das nächste Äquivalent verwendet.
- Ihr Programm muss rechteckig sein und davon ausgehen, dass die Eingabe ebenfalls rechteckig ist.
- Die Eingabe und Ausgabe sind durch Zeilenumbrüche getrennte Zeichenfolgen und enthalten keine nachgestellten Zeilenumbrüche.
Wenn Ihr Programm mit dem Quellcode als Eingabe ausgeführt wird, muss es sich um 90 Grad im Uhrzeigersinn drehen. Die Ausgabe muss ein zweites Programm in derselben Sprache sein, das seine Eingabe um 90 Grad gegen den Uhrzeigersinn dreht. Wenn das gedrehte Programm seinen Quellcode als Eingabe erhält, sollte er den Quellcode des ursprünglichen Programms ausgeben.
Hinweis: Beide Programme müssen für jede Eingabe funktionieren , nicht nur für ihren eigenen Quellcode. Daher ist ein aus einem Zeichen bestehender Quine nicht zulässig.
Beispiel
Angenommen, das Folgende ist ein gültiges Programm, das seine Eingabe in einer hypothetischen Sprache um 90 Grad dreht.
^f a2% 3
lk (^_^&
v
D8 $4 /
Wenn es mit sich selbst als Eingabe ausgeführt wird, gibt es ein anderes gültiges Programm aus, das seine Eingabe gegen den Uhrzeigersinn dreht:
D l^
8 kf
$ (a
4 ^2
_%
^
/v&3
Dieses zweite Programm gibt, wenn es sich selbst als Eingabe gegeben wird, das ursprüngliche Programm aus. Beachten Sie, dass die leere Zeile vier Leerzeichen enthalten sollte und in der vorletzten Zeile ein Leerzeichen nachgestellt ist, das beim Abzeichnen nicht gerendert werden kann. Zu klären:
$ examplelang program < program > rotProg
$ examplelang rotProg < rotProg > program1
$ diff -s program program1
Files program and program1 are identical
Kürzeste Sendung gewinnt. Standardlücken sind verboten.
quelle
:.+
über mehrere Zeilen aufgeteilt werden?:
und.
hängt von dem Zeichen nach ihnen ab, und Zeilenvorschübe sind nach beiden nicht gültig (und selbst wenn dies der Fall wäre, würde dies die Bedeutung des Programms ändern).C (gcc) ,
14201399463 BytesAh ... die Freude an Saiten unbestimmter Länge!
Angenommen,
sizeof(char*) == sizeof(int)
undsizeof(char**) <= 16
.Der neue Ansatz
Probieren Sie es online!
Ausgabe der oben genannten
Die Lösung war am Ende peinlich einfach. Sie erstellen ein Programm A, das sich im Uhrzeigersinn dreht, und ein Programm B, das sich gegen den Uhrzeigersinn dreht:
EIN
B
Bilden Sie ein Rechteck mit vernünftigen Proportionen und beschränken Sie A darauf.
Beschränken Sie Programm B auf ein Quadrat mit derselben Breite wie das für A plus zwei (für die zusätzlichen Kommentarzeilen am unteren Rand), drehen Sie es im Uhrzeigersinn und klopfen Sie es rechts neben Programm A, und Sie erhalten die obige Lösung.
Der alte Ansatz
Probieren Sie es online!
Ausgabe der oben genannten
quelle