Diese Frage ist von Kevin Cruijssens Frage inspiriert .
Jetzt, wo der Teppich ausgelegt ist, wollen wir ihn rollen. Ihre Aufgabe ist es, ein Programm zu schreiben, das eine Schnur nimmt und eine aus dieser Schnur hergestellte Spirale zurückgibt (die einen gerollten Teppich darstellt, von der Seite gesehen).
Das Verfahren für einen Schritt des Rollens des Teppichs ist das folgende. Es gibt ein Beispiel, um zu veranschaulichen, was ich meine. Beachten Sie, dass das Beispiel zum besseren Verständnis mit einem teilweise gerollten Teppich beginnt:
ac
rpet
- trenne den "Kopf" vom "Schwanz" des Teppichs: der Kopf ist das, was bisher gerollt wurde, der Schwanz ist das, was noch gerollt werden muss.
Head: ac Tail:
rp et
- Drehen Sie den Kopf um 90 ° im Uhrzeigersinn.
Rotated head: ra Tail (unchanged):
pc et
- wenn die Breite des neuen Kopfes (hier
2
) kleiner oder gleich der Länge des Schwanzes ist (hier2
)- Dann lege es oben auf den Schwanz
- Ansonsten wurde der Teppich (wie zu Beginn des Schritts) gerollt
New carpet: ra
pc
et
Wiederholen Sie den Vorgang so oft wie nötig.
Zwei Beispiele, die alle Schritte des Teppichrollens zeigen:
carpet
c
arpet
ac
rpet
ra
pc
et
0123456789
0
123456789
10
23456789
21
30
456789
432
501
6789
Einige Präzisionen:
- Sie müssen nicht alle Zwischenschritte anzeigen, sondern nur den gerollten Teppich (z. B. ist es perfekt, wenn Sie eine nicht iterative Methode zur Berechnung des Ergebnisses finden). Außerdem müssen Sie keine führenden Leerzeichen drucken. In den obigen Beispielen zeige ich sie nur zum Ausrichten von Elementen.
- Die Eingabe ist ein String, eine Liste / ein Array von Zeichen
- Die Ausgabe erfolgt als Standardausgabe oder als Datei.
- Die Eingabe ist nett: Die Länge beträgt mindestens 1 Zeichen und höchstens eine Konstante, die klein genug ist, um keine Probleme zu verursachen, aber Sie können diese Konstante nicht in Ihrem Programm verwenden. Der Inhalt der Zeichenfolge besteht nur aus netten Zeichen ([a-zA-Z0-9]), die nach Ihren Wünschen codiert werden.
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes. Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
- Fügen Sie außerdem eine Erklärung für Ihre Antwort hinzu, wenn Sie der Meinung sind, dass dies erforderlich ist.
ProgrammingPuzzlesAndCodeGolf
- Die endgültige Schwanzlänge größer als 1 hat mich gestolpert.print
in a verwenden kannlambda
.Antworten:
Kohle , 15 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Schlinge dich über den Teppich.
Überprüfen Sie, ob sich etwas über dem Cursor befindet.
Wenn nicht, dann rollen Sie den Teppich.
Bewegen Sie sich nach rechts und geben Sie das aktuelle Zeichen aus.
Beispiel: Für die Eingabe
0123456789
werden folgende Aktionen ausgeführt:0
gedruckt wird.Der Cursor bewegt sich nach rechts und
1
wird gedruckt.Da sich nichts über dem befindet
1
, wird die Leinwand gedreht.Der Cursor bewegt sich nach rechts und das
2
wird gedruckt.Da sich nichts über dem befindet
2
, wird die Leinwand gedreht.Der Cursor bewegt sich nach rechts und das
3
wird gedruckt.Der Cursor bewegt sich nach rechts und das
4
wird gedruckt.Da sich nichts über dem befindet
4
, wird die Leinwand gedreht.Der Cursor bewegt sich nach rechts und das
5
wird gedruckt.Der Cursor bewegt sich nach rechts und das
6
wird gedruckt.Da sich nichts über dem befindet
6
, wird die Leinwand gedreht.Der Cursor bewegt sich nach rechts und das
7
wird gedruckt.Der Cursor bewegt sich nach rechts und das
8
wird gedruckt.Der Cursor bewegt sich nach rechts und das
9
wird gedruckt.quelle
⟲
?Pyth, 37 Bytes
Versuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .
quelle
Schale , 24 Bytes
Probieren Sie es online!
Erläuterung
quelle
J , 69 Bytes
-3 Bytes dank FrownyFrog
Probieren Sie es online!
Erläuterung
Der Algorithmus ist unkompliziert, obwohl er für J etwas ausführlich ist.
Gesamtstrategie: Reduzieren Sie die Eingabe auf einen quadratischen Tisch mit einem (möglicherweise leeren) Reststück.
Beim Reduzieren verwenden wir eine Liste mit 2 Elementen. Unser "bisheriges Ergebnis" ist die erste Box, und "noch zu bearbeitende Artikel" ist die zweite Box. Das erste Feld wird mit dem Kopf der Eingabe initialisiert (aber in eine Tabelle konvertiert):
und "noch zu bearbeitende Elemente" ist der Schwanz der Eingabe:
Jetzt haben wir:
wobei das 'c' eigentlich eine 1x1-Tabelle ist.
Wir reduzieren das mit einer J Do ... While-Schleife:
Wo der Teil in Klammern die Bedingung "weitermachen" ist:
welches sagt "mach weiter so lange die Länge des rechten Kastens größer oder gleich der Länge des linken Kastens ist (dh die Seitenlänge der quadratischen Matrix)
Was bedeutet "weitermachen"?
^:
Dies ist im Verb links vom ersten definiert , das uns sagt, wie wir das aktuelle Ergebnis nehmen und die nächste Iteration erzeugen. Das Verb ist:Lassen Sie es uns aufschlüsseln:
Das heißt, dies ist nur der im OP beschriebene Algorithmus, der wörtlich in J übersetzt wurde.
Schließlich beschäftigen wir uns mit den (möglicherweise 0) verbleibenden Gegenständen, dem Schwanz unserer Teppichrolle:
Dies sagt "nimm alle außer der letzten Ulme des Ergebnisses":
und an
,
die letzten Elemente des Ergebnisses anhängen,{:@[
wobei die übrigen Elemente an das letzte Element angehängt werden, ]
quelle
,.
kann tun, was1 1$]
tut und$
kann als verwendet werden{.
.$ can be used as {.
- können Sie das klären?R ,
146132 BytesProbieren Sie es online!
Implementiert den Teppichrollvorgang. Übernimmt die Eingabe als Liste von Zeichen und druckt auf Standardausgabe.
Es wurden 14 Bytes gespart, indem eine Möglichkeit zur Verwendung einer
do-while
Schleife gefunden und mit initialisiert wurdeF
.quelle
Gelee , 30 Bytes
Scheint zu lang ...
Probieren Sie es online!
Wie?
quelle
05AB1E , 41 Bytes
Viel zu lange, aber ich wollte die Leinwand benutzen. Das war wahrscheinlich eine schlechte Wahl, jetzt wo ich fertig bin und es sich als so lang herausstellte.
Probieren Sie es online aus . (Keine Testsuite, da es ein seltsames Problem mit der
.Λ
eingebauten Software zu geben scheint .)Erläuterung:
Lassen Sie mich zunächst eine allgemeine Erläuterung des Canvas-Bereichs geben und erläutern, was mit meinem Code erreicht werden soll. Detailliertere Informationen finden Sie in meinem relevanten 05AB1E-Tipp , aber für diese Herausforderung wollte ich Folgendes tun:
Das Canvas-Builtin akzeptiert drei Parameter:
[2,2,3,3,4,4,5,5,...]
carpet
0123456789ABCDEFGHI
Wie für den Code:
Sehen Sie sich meinen Tipp 05AB1E (Abschnitt Wie komprimiere ich große ganze Zahlen? ) An, um zu verstehen, warum dies so
Ž8O
ist2064
.quelle
Python 3 , 112 Bytes
In diesem Fall ist der Ausgang der Wert der Funktion.
Probieren Sie es online!
Wenn Sie es vorziehen, hier eine andere (längere, 129 Bytes ) Lösung, die direkt die gerollte Eingabe druckt:
Probieren Sie es online!
quelle
MATLAB / Octave , 154 Bytes
Nicht die kürzeste, aber in MATLAB / Octave zu golfen macht immer Spaß :)
Probieren Sie es online!
quelle
disp
es, würde ich sagen , dass Sie das entfernen sollte ,disp
Leute zu informieren , die nicht R wissen , dass es funktioniert Schreiben in STDOUT standardmäßig