Invertieren Sie die Format-Methode.
Die Format
Methode der String-Klasse (oder gleichwertig wie sprintf
) ist in den meisten Sprachen verfügbar. Grundsätzlich ist ein "Format" -String erforderlich, der Platzhalter mit einer zusätzlichen Formatierung sowie null oder mehr Werte enthalten kann, die anstelle dieser Platzhalter eingefügt werden sollen.
Ihre Aufgabe ist es, die Umkehrfunktion in der Sprache Ihrer Wahl zu implementieren.
API
Der Methodenname sollte entweder format1
oder sein deformat
.
Eingabe : Der erste Parameter ist die Zeichenfolge "Format", genau wie bei der ursprünglichen Formatierungsmethode. Der zweite Parameter ist der analysierte String (siehe Beispiele unten). Es sind keine weiteren Parameter erforderlich oder zulässig.
Ausgabe : Ein Array (oder das Äquivalent der Sprache Ihrer Wahl) von Werten, die entsprechend den Platzhaltern im Format extrahiert wurden.
Die Platzhalter sind {0}
, {1}
, {2}
etc.
Im Falle eines schlechten Formats können Sie einen Fehler auslösen oder das zurückgeben, was Sie möchten.
Im Falle einer ungültigen Eingabe können Sie einen Fehler auslösen oder das zurückgeben, was Sie möchten. Ungültige Eingabe ist eine solche , die nicht von String.Format mit demselben Format - String, zum Beispiel erzeugt werden können: '{0}{0}', 'AAB'
.
Beispiele
deformat('{0} {1}', 'hello world') => ['hello', 'world']
deformat('http{0}://', 'https://') => ['s']
deformat('http{0}://', 'http://') => [''] // array of one item which is an empty string
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
Mehrdeutigkeit
Im Zweifelsfall können Sie jede geeignete Antwort zurückgeben. Beispielsweise:
deformat('{0} {1}', 'Edsger W. Dijkstra')
// both ['Edsger', 'W. Dijkstra'] and ['Edsger W.', 'Dijkstra'] are applicable.
Noch ein paar Regeln
- Zur Vereinfachung muss die Formatierung nicht unterstützt werden. Sie können alles über führende Nullen, Dezimalstellen oder Rundungsprobleme vergessen. Generieren Sie einfach die Werte als Zeichenfolgen.
- Um es nicht trivial zu machen, sind reguläre Ausdrücke nicht erlaubt .
- Sie müssen sich bei der Eingabe nicht um geschweifte Klammern kümmern (dh der zweite Eingabeparameter enthält keine
{
s oder}
s).
Gewinnen
Das ist Code-Golf ! (sollte als "Dies ist Sparta!" gelesen werden) Die richtige Funktion mit der kürzesten Länge gewinnt. Standardlücken sind verboten.
deformat('{0}{1}{0}', 'ABBA') => ['A', 'BB']
, was passiert , wenn wir statt gegebendeformat('{0}{1}{0}', 'AAAA')
?['', 'AAAA']
,['A', 'AA']
,['AA', '']
deformat('{0}{1}{0}', 'ABBA') => ['', 'ABBA']
? Wenn ja, gibt es eine billige Lösung, es sei denn, jede Zeichenfolge erscheint mindestens zweimal.deformat('{0}_{1}_{0}', 'A_BB_A')
?Antworten:
Haskell, 220 Zeichen
Bricht ab, wenn Sie mehrere Darstellungen für dasselbe Muster (
{1}
vs{01}
) verwenden - erzwingt nicht deren Gleichheit und verwirft stattdessen Übereinstimmungen für alle außer einer Darstellung.19 Zeichen können durch Weglassen gespeichert werden,
mapKeys((0+).read)$
wenn die richtige Reihenfolge von Übereinstimmungen mit mehr als 10 Mustern keine Rolle spielt oder wenn möglicherweise ein Auffüllen mit derselben Länge erforderlich ist oder wenn die Reihenfolge der Zeichenfolgen für Muster akzeptabel ist. In jedem Fall wird ein Muster, wenn es im ersten Argument weggelassen wird, auch im Ergebnis weggelassen.Wenn Sie
!!0
vom Ende entfernen, wirdformat1
die Liste aller Lösungen und nicht nur die erste zurückgegeben.vor dem Golfen:
quelle
read
lässt Sie nur mit einem mehrdeutigen Typ. Haskell weiß nicht, unter welchem bestellbaren Typ die Schlüssel gelesen werden sollen.+0
erzwingt eine Zahl, aus der Haskell bereits eine willkürliche Wahl treffen kann und geht für ganze Zahlen.Ruby, 312 Zeichen
Sie könnten 5 Zeichen speichern, indem Sie Übereinstimmungen mit der Länge Null bevorzugen und die
ABBA
Lösung erstellen['', 'ABBA']
, anstatt die bevorzugte Lösung der Frage. Ich habe mich dafür entschieden, die Beispiele als impliziten Teil der Spezifikation zu interpretieren.quelle
Python, 208 Zeichen, wenn auch unvollständig.
Die Funktion durchsucht beide Zeichenfolgen gleichzeitig, bis sie eine öffnende Klammer in der Eingabezeichenfolge findet, die einen Platzhalter kennzeichnet.
In diesem Fall wird davon ausgegangen, dass der Platzhalter bereits erweitert wurde, und versucht, den Index der Ausgabezeichenfolge anhand der Liste der bisher gefundenen Werte nach oben zu verschieben.
Wenn es nicht erweitert wurde, fügt es der Werteliste einen neuen Eintrag hinzu und beginnt mit dem Hinzufügen von Zeichen aus der Ausgabezeichenfolge, bis es das Zeichen nach dem Platzhalter in der Eingabezeichenfolge erreicht.
Wenn das Ende der Eingabezeichenfolge erreicht ist, werden die bisher gefundenen Werte zurückgegeben.
Es funktioniert gut für einfache Eingaben, hat aber eine Reihe von Problemen:
Es erfordert ein bekanntes Trennzeichen nach jedem Platzhalter in der Eingabe, daher funktioniert es nicht mit Platzhaltern, die direkt nebeneinander stehen, z. B. "{0} {1}". Aus diesem Grund musste ich an beide Zeichenfolgen ein Leerzeichen anhängen.
Es wird davon ausgegangen, dass die ersten Instanzen jedes Platzhalters in der richtigen Reihenfolge sind, z. B. "{ 0 } { 1 } {1} {0} { 2 }".
Es funktioniert nur für die ersten 10 Platzhalter, da davon ausgegangen wird, dass sie alle 3 Zeichen lang sind.
Es behandelt überhaupt keine mehrdeutigen Fälle :(
quelle
C ++ 11-Code, 386 Zeichen
Die Funktion format1 hat 2 Zeichenfolgen als Eingabe (const char *) und gibt eine Hashmap mit den Schlüsseln integer (das Muster) zurück und value ist die identifizierte Zeichenfolge. Wenn nichts gefunden wird oder ein Fehler vorliegt, wird eine leere Hashmap zurückgegeben.
Verwendung:
Ausgabe:
Beispiel 2:
Ausgabe:
Die Muster sind dezimal dargestellt, die Eingaben sind größer als
MAXINT
der Überlauf, aber es funktioniert immer noch.Obwohl es kleinere Lösungen in anderen Programmiersprachen gibt, ist dies das kleinste C ++ - noch! :)
Dies ist der Code vor dem Golfen:
quelle