Na teoria da informação, um "código de prefixo" é um dicionário em que nenhuma das chaves é o prefixo de outra. Em outras palavras, isso significa que nenhuma das seqüências começa com nenhuma das outras.
Por exemplo, {"9", "55"}
é um código de prefixo, mas {"5", "9", "55"}
não é.
A maior vantagem disso é que o texto codificado pode ser gravado sem separador entre eles e ainda será decifrável de maneira única. Isso aparece em algoritmos de compactação, como a codificação de Huffman , que sempre gera o código de prefixo ideal.
Sua tarefa é simples: dada uma lista de cadeias, determine se é ou não um código de prefixo válido.
Sua entrada:
Será uma lista de strings em qualquer formato razoável .
Contém apenas seqüências ASCII imprimíveis.
Não conterá nenhuma sequência vazia.
Sua saída será um valor truthy / falsey : Truthy, se for um código de prefixo válido, e falsey, se não for.
Aqui estão alguns casos de teste verdadeiros:
["Hello", "World"]
["Code", "Golf", "Is", "Cool"]
["1", "2", "3", "4", "5"]
["This", "test", "case", "is", "true"]
["111", "010", "000", "1101", "1010", "1000", "0111", "0010", "1011",
"0110", "11001", "00110", "10011", "11000", "00111", "10010"]
Aqui estão alguns casos de teste falsos:
["4", "42"]
["1", "2", "3", "34"]
["This", "test", "case", "is", "false", "t"]
["He", "said", "Hello"]
["0", "00", "00001"]
["Duplicate", "Duplicate", "Keys", "Keys"]
Isso é código-golfe, então as brechas padrão se aplicam e a resposta mais curta em bytes vence.
fonte
001
seria singularmente decifrável? Pode ser um00, 1
ou outro0, 11
.0, 00, 1, 11
todas as chaves, esse não é um código de prefixo, porque 0 é um prefixo de 00 e 1 é um prefixo de 11. Um código de prefixo é o local em que nenhuma das chaves começa com outra chave. Por exemplo, se suas chaves forem,0, 10, 11
esse é um código prefixo e decifrável exclusivamente.001
não é uma mensagem válida, mas0011
ou0010
são exclusivamente decifráveis.Respostas:
Pitão, 8 bytes
Suíte de teste
Pegue todas as 2 permutações de elementos da entrada, mapeie cada uma para o índice de uma sequência na outra (0 para um prefixo) e retorne se todos os resultados são verdadeiros (diferentes de zero).
fonte
Haskell, 37 bytes
Cada elemento
x
del
é repetido uma vez para cada elemento do qual é um prefixo, que é exatamente uma vez para uma lista sem prefixos, fornecendo a lista original. A propriedade prefix é verificada fechando as duas listas comx
, o que corta os elementos além do comprimento dex
.fonte
Java,
128127126125124121 bytes(Obrigado @Kenny Lau, @Maltysen, @Patrick Roberts, @Joba)
Ungolfed
Saída
fonte
&
funcionaria em vez de&&
?int
e return0
e1
? Isso economizaria vários bytes. Também eu esqueça, se isso é válido em Java, mas se você declarari
,j
el
dentro do exteriorfor
loop que iria salvar um byte de um menor ponto e vírgula.indexOf(a[i])==0
nesse caso, não haver economia.Python 2, 48
51bytesPara cada elemento
a
del
, a funçãoa.find
localiza o índice da primeira ocorrência dea
na sequência de entrada, fornecendo-1
uma ausência. Então,0
indica um prefixo. Em uma lista sem prefixos, o mapeamento dessa função retorna apenas um0
paraa
si. A função verifica se esse é o caso de todosa
.51 bytes:
Substitua
~
por um caractere com código ASCII 128 ou superior.Para cada elemento
a
eml
, uma cópia é incluído para cada elemento que é um prefixo do mesmo. Para uma lista sem prefixos, o único elemento éa
ele próprio, portanto, isso fornece a lista original.fonte
CJam, 14 bytes
Suíte de teste.
Explicação
fonte
JavaScript ES6,
654340 bytesMinha solução anterior, que tratava matrizes de string de todos os caracteres UTF-8:
Consegui evitar,
JSON.stringify
pois o desafio especifica apenas caracteres ASCII imprimíveis.Teste
fonte
Haskell, 49 bytes
Isso tem algumas partes:
Se as duas listas são iguais, um elemento é apenas o prefixo de si mesmo e é válido.
fonte
Retina , 19 bytes
A contagem de bytes assume a codificação ISO 8859-1.
A entrada deve ser separada por avanço de linha. A saída é
0
para falsidade e verdade1
.Experimente online! (Ligeiramente modificado para suportar vários casos de teste separados por espaço.)
Explicação
Classifique as linhas na entrada. Se existir um prefixo, ele terminará diretamente na frente de uma string que o contém.
Tente combinar (
M
) uma linha completa que também é encontrada no início da próxima linha. Am
ativa o modo de várias linhas de tal forma que^
inícios de linha partidas e1
garante que só contar no máximo um jogo de tal forma que a saída é0
ou1
.Para trocar
0
e1
no resultado, contamos o número de0
s.fonte
Java, 97 bytes
Usa a maioria dos truques encontrados na resposta de @ Marv , mas também faz uso da igualdade de referência de loop e string foreach.
Desminificado:
Observe que, como eu disse, isso usa igualdade de referência de string. Isso significa que o código pode se comportar estranhamente devido à internação de String . O código funciona ao usar argumentos passados a partir da linha de comando e também ao usar algo lido na linha de comando. No entanto, se você deseja codificar os valores a serem testados, precisará chamar manualmente o construtor String para forçar a internação a não ocorrer:
fonte
PostgreSQL,
186, 173 bytesSaída:
Nenhuma demonstração ao vivo desta vez. http://sqlfiddle.com suporta apenas 9.3 e para executar esta demonstração 9.4 é necessário.
Como funciona:
y
LEFT OUTER JOIN
para a mesma tabela derivada com base no mesmoi
(id), mas com diferentesoridinal
que começam com o prefixoy.z LIKE u.z||'%'
c
(matriz inicial) e use aEVERY
função de agrupamento. Se cada linha da segunda tabelaIS NULL
significa que não há prefixos.Entrada se alguém estiver interessado:
EDITAR:
SQL Server 2016+
implementação:LiveDemo
Nota: É uma lista separada por vírgulas, não uma matriz real. Mas a idéia principal é a mesma que em
PostgreSQL
.EDIT 2:
Na verdade
WITH ORDINALITY
poderia ser substituído:SqlFiddleDemo
fonte
Braquilog , 8 bytes
Experimente online!
Saídas através do predicado de sucesso / falha. Leva mais de 60 segundos no último caso de teste de
["111","010","000","1101","1010","1000","0111","0010","1011","0110","11001","00110","10011","11000","00111","10010"]
verdade , mas passa rapidamente com um byte adicionado, o que elimina um grande número de possibilidades mais cedo do que o programa (Ċ
antes de verificar as permutações em vez deᵈ
depois de verificar as permutações, para limitar o comprimento da sublist para dois).Menos trivial 9-byte variantes do
¬(⊇Ċpa₀ᵈ)
que correr em tempo razoável são¬(⊇o₁a₀ᵈ)
,¬(⊇o↔a₀ᵈ)
e¬(⊇oa₀ᵈ¹)
.fonte
Perl 6 , 24 bytes
Experimente online!
Uau, surpreendentemente curto enquanto estiver usando um longo built-in.
Explicação
fonte
Raquete, 70 bytes
fonte
Python,
5855 bytesfonte
a.index(b)==0
é um pouco mais curto. Alternativamente, você poderia fazer0**sum(a.index(b)for a in l for b in l)
.index
lança uma exceção quandob
não é encontrado. E porque deveria ser==
, não>=
. No entanto,find
funciona. (E é mais curto também!)find
. Cérebro sonolento está sonolento. A segunda versão também deve funcionarfind
.len(l)
é que, como estamos repetindo todos osb
s em cada uma
, sempre haverá pelo menos uma correspondência pora
. Portanto, verificamos se o número de correspondências é igual ao número de elementos.JavaScript (ES6), 52
54Editar 2 bytes salvos thx @Neil
Teste
fonte
!w.indexOf(v)
?Mathematica
75 6968 bytesLoquacious como de costume. Mas Martin B conseguiu reduzir o código em 7 bytes.
Método 1: Armazenando a saída em um
Array
(68 bytes)
Método 2: armazenando a saída em um
List
(69 bytes)
fonte
a~Drop~{#}~StringStartsQ~a[[#]]
certo. TambémArray
deve salvar alguns bytesLength
, especialmente porque permitirá que você use emJoin@@
vez deFlatten@
(desde que você esteja usandoFlatten
apenas para um único nível).Array
mais tarde.Mathematica, 41 bytes
fonte
APL (Dyalog Unicode) , SBCS de 13 bytes
-2 bytes:
Experimente online!
Explicação:
fonte
~2∊+\⊃¨∘.⍷⍨⎕
J , 17 bytes
Experimente online!
Nota: Na verdade, escrevi isso antes de analisar a resposta da APL, para abordá-la sem viés. Acontece que as abordagens são quase idênticas, o que é interessante. Eu acho que essa é a solução "array thinknig" natural
Tome entrada em caixa porque as seqüências de caracteres são de comprimento desigual.
Crie uma tabela
/~
de auto-função de cada elemento emparelhado com cada elemento e veja se há uma correspondência no início{.@E.
. Isso produzirá uma matriz de 1-0 resultados.Soma duas vezes
1#.1#.
para obter um único número representando "todos os da matriz" e veja se esse número é igual ao comprimento da entrada#=
. Se for, as únicas correspondências de prefixo são correspondências próprias, ou seja, temos um código de prefixo.solução de classificação, 18 bytes
Tentativa de abordagem diferente. Essa solução classifica e analisa pares adjacentes.
Experimente online!
fonte
R , 48 bytes
Experimente online!
Explicação:
outer(s,s,startsWith)
gera uma matriz de lógica, verificando ses[i]
é um prefixo des[j]
. Ses
for um código de prefixo, haverá exatamentelength(s)
TRUE elementos no resultado, correspondentes aos elementos diagonais (s[i]
é um prefixo por si só).fonte
function(s)all(colSums(outer(s,s,startsWith))<2)
mas continua sendo essastartsWith
uma função que eu não conhecia! Bom achado.TRUE
eFALSE
...==
por>
. :-))Pitão -
1312 bytesExperimente online aqui .
fonte
Ruby, 48 bytes
Usa argumentos como entrada e stdout como saída.
fonte
Scala, 71 bytes
fonte
Raquete 130 bytes
Ungolfed:
Teste:
Saída:
fonte
C (gcc) , 93 bytes
Experimente online!
Simples para loop duplo usando
strstr(a,b)==a
para verificar os preços. Adicionado principalmente, pois ainda não parece haver uma resposta em C.fonte
05AB1E , 13 bytes
Muito tempo .. Inicialmente, eu tinha uma solução de 9 bytes, mas falhou no caso de teste de chave duplicada.
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Japonês , 8 bytes
Tente
fonte
C # (compilador interativo do Visual C #) , 70 bytes
Experimente online!
fonte
Stax , 6 bytes
Execute e depure
Isso produz um valor diferente de zero para a verdade.
A idéia geral é considerar todos os pares de strings na entrada. Se o índice de substring de um no outro for zero, não será um código de prefixo válido. No stax, o índice de uma substring não existente produz
-1
. Dessa forma, todos os índices de substring em pares podem ser multiplicados juntos.Esse é o mesmo algoritmo da solução pyth de isaacg, mas eu o desenvolvi de forma independente.
fonte