Sie wohnen in einem Terminal mit einer Breite von 80 Zeichen. Sie langweilen sich und entscheiden sich, Domino zu spielen. Nein, nicht die langweilige Art, die aussieht wie Scrabble, die lustige Art, in der Sie eine Stunde damit verbringen, sie einzustellen, um zu sehen, wie sie in einer Sekunde fallen.
In Terminals sehen Dominosteine folgendermaßen aus:
| upright domino
\ left-tilted domino
/ right-tilted domino
__ fallen domino
Wie wir alle wissen, wird, wenn ein geneigter Domino einen aufrechten berührt, auch der zweite Domino geneigt. Die einzige Ausnahme ist, wenn zwei geneigte Dominosteine es berühren:
|\ --> \\ /| --> // /|\ --> /|\
Passen Sie die Gravitationskonstante Ihres Terminals so an, dass dieser Übergang 100 ms dauert.
Wenn ein geneigter Domino von einem anderen Domino oder den Wänden des Terminals gestützt wird, endet seine Reise.
Keiner der gekippten Dominosteine
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
(80 Zeichen) werden verschoben, da die beiden äußersten geneigten Dominosteine von den Wänden des Terminals und alle anderen von anderen Dominosteinen unterstützt werden.
Wenn jedoch der Raum in der Kipprichtung leer ist, fällt der Domino herunter:
| \\ --> |__\ // | --> /__|
Terminal. Gravitationskonstante. Sie verstehen, worum es geht ...
Schließlich gibt es einen leichten Wind von links, so dass nach rechts geneigte Dominosteine schneller fallen als nach links geneigte:
|/ \| --> |__\|
Aufgabe
Schreiben Sie ein Programm / eine Funktion, die eine Animation zum Spielen von Dominosteinen in einem Terminal zeigt.
Ihr Code sollte Folgendes tun:
Liest eine Zeichenfolge aus der Eingabe, die den Anfangszustand der Dominosteine darstellt.
Diese Zeichenfolge enthält nicht mehr als 80 Zeichen und besteht ausschließlich aus den oben beschriebenen Dominosteinen und leeren Leerzeichen.
Drucken Sie den Status und warten Sie 100 ms.
Transformiere den Zustand wie oben beschrieben.
Wenn sich der Status geändert hat, kehren Sie zu 2 zurück.
Zusätzliche Regeln
Die Länge der Eingabezeichenfolge wirkt sich nicht auf die Breite des Terminals aus. Auch wenn die Zeichenfolge kürzer als 80 Zeichen ist, sind die Wände des Terminals immer noch 80 Zeichen voneinander entfernt.
Bei jeder Ausführung von Schritt 2 sollte der Status an derselben Stelle gedruckt werden und den vorherigen Status überschreiben.
Da einige Sprachen nicht in der Lage sind, genau 100 ms zu warten, können Sie zwischen 50 und 1000 ms warten.
Es gelten die Standardregeln für Code-Golf .
Beispiele
Für den Ausgangszustand
||\/||
drucke folgendes (übereinander):
||\/|| |\\//| \\\/// __\\//__
Für den Ausgangszustand
/||||\
Drucken Sie Folgendes aus
/||||\ //||\\ ///\\\
Für den Ausgangszustand
/|||\
Drucken Sie Folgendes aus
/|||\ //|\\
Für den Ausgangszustand
|/ \|/ \|/ \|/ \|
drucke folgendes aus:
|__\|__\|__\|__\|
Für den Ausgangszustand (80 Zeichen)
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
Drucken Sie Folgendes aus
\||||____||||/__ /|\ /\ /|\ __\||||____||||/
/
oder/|
und Sie werden sehen, dass die Kacheln nicht so fallen, wie sie sollten.\033
mit einem wörtlichen ESC-Byte ersetzen , wodurch 3 Byte eingespart werden.Perl 5,
154,146Musste ein temporäres Zeichen verwenden, um den Zustand zwischen 2 regulären Ausdrücken aufrechtzuerhalten.
Um mit dem Risiko umzugehen, dass so etwas wie / | | | \ würde als / / / \ \ anstelle von / / | enden \ \.
Prüfung
quelle
s, \\|/ ,__,g
anstelle vons/ \\|\/ /__/g
.ES6 ,
220218195 BytesMinimiert
Mehr lesbar
quelle
() = > {
und}()
kann einfach aus Ihrem Code entfernt werden. 2. Ich denke nicht, dass Warnungsfelder ein akzeptables Ausgabeformat für eine Animation sind. Sie können Ihre JS entweder in HTML einbetten oder die erforderlichen Änderungen vornehmen, damit sie von der Befehlszeile aus funktionieren. 3. In beiden Fällen muss Ihr Code ca. 100 ms zwischen dem Drucken eines Zustands und dem nächsten.console.log("^[c"+d)
stattdessen aufrufen , wo^[
sich das ESC-Zeichen befindet (ein Byte)..replace
auf[R='replace']
und dann auf ändern[R]
, verringert sich dies erheblich. Sie können auch ein paar Bytes einsparen, indem SiesetTimeout(f,100,d)
anstelle des aktuellen Setups verwenden.C #, 335 Bytes
Keine gute Wahl der Sprache.
Ich habe die Verzögerung zwischen 50 und 1000 missbraucht, um eine zweistellige Zahl zu wählen.
Neue Zeilen und Einrückungen zur Verdeutlichung hinzugefügt:
quelle
PHP, 175 Bytes
Nicht minimiert:
Grundsätzlich Regex Golf. Zerflacht zuerst alle fallenden Dominosteine, die Platz haben (und aufgrund der Reihenfolge von links nach rechts weht der "Wind"). Dann kommt der hässliche Teil (Fluch du schneidest!)
/|\
, dann überspringe es.(/)|
und durch ersetzen//
|(\)
und durch ersetzen\\
Dadurch fallen die Dominosteine. Warten Sie zum Schluss nur 100ms bis zum nächsten Schritt.
Die Verwendung
()
als Begrenzer für die Regex bedeutet, dass das/
s nicht entkommen muss, was nur minimal hilft!quelle
POSIX shell + sed, 144
Dies besteht aus zwei Teilen. Die Hauptaufgabe beim Umstürzen der Dominosteine ist
sed
das Ersetzen von Standardmustern , bei dem Linien im Laderaum gesammelt werden. Wir vorübergehend/|\
in/:\
sie zu schützen, am Ende gewinnt.Da
sed
es keine Möglichkeit zum Einfügen von Verzögerungen gibt (ich habe in terminfo / termcap nachgesehen, aber keine Standardmethode gefunden),printf "...\r"; sleep .1
füge ich jede Zeile ein, um alle 100 ms eine Zeile zu drucken. Ich mache das eigentlich zuerst, wenn wir nur eine Zeile haben, da die Zeichen im Befehl von keiner der Substitutionen des Umkippens berührt werden.Alle getestet mit
dash
und GNUcoreutils
, mitPOSIXLY_CORRECT
in der Umgebung eingestellt.quelle