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.