Bei dieser Herausforderung zum Präfixcode haben wir gelernt, dass Präfixcodes eindeutig verkettbar sind.
Das heißt, sie können ohne Trennzeichen und ohne Mehrdeutigkeit miteinander verbunden werden.
Da [1,2,45] beispielsweise ein Präfixcode ist, kann ich sie ohne Trennzeichen als solches zusammenfügen: 1245245112145, und es gibt keine Mehrdeutigkeit.
Das Gegenteil ist jedoch nicht immer der Fall.
Zum Beispiel ist [3,34] kein Präfixcode. Ich kann jedoch dasselbe tun: 3333434334333, und es wird keine Mehrdeutigkeit geben. Sie brauchen nur einen intelligenteren Parser.
[1,11] ist jedoch nicht eindeutig verkettbar, da 1111 auf fünf Arten interpretiert werden kann.
Tor
Ihre Aufgabe ist es, ein Programm / eine Funktion zu schreiben, die eine Liste von Zeichenfolgen (ASCII) als Eingabe verwendet, und festzustellen, ob sie eindeutig verkettbar sind.
Einzelheiten
Duplizieren zählt als falsch.
Wertung
Das ist Code-Golf . Die kürzeste Lösung in Bytes gewinnt.
Testfälle
Wahr:
[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]
Falsch:
[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]
Antworten:
05AB1E , 15 Bytes
Am Telefon muss die Erklärung später folgen. Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online aus! .
Benötigt zu viel Speicher für den letzten Testfall, sodass dies möglicherweise nicht funktioniert ...
quelle
CJam (54 Bytes)
Nimmt Eingaben in stdin als durch Zeilenumbrüche getrennte Liste entgegen.
Online-Demo
Wenn wir nicht mit doppelten Codewörtern umgehen müssten, könnte dies auf 44 verkürzt werden:
Oder wenn CJam eine Array-Subtraktion hatte, die nur ein Element aus der ersten Liste für jedes Element in der zweiten entfernte, könnte es 48 sein ...
Präparation
Dies ist der Sardinas-Patterson-Algorithmus, der jedoch nicht optimiert wurde. Da jedes baumelnde Suffix höchstens einmal angezeigt wird, ist es ausreichend, die Hauptschleife so oft auszuführen, wie Zeichen in der Eingabe enthalten sind (einschließlich Trennzeichen).
Beachten Sie, dass ich einen Fehler im CJam-Interpreter umgehen musste:
Die Präfixprüfung ist also kompliziert
1$,<=
statt\#!
quelle