Questo è unicamente concatenabile?


10

In questa sfida sul codice prefisso , abbiamo appreso che i codici prefisso sono concatenabili in modo univoco.

Ciò significa che possono essere uniti senza separatore e senza ambiguità.

Ad esempio, poiché [1,2,45] è un prefisso, posso unirli senza separatore in quanto tale: 1245245112145, e non ci sarà alcuna ambiguità.

Tuttavia, il contrario non è sempre vero.

Ad esempio, [3,34] non è un codice prefisso. Tuttavia, posso fare lo stesso: 3333434334333, e non ci saranno ambiguità. Avresti solo bisogno di un parser più intelligente.

Tuttavia, [1,11] non è concatenabile in modo univoco, poiché 1111 può essere interpretato in 5 modi.

Obbiettivo

Il tuo compito è quello di scrivere un programma / funzione che accetta un elenco di stringhe (ASCII) come input e determinare se sono concatenabili in modo univoco.

Dettagli

Il duplicato viene considerato falso.

punteggio

Questo è . Vince la soluzione più breve in byte.

Casi test

Vero:

[12,21,112]
[12,112,1112]
[3,4,35]
[2,3,352]

falso:

[1,1]
[1,2,112]
[1,23,4,12,34]
[1,2,35,4,123,58,8]

Solo per essere sicuro di aver compreso correttamente la sfida, non è univocamente concatenabile se una delle stringhe è composta da una combinazione delle altre? Dovresti rendere più chiari questi dettagli.
James,

Sei sicuro che questo non equivale al problema di arresto?
feersum

Puoi dimostrare perché questo equivale al problema dell'arresto?
Leaky Nun,

Non ho detto che lo fosse, ma mi chiedevo che potesse essere. Dopo qualche altro pensiero credo di no.
feersum

@feersum Ecco un algoritmo poly-time per questo problema: en.wikipedia.org/wiki/Sardinas%E2%80%93Patterson_algorithm
isaacg

Risposte:


5

05AB1E , 15 byte

Al telefono, quindi la spiegazione dovrà seguire in seguito. Codice:

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

Utilizza la codifica CP-1252 . Provalo online! .

Occupa troppa memoria per l'ultimo caso di test, quindi potrebbe non funzionare ...


3
È estremamente impressionante che tu sia in grado di digitarlo sul tuo telefono.
James,

3
@DrGreenEggsandHamDJ Ci sono voluti circa 40 minuti ...
Adnan,

2
@Adnan Mi chiedo cosa pensa il predittore di testo della tastiera del tuo telefono di tutti quei simboli di immondizia :-)
Luis Mendo,

1
@LuisMendo Haha, è successo solo una volta che ho inviato un programma 05AB1E casuale a un amico.
Adnan,

Immagino che questo funzioni ponendo un limite superiore sulla lunghezza della collisione più breve. Ho ragione?
Peter Taylor,

4

CJam (54 byte)

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

Prende input su stdin come elenco separato da nuova riga.

Demo online

Se non dovessimo gestire parole duplicate, questo potrebbe essere abbreviato in 44:

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

O se CJam avesse una sottrazione di array che ha rimosso solo un elemento dal primo elenco per ciascun elemento nel secondo, potrebbe essere 48 ...

Dissezione

Questo è l' algoritmo Sardinas-Patterson ma de-ottimizzato. Dal momento che ogni suffisso penzolante viene generato al massimo una volta, l'esecuzione del loop principale tante volte quanti sono i caratteri nell'input (inclusi i separatori) garantisce di essere sufficiente.

Si noti che ho dovuto aggirare ciò che è probabilmente un bug nell'interprete CJam:

"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

Quindi il controllo prefisso è complicato 1$,<=invece di\#!

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*&!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.