In den Vereinigten Staaten sind die beiden entgegengesetzten Verkehrsrichtungen auf einer Straße durch eine gestrichelte gelbe Linie getrennt, wenn die Weitergabe zulässig ist, und durch zwei durchgezogene gelbe Linien, wenn die Weitergabe nicht zulässig ist.
(Nur eine Seite kann gestrichelt sein, um das Überholen dieser Seite zu ermöglichen, und gelbe Linien können andere Dinge wie Mittelspuren oder umkehrbare Fahrspuren bedeuten, aber wir sind mit keinem dieser Fälle befasst.)
Schreiben Sie ein Programm, das eine lauflängencodierte Zeichenfolge P
zum Übergeben und N
zum Nichtübergeben verwendet und eine ASCII-Version der entsprechenden Straße ausgibt. Abgesehen von der Mittellinie weist die Straße immer das gleiche Muster auf, was aus den folgenden Beispielen leicht abgeleitet werden kann.
Vor P
und N
in der Eingabezeichenfolge steht eine positive Dezimalzahl . Diese Zahl definiert die Länge des vorbeifahrenden oder nicht vorbeifahrenden Bereichs des aktuellen Straßenteils.
Beispiele
Eine Eingabe von 12N
würde 12 Spalten ohne vorbeifahrende Straße erzeugen (Mittellinie alle =
):
____________
============
____________
Eine Eingabe von 12P
würde 12 Spalten einer vorbeifahrenden Straße erzeugen ( -
Wiederholung der Mittellinie ):
____________
- - - - - -
____________
Bestehen und Nichtbestehen können dann kombiniert werden, zB 4N4P9N7P1N1P2N2P
würde ergeben:
______________________________
====- - =========- - - -=-==-
______________________________
Dies sind 4 nicht passierende Spalten, dann 4 passierende , dann 9 nicht passierende usw.
Beachten Sie, dass eine vorbeifahrende Zone immer mit einem Bindestrich ( -
) ganz links und nicht mit einem Leerzeichen ( ) beginnt . Dies ist erforderlich.
Einzelheiten
- Der Eingang wird niemals zwei
N
Zonen oder zweiP
Zonen hintereinander haben. zB4P5P
wird niemals auftreten. - Sie müssen keine Buchstaben ohne führende positive Zahl unterstützen. Einfach
P
wird es immer sein1P
, einfachN
wird es immer sein1N
. - Es kann nachgestellte Leerzeichen geben, solange diese nicht über die letzte Straßensäule hinausragen. Es kann eine optionale nachgestellte Newline geben.
- Anstelle eines Programms können Sie eine Funktion schreiben, die die lauflängencodierte Zeichenfolge einliest und die ASCII-Straße ausgibt oder zurückgibt.
- Übernimmt die Eingabe auf jede Standardart (stdin, Kommandozeile, Funktion arg).
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist früherer Beitrag.
Antworten:
CJam, 38 Bytes
Wie es funktioniert
Wir weisen Variablen zuerst die richtige Straßenspalte zu
N
undP
werten dann einfach die Eingabezeichenfolge aus. Dies lässt ein Paar der Länge und der Säule auf dem Stapel. Wir gruppieren sie, führen eine RLD darauf aus, um die vollständigen Spalten zu erhalten, transponieren, um sie zu verbinden, und konvertieren schließlich die kontinuierliche--
in-
.Probieren Sie es hier online aus
quelle
JavaScript (ES6), 114
Bei Verwendung von Template-Strings müssen die 5 Zeilenvorschübe gezählt werden, die von Bedeutung sind.
quelle
rs , 252 Zeichen
Obwohl dies möglicherweise nicht zählt, weil ich den Konvergenzoperator vor einer Stunde als Abzocke von Martin Büttners Retina hinzugefügt habe ... Ich bin sowieso nicht wirklich hier, um zu konkurrieren. Es macht einfach Spaß, eine auf Regex basierende Lösung dafür zu entwickeln.
Ich habe Zeile 2 von Martins Retina-Antwort für Programmiersprachen im Laufe der Jahre erhalten .
Erläuterung
Das macht viel Magie. Weitere Informationen finden Sie in der Antwort, die ich oben verlinkt habe.
Grundsätzlich ist dies mit der Eingabe
4N4P9N7P1N1P2N2P
das Ergebnis:Nächster:
Dies ersetzt die Zahlen vor dem Symbol (N) durch die Gleichheitszeichen. Das Ergebnis mit der vorherigen Eingabe:
Dies:
Ersetzt die erste Zahl vor einem vorbeiziehenden Symbol (P) durch den ersten Strich. Das Ergebnis:
Die nächsten beiden Zeilen folgen demselben Muster:
Die erste Zeile ersetzt den Rest der Zeile durch das Bindestrichmuster. Der zweite behandelt eine ungerade Zahl; Es ersetzt den letzten Bindestrich, gefolgt von einer einzelnen Ganzzahl (wie z. B.
-5
), durch ein Bindestrich-Leerzeichen (-
). Die Ausgabe lautet nun:Jetzt fangen die Dinge an, sich zu fügen. Die nächste Zeile:
entfernt einfach das
#N
und#P
.Richten Sie die Unterstriche oben und unten ein, um Folgendes zu erhalten:
Zuletzt entfernen wir die
A
:quelle
Haskell, 165 Bytes
Beispiellauf (
f
gibt einen String zurück, um ihn besser anzuzeigen, drucken Sie ihn aus):Funktionsweise:
p
Gibt die mittlere Zeile zurück, indem die Eingabezeichenfolge rekursiv analysiert und die angegebene Anzahl von Symbolen verkettet wird, die von der Suchfunktion gefunden wurdenk
. Die Hauptfunktionf
verbindet eine Liste mit fünf Elementen mit Zeilenumbrüchen, bestehend aus der obersten Zeile (jedes Zeichen der mittleren Zeile wird durch ersetzt_
), einer neuen Zeile, der mittleren Zeile, einer leeren Zeile und der untersten Zeile (wie oben).quelle
Python 3,
169168 Bytes. (167 mit Python 2)Ziemlich ungolfed:
Probieren Sie es hier online aus .
quelle
p+=['='*v,('- '*v)[:v]][_[-1]=='P']
am Ende der vorherigen Zeile ein vorangestelltes Semikolon einfügen, wird ein Byte gespeichert.print
.Python 2, 136 Bytes
Überraschenderweise
re
scheint sich der Import hier tatsächlich zu lohnen.quelle
PHP, 187 Bytes
Der Code kann in einer einzelnen Zeile stehen bleiben. Es wird hier in mehreren Zeilen angezeigt, um die Lesbarkeit zu verbessern (die für die Formatierung verwendeten Leerzeichen und Zeilenumbrüche wurden nicht gezählt).
Sie können zwei Bytes speichern, indem Sie die nachstehende Zeile nicht drucken. Fünf weitere Bytes können gespeichert werden, indem echte Zeilenumbrüche in den
echo()
folgenden Bereichen verwendet werden :Sechs zusätzliche Bytes können durch Weglassen der Initialisierung von
$o
($o='';
) gespeichert werden , dies löst jedoch eine Benachrichtigung aus. Der Hinweis kann unterdrückt werden, indem das Skript über die Befehlszeile ausgeführt wird:Das bringt es auf 174 Bytes.
quelle
Ruby,
137135 BytesNicht die kürzeste, die ich mir vorstellen konnte, aber die netteste. Teilweise aus der Antwort des Optimierers entlehnt.
Ungolfed:
quelle
(a.shift.zip(*a).map(&:join)*?\n).gsub'--','- '
.C 155 Bytes
Besser lesbar:
Die äußere Schleife zählt Zeilen von 5 bis 0.
Die mittlere Schleife durchläuft Teile der codierten Zeichenfolge:
Die innere Schleife decodiert einen Teil wie
7P
und iteriert die erforderliche Anzahl von Malen (z. B. 7).Jede Iteration gibt eine aus
char
. Der Wert vonchar
wird durch den Code beschriebenl%5?l^2?32:c^78?++x&1?45:32:61:95
:_
)=
)x
um 1 (es wurde um auf 2 initialisiertsscanf
).-
), sonst drucke 32 (Leerzeichen)quelle
Scala, 163 Bytes
Erster Versuch, könnte noch etwas mehr golfen werden.
quelle
Ruby, 94 Bytes
Leiht die
gsub'--','- '
Idee aus der Antwort von 14mRh4X0r . Ich finde diese Antwort jedoch interessanter, obwohl sie kürzer ist.Testen:
Produziert:
quelle
Lassen Sie mich meine Matlab- Version aufnehmen
MATLAB (267 b)
Eingang
Eine ascii-formatierte Zeichenfolge, die durch ein Leerzeichen begrenzt ist (da in matlab kein Kettenende '\ 0' vorhanden ist
Beispiel V = '12N13P'
Ausgabe
Musterdarstellung der Straße
Funktion
Die Funktion muss von ihrem Ende 1 aufgerufen werden (das leere Zeichen wird entfernt)
Beispiel : p (V, numel (V) -1)
Simulation
Probieren Sie es hier online aus
quelle
R, 132 Bytes
Ich bin damit nicht sehr zufrieden, aber es hat ein bisschen Spaß gemacht :)
gsub
Ich habe versucht, die Mehrfachnennungen loszuwerden , aber meine Bemühungen waren vergebens. Ich vermute, es gibt einen viel besseren Weg, dies zu tun.scan
holt die Saiten von STDIN und schnappt sich die vierte. Hinweis dass die leeren Zeilen ein Leerzeichen (oder etwas) enthalten müssen, damit der Scan die Eingabe fortsetzen kann.=
s mitN
s, das-
undmit
P
s.NP
und jeweils ein Leerzeichen eingefügtPN
rbind
mit dem ersten Zeichen jedes Strings )cat
.Testlauf
quelle