Betrachten Sie einen quadratischen Textblock mit einer Breite von N Zeichen und einer Höhe von N für eine ungerade Ganzzahl N, die größer als 1 ist.
Als Beispiel sei N = 5 und der Text:
MLKJI
NWVUH
OXYTG
PQRSF
ABCDE
Beachten Sie, dass dies das Alphabet (neben Z) ist, das von der unteren linken Ecke aus gegen den Uhrzeigersinn gedreht wurde. Es ist wie ein aufgerollter Teppich.
"Abrollen" des Textes um eine Vierteldrehung im Uhrzeigersinn, also FGHI
auf der gleichen Ebene wie das ABCDE
Ergebnis:
PONM
QXWL
RYVK
STUJ
ABCDEFGHI
Dieses Abrollen kann noch sieben Mal durchgeführt werden, bis der Text eine einzige Zeile ist:
SRQP
TYXO
UVWN
ABCDEFGHIJKLM
UTS
VYR
WXQ
ABCDEFGHIJKLMNOP
WVU
XYT
ABCDEFGHIJKLMNOPQRS
XW
YV
ABCDEFGHIJKLMNOPQRSTU
YX
ABCDEFGHIJKLMNOPQRSTUVW
Y
ABCDEFGHIJKLMNOPQRSTUVWX
ABCDEFGHIJKLMNOPQRSTUVWXY
Herausforderung
Die Herausforderung besteht darin, ein Programm zu schreiben, das ein N × N-Textblock ist, der die Häufigkeit ausgibt, mit der er um eine viertel Umdrehung "abgewickelt" wurde, wenn er in die Abwicklungsmuster umgeordnet und ausgeführt wird.
Hier gibt es wirklich zwei Wettbewerbe: (Hoffentlich wird es nicht zu chaotisch)
- Tun Sie dies mit dem kleinsten N. (bis zu einer Grenze von N = 3)
- Tun Sie dies mit dem größten N. (keine Begrenzung)
Es wird keine akzeptierte Antwort geben, aber der Gewinner in jeder dieser Kategorien erhält mindestens 50 Kopfgeldreplikationen von mir. Bei Gleichstand gewinnt die älteste Antwort.
Beispiel
Wenn Ihr Codeblock ist
MyP
rog
ram
Läuft es so, wie es ist, sollte es 0 ausgeben.
Laufen
rM
oy
ramgP
sollte 1 ausgeben.
Laufen
or
ramgPyM
sollte 2 ausgeben.
Laufen
o
ramgPyMr
sollte 3 ausgeben.
Zum Schluss sollte running ramgPyMro
4 ausgeben.
Einzelheiten
- Die Ausgabe sollte von selbst auf stdout (oder die nächstgelegene Alternative) gedruckt werden. Es erfolgt keine Eingabe.
- Sie dürfen in Ihrem Code nur druckbare ASCII-Zeichen (Hex-Codes 20 bis 7E, einschließlich Leerzeichen) verwenden.
- Leerzeichen füllen den leeren Raum in den Abrollvorrichtungen. (Es sei denn, Sie rollen nach links ab.)
- Nur die Anordnungen von vollständig quadratisch bis vollständig flach müssen eine gültige Ausgabe haben. Es werden keine anderen Vereinbarungen getroffen.
- Sie können Ihre eigene Quelle nicht lesen.
- Sie können Kommentare verwenden.
- N = 1 ist ausgeschlossen, da das Programm in vielen Sprachen
0
funktionieren würde. Falls gewünscht, können Sie sich eher nach links als nach rechts abrollen. Also zB
MyP rog ram
wird
Pg yo Mrram
und so weiter. Beim Rollen auf diese Weise werden keine zusätzlichen Leerzeichen hinzugefügt. Die Zeilen enden einfach
(Siehe auch: Schreiben eines rechteckigen Programms, das ausgibt, wie oft gedreht wurde. )
quelle
Antworten:
Golfscript, N <- [5,7 ..]
Vollständig ausgerollt:
Erläuterung:
.
(mehrmals) - duplizieren Sie die Eingabe]
- Sammeln Sie den Stapel in einem einzigen Array,
- Nimm seine Länge9\-
- subtrahiere es von 9#
- ZeilenkommentarWhitespace ist ein NOP, aber jeder andere NOP hätte genauso gut funktioniert.
Vollständig aufgerollt werden neun Kopien der Eingabe (Inhalt ignoriert) als Stapel verwendet. 9 - 9 = 0; es wurde nicht abgerollt.
Bei jedem Abrollen wird ein weiterer Punkt (Duplikat) hinter dem Kommentar ausgeblendet, wodurch der Stapel einmal verkleinert und die Ausgabe erhöht wird.
Vollständig entrollt, verwendet es nur die Eingabe (Inhalte ignoriert) als Stapel; 9-1 = 8; es wurde 8 mal abgerollt.
Der gleiche Ansatz gilt für alle N> 4: Ändern Sie
9
den Wert auf 2 * N + 1 und erweitern Sie dann das Punktmuster (Duplikat) mit demselben Spiralmuster, das sicherstellt, dass genau ein Punkt beim Abrollen abgewickelt wird.quelle
GolfScript, N = 4
Dieses eine Recht rollt als ursprüngliche Spezifikation.
Hier sind die Abwicklungen:
Probieren Sie es hier aus
quelle
.
s und#
s eins machen ?~
. Vielleicht kann ich es für N = 3 stehlen?APL, N = 3
Abgerollt:
Probieren Sie es online aus.
Der Rest dieser Zahl wird durch 5 geteilt. Es wird nur das Ergebnis der letzten Zeile gedruckt.
APL, N = 2
Abgerollt:
Probieren Sie es online aus.
≡
Gibt die Tiefe (nicht zu verwechseln mit der Dimension oder Länge) eines Arrays zurück:0
ist kein Array. Die Tiefe ist also 0.0∞
ist ein Array mit zwei Elementen0
und∞
(unendlich). Es hat Tiefe 1.0∞⍬
hat ein weiteres Element⍬
, das ein leeres Array mit der Tiefe 10∞⍬
ist. Hat also die Tiefe 2.Diese beiden Programme funktionieren auch im Online-Interpreter. Ich bin mir nicht sicher, ob der spätere syntaktisch korrekt ist.
APL, für ein beliebiges N> = 4
Für N = 4:
Vollständig ausgerollt:
Für N = 5:
Vollständig ausgerollt:
1↓
Entfernt ein Element im Array. Es gibt auch das leere Array zurück, wenn das Argument skalar ist.⍴
Ruft die Array-Länge ab.quelle
()[]
sie an einer unerwünschten Stelle erscheinen.