En teoría de la información, un "código de prefijo" es un diccionario donde ninguna de las claves es prefijo de otra. En otras palabras, esto significa que ninguna de las cadenas comienza con ninguna de las otras.
Por ejemplo, {"9", "55"}
es un código de prefijo, pero {"5", "9", "55"}
no lo es.
La mayor ventaja de esto es que el texto codificado se puede escribir sin separador entre ellos, y seguirá siendo descifrable de forma única. Esto se muestra en algoritmos de compresión como la codificación Huffman , que siempre genera el código de prefijo óptimo.
Su tarea es simple: dada una lista de cadenas, determine si es o no un código de prefijo válido.
Tu aportación:
Será una lista de cadenas en cualquier formato razonable .
Solo contendrá cadenas ASCII imprimibles.
No contendrá cadenas vacías.
Su salida será un valor verdadero / falso : Verdad si es un código de prefijo válido, y falso si no lo es.
Aquí hay algunos casos de prueba verdaderos:
["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"]
Aquí hay algunos casos de prueba falsos:
["4", "42"]
["1", "2", "3", "34"]
["This", "test", "case", "is", "false", "t"]
["He", "said", "Hello"]
["0", "00", "00001"]
["Duplicate", "Duplicate", "Keys", "Keys"]
Este es el código de golf, por lo que se aplican las lagunas estándar y gana la respuesta más corta en bytes.
fuente
001
ser singularmente descifrable? Podría ser cualquiera00, 1
o0, 11
.0, 00, 1, 11
todas como claves, este no es un código de prefijo porque 0 es un prefijo de 00 y 1 es un prefijo de 11. Un código de prefijo es donde ninguna de las claves comienza con otra clave. Entonces, por ejemplo, si sus claves son0, 10, 11
este es un código de prefijo y descifrable de manera única.001
no es un mensaje válido, pero0011
o0010
son únicamente descifrables.Respuestas:
Pyth, 8 bytes
Banco de pruebas
Tome todas las permutaciones de 2 elementos de la entrada, asigne cada una al índice de una cadena en la otra (0 para un prefijo) y devuelva si todos los resultados son verdaderos (distintos de cero).
fuente
Haskell, 37 bytes
Cada elemento
x
del
se repite una vez para cada elemento del que es un prefijo, que es exactamente una vez para una lista sin prefijo, dando la lista original. La propiedad del prefijo se comprime comprimiendo ambas listas conx
, lo que corta elementos más allá de la longitud dex
.fuente
Java,
128127126125124121 bytes(Gracias @Kenny Lau, @Maltysen, @Patrick Roberts, @Joba)
Sin golf
Salida
fuente
&
funcionaría en lugar de&&
?int
y regresar0
y1
? Eso ahorraría varios bytes. También me olvido de si esto es válido en Java, pero si se declarai
,j
yl
en el interior del exteriorfor
bucle que se ahorraría un byte de un punto y coma menos.indexOf(a[i])==0
en cuyo caso no hay ahorros.Python 2, 48
51bytesPara cada elemento
a
del
, la funcióna.find
encuentra el índice de la primera aparición dea
en la cadena de entrada, dando-1
una ausencia. Entonces,0
indica un prefijo. En una lista libre de prefijo, la cartografía de esta función devuelve sólo un único0
pora
sí mismo. La función verifica que este sea el caso para todosa
.51 bytes:
Reemplace
~
con un carácter con código ASCII 128 o superior.Para cada elemento
a
enl
, se incluye una copia para cada elemento que es un prefijo del mismo. Para una lista libre de prefijos, el único elemento de este tipo es éla
mismo, por lo que se obtiene la lista original.fuente
CJam, 14 bytes
Banco de pruebas.
Explicación
fuente
JavaScript ES6,
654340 bytesMi solución anterior, que manejaba matrices de cadenas de todos los caracteres UTF-8:
Pude evitarlo
JSON.stringify
ya que el desafío especifica solo caracteres ASCII imprimibles.Prueba
fuente
Haskell, 49 bytes
Esto tiene un par de partes:
Si las dos listas son iguales, entonces un elemento es solo el prefijo de sí mismo y es válido.
fuente
Retina , 19 bytes
El recuento de bytes asume la codificación ISO 8859-1.
La entrada debe estar separada por salto de línea. La salida es
0
por falsedad y1
por verdad.Pruébalo en línea! (Ligeramente modificado para admitir múltiples casos de prueba separados por espacios).
Explicación
Ordenar las líneas en la entrada. Si existe un prefijo, terminará directamente frente a una cadena que lo contiene.
Intente hacer coincidir (
M
) una línea completa que también se encuentra al comienzo de la siguiente línea. Lam
activa modo multilínea de tal manera que^
los comienzos partidos de línea y los1
asegura que sólo cuentan como máximo un partido de tal manera que la salida es0
o1
.Para intercambiar
0
y1
en el resultado, contamos el número de0
s.fuente
Java, 97 bytes
Utiliza la mayoría de los trucos que se encuentran en la respuesta de @ Marv , pero también hace uso del bucle foreach y la igualdad de referencia de cadena.
No minificado:
Tenga en cuenta que, como dije, esto usa la igualdad de referencia de cadena. Eso significa que el código puede comportarse de manera extraña debido a la internación de String . El código funciona cuando se usan argumentos pasados desde la línea de comandos, y también cuando se usa algo leído desde la línea de comandos. Sin embargo, si desea codificar los valores para probar, deberá llamar manualmente al constructor de cadenas para forzar que no ocurra la internación:
fuente
PostgreSQL,
186, 173 bytesSalida:
No hay demostración en vivo esta vez. http://sqlfiddle.com solo admite 9.3 y para ejecutar esta demostración se requiere 9.4.
Cómo funciona:
y
LEFT OUTER JOIN
a la misma tabla derivada basada en el mismoi
(id), pero con diferentesoridinal
que comienzan con el prefijoy.z LIKE u.z||'%'
c
(matriz inicial) y use laEVERY
función de agrupación Si cada fila de la segunda tablaIS NULL
significa que no hay prefijos.Ingrese si alguien está interesado:
EDITAR:
SQL Server 2016+
implementación:LiveDemo
Nota: es una lista separada por comas, no una matriz real. Pero la idea principal es la misma que en
PostgreSQL
.EDITAR 2:
En realidad
WITH ORDINALITY
podría ser reemplazado:SqlFiddleDemo
fuente
Brachylog , 8 bytes
Pruébalo en línea!
Salidas a través del predicado éxito / fracaso. Lleva más de 60 segundos en el último caso de prueba de verdad,
["111","010","000","1101","1010","1000","0111","0010","1011","0110","11001","00110","10011","11000","00111","10010"]
pero lo pasa rápidamente con un byte agregado que elimina una gran cantidad de posibilidades antes de lo que el programa hace de otra manera (Ċ
antes de verificar las permutaciones en lugar deᵈ
después de verificar las permutaciones, para limitar la longitud de la sublista a dos).Menos trivial 9 bytes de variantes
¬(⊇Ċpa₀ᵈ)
que se ejecutan en un tiempo razonable son¬(⊇o₁a₀ᵈ)
,¬(⊇o↔a₀ᵈ)
y¬(⊇oa₀ᵈ¹)
.fuente
Perl 6 , 24 bytes
Pruébalo en línea!
Wow, sorprendentemente corto mientras usa un largo incorporado.
Explicación
fuente
Raqueta, 70 bytes
fuente
Python,
5855 bytesfuente
a.index(b)==0
Es un poco más corto. Alternativamente, podrías hacer0**sum(a.index(b)for a in l for b in l)
.index
arroja una excepción cuandob
no se encuentra. Y porque debería ser==
, no>=
. Sin embargo,find
funciona. (¡Y también es más corto!)find
. El cerebro somnoliento tiene sueño. La segunda versión también debería funcionar confind
.len(l)
es porque estamos iterando a través de todos losb
s en cada unoa
, siempre habrá al menos una coincidencia pora
. Por lo tanto, verificamos si la cantidad de coincidencias es la misma que la cantidad de elementos.JavaScript (ES6), 52
54Editar 2 bytes guardados gracias a @Neil
Prueba
fuente
!w.indexOf(v)
?Mathematica
75 6968 bytesLocuaz como siempre. Pero Martin B pudo reducir el código en 7 bytes.
Método 1: almacenamiento de salida en un
Array
(68 bytes)
Método 2: almacenamiento de salida en un
List
(69 bytes)
fuente
a~Drop~{#}~StringStartsQ~a[[#]]
trabajo. TambiénArray
debería guardar algunos bytesLength
, especialmente porque te permitirá usarlos enJoin@@
lugar deFlatten@
(siempre queFlatten
solo los uses para un solo nivel).Array
más tarde.Mathematica, 41 bytes
fuente
APL (Dyalog Unicode) , SBCS de 13 bytes
-2 bytes:
Pruébalo en línea!
Explicación:
fuente
~2∊+\⊃¨∘.⍷⍨⎕
J , 17 bytes
Pruébalo en línea!
Nota: en realidad escribí esto antes de mirar la respuesta APL, para abordarla sin sesgos. Resulta que los enfoques son casi idénticos, lo cual es interesante. Supongo que esta es la solución natural "array thinknig"
Tome la entrada en recuadro porque las cadenas son de longitud desigual.
Cree una tabla
/~
de funciones propias de cada elemento emparejado con cada elemento y vea si hay una coincidencia al comienzo{.@E.
. Esto producirá una matriz de resultados 1-0.Suma dos veces
1#.1#.
para obtener un número único que represente "todos los de la matriz", y ve si ese número es igual a la longitud de la entrada#=
. Si es así, las únicas coincidencias de prefijo son coincidencias propias, es decir, tenemos un código de prefijo.solución de clasificación, 18 bytes
Intento de un enfoque diferente. Esta solución clasifica y mira los pares adyacentes.
Pruébalo en línea!
fuente
R , 48 bytes
Pruébalo en línea!
Explicación:
outer(s,s,startsWith)
genera una matriz de lógicos que verifica sis[i]
es un prefijo des[j]
. Sis
es un código de prefijo, entonces hay exactamentelength(s)
elementos VERDADEROS en el resultado, correspondientes a los elementos diagonales (s[i]
es un prefijo de sí mismo).fuente
function(s)all(colSums(outer(s,s,startsWith))<2)
pero sigue siendostartsWith
una función que no conocía! Buen hallazgoTRUE
yFALSE
...==
con>
. :-))Pyth -
1312 bytesPruébelo en línea aquí .
fuente
Ruby, 48 bytes
Utiliza argumentos como entrada y stdout como salida.
fuente
Scala, 71 bytes
fuente
Raqueta 130 bytes
Sin golf:
Pruebas:
Salida:
fuente
C (gcc) , 93 bytes
Pruébalo en línea!
Simple doble para el bucle que usa
strstr(a,b)==a
para verificar las premisas. Principalmente agregado ya que todavía no parece haber una respuesta C.fuente
05AB1E , 13 bytes
Demasiado tiempo. Inicialmente tenía una solución de 9 bytes, pero falló para el caso de prueba de clave duplicada.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Japt , 8 bytes
Intentalo
fuente
C # (compilador interactivo de Visual C #) , 70 bytes
Pruébalo en línea!
fuente
Stax , 6 bytes
Ejecutar y depurarlo
Esto produce no cero para la verdad.
La idea general es considerar cada par de cadenas en la entrada. Si el índice de subcadena de uno en el otro es siempre cero, entonces no es un código de prefijo válido. En stax, el índice de rendimientos de una subcadena no existente
-1
. De esta manera, todos los índices de subcadenas por pares se pueden multiplicar juntos.Este es el mismo algoritmo que la solución pyth de Isaac, pero lo desarrollé de forma independiente.
fuente