Schreiben Sie ein Programm , das eine Reihe von Nicht-Leerzeichen geht durch (Sie können davon ausgehen , dass sie Ziffern 0
zu 9
, aber nichts in der Art , wie sie verarbeitet werden sollen , hängt von dieser) und fügt Räume nach folgenden Regeln.
- Das aktuelle Token sei die leere Zeichenfolge, und die zuvor ausgegebenen Token seien eine leere Menge.
- Durchlaufen Sie die Zeichen der Zeichenfolge. Fügen Sie für jedes Zeichen zuerst das Zeichen an das aktuelle Token an. Wenn sich das aktuelle Token nicht bereits in der Gruppe der zuvor ausgegebenen Token befindet, fügen Sie das aktuelle Token zu dieser Gruppe hinzu und lassen Sie das neue aktuelle Token die leere Zeichenfolge sein.
- Wenn Sie das Ende der Zeichenfolge erreichen und das aktuelle Token leer ist, geben Sie die zuvor ausgegebenen Token in der Reihenfolge ihrer Ausgabe aus, getrennt durch ein Leerzeichen. Andernfalls geben Sie die ursprüngliche Zeichenfolge wörtlich aus.
Eingang
Die Eingabe in die STDIN sollte eine Folge von Ziffern sein.
Ausgabe
Das Programm sollte das Ergebnis wie in Schritt 3 angegeben drucken.
Proben
Beispieleingaben
2015
10101010
4815162342
101010101010
3455121372425
123456789101112131415
314159265358979323846264338327950288419716939937
Beispielausgaben
2 0 1 5
10101010
4 8 1 5 16 2 3 42
1 0 10 101 01 010
3 4 5 51 2 1 37 24 25
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 95 0 28 841 971 69 39 937
Dies ist Codegolf, daher gelten Standard-CG-Regeln. Kürzestes Programm in Bytes gewinnt.
(Bitte fordern Sie Klarstellungen in den Kommentaren an. Ich bin noch neu darin. Danke!)
4815162342
Ich sehe, was du dort getan hast, Brotha .1 0 10
, wird die nächste Iteration gefunden1
(bereits verwendet), dann wird eine zum Finden vorgerückt10
(bereits verwendet), und dann wird eine zum Finden vorgerückt101
, was neu ist und 'hinzugefügt' werden würde. Es würde dann ein Leerzeichen hinzugefügt und man würde zu einem neuen kommen0
, der bereits verwendet wurde, aber hier am Ende der Zeichenkette steht. Daher wäre die Ausgabe1 0 10 101 0
ungültig (0
wird wiederholt), und das Skript muss dann nur die Eingabezeichenfolge ausgeben. Es könnte nur machen,1010
wenn101
schon benutzt worden wäre.If a unique number cannot be formed at the end of the string, then the input should be printed verbatim
10101010 kann nicht geteilt werden und wird so gedruckt, wie sie ist.1
, was eine Wiederholung wäre. Stattdessen bewegen Sie sich in Feld 5 nach rechts und in Schritt 4 erneut nach rechts. Geben Sie dann erneut Schritt 5 ein und erstellen Sie101
.Antworten:
Pyth, 22 Bytes
Führender Raum ist wichtig.
quelle
Retina ,
6861 Bytes<empty>
ist eine leere Zeile. Beachten Sie das nachfolgende Leerzeichen in Zeile 3. Sie können den obigen Code aus einer einzelnen Datei mit dem-s
Flag ausführen .Erläuterung
In diesem ersten Schritt werden die Regeln 1 bis 6 implementiert. Es handelt sich um eine reguläre Ersetzung, die wiederholt angewendet wird, bis sich die Zeichenfolge nicht mehr ändert (wofür
+
ist die vorgesehen). In jedem Schritt fügen wir der Zeichenfolge ein einzelnes Leerzeichen von links nach rechts hinzu (gemäß den Regeln der Herausforderung). Der reguläre Ausdruck entspricht der kürzesten Zeichenfolge, die nicht im bereits verarbeiteten Teil der Zeichenfolge enthalten ist. Wir stellen sicher, dass wir ein Präfix der verbleibenden Zeichenfolge mit der Wortgrenze betrachten\b
und überprüfen, ob wir das Ende der Zeichenfolge erreichen können, ohne Leerzeichen mit zu übergeben(\w+)$
. Letzteres stellt auch sicher, dass wir nur einen Austausch pro Schritt durchführen.Dies entspricht jedem Leerzeichen (das sich am Ende des regulären Ausdrucks befindet), vorausgesetzt, das letzte Segment der Zeichenfolge ist dasselbe wie jedes andere Segment in der Zeichenfolge und ersetzt sie durch die leere Zeichenfolge. Das heißt, wir machen den ersten Schritt rückgängig, wenn er zu einem ungültigen Endsegment geführt hat, und implementieren Regel 7.
quelle
Pyth,
2423 BytesProbieren Sie es hier aus .
Danke an @FryAmTheEggman für das Speichern eines Bytes: o)
quelle
Python 3, 92 Bytes
Grundsätzlich eine stark golfene Version von @Willems Lösung.
quelle
[" ".join(o),i][n>""]
bool(n)
aber ich habe nicht daran gedachtn>""
.Python 3,
10099 Bytesquelle
else "
.Brachylog , 91 Bytes
Dadurch wurde mir klar, dass es eine Menge Dinge an der Syntax gibt, die ich ändern muss ...
Erläuterung
quelle
CJam, 26 Bytes
Teste es hier.
Erläuterung
quelle
JavaScript (ES6), 109
Mein Ausgabeformat stimmt nicht genau mit den Ausgabebeispielen in der Questioin überein (es gibt ein führendes Leerzeichen). Ich sehe das nicht als Fehler, da das Ausgabeformat nicht spezifiziert ist (nur das Programm sollte die Nummer nach der Nummer ausgeben ... )
Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser. Entwickelt mit Firefox, getestet und lauffähig auf dem neuesten Chrome.
quelle
GNU sed,
83777371 Bytes(Erziele ein Extra, weil wir eine
-r
Flagge benötigen )Die innere Schleife prüft auf eine wiederholte Sequenz und fügt nach Bedarf Zeichen hinzu, bis nach dem Trennzeichen eine eindeutige Nummer angezeigt wird
_
. Die äußere Schleife bewegt sich_
entlang.Erweiterte, kommentierte Version:
quelle
t
zu einem kombinieren ./((\b[^ ]+).*\b\2)_/{
kann als/(\b[^ ]+).*\b\1_/{
, kein Grund für 2 Erfassungsgruppen umgeschrieben werden.\1
!Ruby, 57 + 1 = 58 Bytes
Verwendet das Befehlszeilenflag
-p
(oderpl
wenn Ihre Eingabe eine nachgestellte Newline enthält). Nutzt mehrere Merkmale von Ruby Hash-Wörterbüchern aus: Sie können die Zeichenfolge, die Sie zum Definieren eines Schlüssels verwendet haben, sicher ändern, ohne den Schlüssel zu ändern (was bei anderen veränderbaren Typen nicht funktioniert). Sie geben.keys
die Schlüssel in der Reihenfolge zurück, in der sie eingefügt wurden, und den[]||=
Operator bietet eine knappe Möglichkeit, um zu verzweigen, ob ein bestimmter Schlüssel bereits vorhanden ist.quelle
Haskell, 105 Bytes
f
macht es.quelle
PHP - 148 Bytes
Coole Herausforderung, viel Spaß!
quelle