(Inspiriert beim Zeichnen auf einem trockenen Löschbrett)
Herausforderung:
Geben Sie bei einer Eingabezeichenfolge, die Zeichen enthält, die verschiedene Farben von Trockenlöschmarkierungen auf einer weißen Tafel darstellen, die Reihenfolge aus, in der sie vom ersten bis zum letzten Mal gezeichnet wurden.
Eingang:
Eine Zeichenfolge mit Farben für Trockenlöschmarkierungen, die durch alphabetische Buchstaben dargestellt werden (Großbuchstaben unterscheiden sich von Kleinbuchstaben. Sie können alle in meinen Beispielen verwendeten Zeichen ersetzen, sofern jede Farbe einen eigenen Buchstaben hat). Der Rest des Whiteboards ist weißer Raum. Es wird nur eine Linie von jeder Farbe pro Tafel geben. Es wird keine Eingabe geben, bei der sich alle Zeilen überlappen (siehe Testfall 4
). Alle Linien sind gerade und entweder horizontal oder vertikal.
Ausgabe:
Die Reihenfolge, in der die Linien auf der Tafel gezeichnet wurden, von der ersten bis zur letzten. Wenn es für eine Eingabe mehrere Lösungen gibt, können Sie eine davon ausgeben. Die Ausgabe kann wie gewünscht formatiert werden: einzelne Zeichenfolgen oder durch Leerzeichen, Zeilenumbrüche usw. getrennt, sofern die verwendeten Zeichen mit den in Ihrer Eingabe verwendeten Zeichen übereinstimmen.
Testfälle:
Eingang 1:
R
R
BBRBB
R
Ausgang 1:
BR
Eingang 2:
GY
GY
RRRRGYRRR
GY
GY
BBBBBBBB
GY
GY
Ausgang 2:
RGYB // or RYGB
Eingang 3:
R P
R P
AAAARAAAAPA
R P
R P
GGGGRGGG P
R
Ausgang 3:
AGPR // or APGR
Eingang 4:
O Y
RRRYR
O Y
GOGGG
O Y
Ausgang 4:
// Undefined, does not need to be handled by your program
Eingang 5:
YYYB
B
B
Ausgang 5:
// YB or BY
Regeln:
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Antworten:
Perl, 103 + 2 = 105 Bytes
Laufen Sie mit
-n0
(2-Byte-Strafe).Erläuterung:
Eine leichte Subtilität kommt hier mit Eingabe wie folgt:
Schauen Sie sich hier die vierte Zeile an. Wenn die Schreibreihenfolge BACBD wäre, könnte es tatsächlich eine horizontale Linie von
B
s geben, ohne die Annahmen des Problems zu verletzen ( ansonsten gibt es von jeder Farbe nur eine Linie, die wir nicht überprüfen). Um dies zu umgehen, stellen wir im letzten regulären Ausdruck sicher, dass jede Zeile mit einem Buchstaben (oder einer Ziffer oder einem Unterstrich, die jedoch nicht möglich sind) beginnt , und verlassen uns darauf, dass parallele Zeilen von links nach rechts und von oben gefunden werden -to-bottom (weil der Regex die erste Übereinstimmung in der Zeichenfolge findet). Als solches wird das erste Zeichen jeder mehrdeutigen Zeile hier überschrieben, bevor die Zeile selbst als Übereinstimmung angesehen wird, und dies verhindert die Regex-Übereinstimmung.quelle
perl -n0E '/.*/;for$i(/(\S)(?=(?:(?:.{@{+}})?(?:\1| ))*(?!.*\1))/gs){/.*/;unless(/$i+[^$i\s]+$i/||/$i(.{@{+}}[^$i ])+.{@{+}}$i/s){$r="$i$r";s/$i/ /g;last}}/\S/?redo:say$r'
(was erfordert, dass die Eingabezeilen mit Leerzeichen von gleicher Länge rechts aufgefüllt werden))Python 2, 199 Bytes
Das endete viel länger als ich ursprünglich gedacht hatte. Abgesehen davon
rindex
konnte ich dies als ein sehr gutes Programm ansehen, um es in Pyth zu übersetzen.Nimmt eine Liste von Zeilen auf und gibt eine Liste von Zeichen aus. Der Code generiert rekursiv Permutationen, wobei sichergestellt wird, dass keine der gezeichneten Linien über der aktuellen Linie liegen soll.
Der Code missbraucht viele Funktionen von Python, z. B.
w
die Potenz eines Booleschen, das Prüfen auf leere Mengen durch Überprüfen von Teilmengen von{0}
(da meine Mengen niemals Nicht-Zeichenfolgen enthalten) und von meinem Favoriten, um Listen von Listen zu unterscheiden,None
indem überprüft wird, ob sie leer sind Darstellung ist größer alsZ
.Erklärter Code
quelle