Ist das eindeutig verkettbar?

10

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 . 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]
Undichte Nonne
quelle
Nur um sicherzugehen, dass ich die Herausforderung richtig verstehe, ist es nicht eindeutig verkettbar, wenn eine der Zeichenfolgen aus einer Kombination der anderen besteht? Sie sollten diese Details klarer machen.
James
Sind Sie sicher, dass dies nicht dem Problem des Anhaltens entspricht?
Feersum
Können Sie zeigen, warum dies dem Problem des Anhaltens entspricht?
Undichte Nonne
Ich habe es nicht gesagt, aber ich habe mich gefragt, ob es das sein könnte. Nach einigem Nachdenken glaube ich, dass es nicht so ist.
Feersum
@feersum Hier ist ein Poly-Time-Algorithmus für dieses Problem: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
isaacg

Antworten:

5

05AB1E , 15 Bytes

Am Telefon muss die Erklärung später folgen. Code:

gF¹N>ã})€`€JDÚQ

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 ...

Adnan
quelle
3
Es ist sehr beeindruckend, dass Sie das auf Ihrem Telefon eingeben können.
James
3
@ DrGreenEggsandHamDJ Es dauerte ungefähr 40 Minuten ...
Adnan
2
@Adnan Ich frage mich, was der Textprädiktor Ihrer Telefontastatur von all diesen Müllsymbolen hält :-)
Luis Mendo
1
@LuisMendo Haha, es ist nur einmal passiert, dass ich einem Freund ein zufälliges 05AB1E-Programm geschickt habe.
Adnan
Ich vermute, dass dies funktioniert, indem eine Obergrenze für die Länge der kürzesten Kollision gesetzt wird. Habe ich recht?
Peter Taylor
4

CJam (54 Bytes)

q_N/:A\,{_Am*:${~1$,<=},{~\,>}%La:L-}*A,A_&,-A*](\M*&!

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:

q_N/\,{_W$m*:${~1$,<=},{~\,>}%La:L-}*](\M*&!

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:

"abc" "a" #   e# gives 0 as the index at which "a" is found
"abc" "d" #   e# gives -1 as the index at which "d" is found
"abc" ""  #   e# gives an error

Die Präfixprüfung ist also kompliziert 1$,<=statt\#!

e# Take input, split, loop once per char
q_N/\,{
  e# Build the suffixes corresponding to top-of-stack and bottom-of-stack
  _W$m*
  e# Map each pair of Cartesian product to the suffix if one is the prefix of the other;
  e# otherwise remove from the array
  :${~1$,<=},{~\,>}%
  e# Filter out empty suffixes iff it's the first time round the loop
  La:L-
}*
e# If we generated an empty suffix then we've also looped enough times to generate all
e# of the keywords as suffixes corresponding to the empty fix, so do a set intersection
e# to test this condition.
](\M*&!
Peter Taylor
quelle