Para este desafío, debe implementar el Abbrev
módulo de Ruby en el menor código posible.
Desafío
La entrada será lo que su idioma tenga como una matriz (matriz, lista, secuencia, etc.) de cadenas. Puede escribir una función, o puede aceptar palabras separadas por comas en STDIN.
Luego debe calcular el conjunto de prefijos inequívocos para esas cadenas. Esto significa que debe devolver un hash (o mapa, objeto, etc.) de abreviaturas a sus cadenas originales.
Un "prefijo" es una subcadena de la cadena original que comienza al principio de la cadena. Por ejemplo, "pref" es un prefijo de la palabra "prefijo".
Un prefijo inequívoco es uno que solo puede significar una palabra. Por ejemplo, si su entrada es
car,cat
, entoncesca
no es un prefijo inequívoco porque podría significar "auto" o "gato".La excepción a esta regla es que una palabra es siempre un prefijo de sí misma. Por ejemplo, si tiene una entrada como
car,carpet
,car:car
debe estar en su salida.
Luego puede devolver el hash / map / object / etc. desde su función (o haga el equivalente en su idioma), o imprímalo en STDOUT en
key:value
pares en forma def:foo,fo:foo,...
. (Los pares clave-valor también pueden estar separados por espacios en blanco si acorta el código).
Casos de prueba
Input code,golf,going
Output c:code,co:code,cod:code,code:code,gol:golf,golf:golf,goi:going,goin:going,going:going
Input pie
Output p:pie,pi:pie,pie:pie
Input pie,pier,pierre
Output pie:pie,pier:pier,pierr:pierre,pierre:pierre
Input a,dog
Output a:a,d:dog,do:dog,dog:dog
Reglas
La entrada no contendrá elementos duplicados.
Su salida puede estar en cualquier orden; No tienes que ordenarlo.
No puede usar un
Abbrev
módulo / función / cosa incorporada como Ruby's.Este es el código de golf , ¡así que el código más corto en bytes ganará!
key:value\nkey:value\nkey:value
...?Respuestas:
APL (46)
(Sí, el juego de caracteres APL cabe en un byte, con espacio de sobra).
Esta es una función que toma una lista de cadenas y devuelve una matriz de 2 por N, donde cada fila contiene un prefijo inequívoco y la palabra a la que pertenece:
Explicación:
∆←⍵
: almacena el argumento correcto en∆
.{↑∘⍵¨⍳⍴⍵}¨∆
: para cada elemento de∆
, obtenga los posibles prefijos de ese elemento:⍳⍴⍵
: obtener una lista de1
la longitud de⍵
↑∘⍵¨
: para cada uno de esos números, obtenga tantos elementos de⍵
.∪⊃,/
: concatenar las listas juntas y tomar los valores únicos.{
...}¨
: para cada uno de los prefijos únicos:∆/⍨⊃¨⍵∘⍷¨∆
: seleccione las palabras que comienzan con ese prefijo(⊂⍵),
: también encierra el prefijo y concatena∆/⍨2=⍴∆←
: solo devuelve la lista si hay dos elementos (el prefijo y una palabra coincidente)↑
: convierte la lista de tuplas en una matrizfuente
Python 2.7 -
146141 bytesTenga en cuenta que la sangría en las líneas 4 y 5 no es 4 espacios, eso es un efecto secundario del intérprete de rebajas de SE. Ese es un carácter de tabulación literal, por lo que solo un byte.
Esto no está técnicamente a la altura, pero lo cambiaré si Doorknob lo aclara. Utiliza líneas nuevas en lugar de comas para separar la salida. Por ejemplo:
Nuevo: pude deshacerme de 5 caracteres asignando la cadena que estoy comprobando a una variable
e
. Esto significa que solo tengo que escribir ene
lugar dew[:a]
tres veces. También significa que guardo personajes haciendoe=w[:a+1]
y cambiando...range(1,len(w)+1)
arange(len(w))
.Explicación:
fuente
sum(b.startswith(e) for b in l)
lugar delen(filter(lambda b:b.startswith(e),l))
b.startswith(e)
ab.find(e)==0
ob[:a+1]==e
, y verificar<2
el recuento en lugar de==1
.e=""\n for a in w:\n\te+=a
lugar defor a in range(len(w)):\n\te=w[:a+1]
ahorrar 10 caracteresJ - 47 char
J ve las cadenas como simples vectores de caracteres, lo que significa que cuando intenta hacer una lista de cadenas, en realidad termina haciendo una tabla de caracteres, por lo que los extremos se rellenan con espacios. La solución de J a esto se llama caja , por lo que esta función toma como argumento una lista de cadenas en caja, para preservar la longitud.
Además, J carece de un tipo hash, por lo que lo más parecido a eso es una tabla de elementos de dos columnas, por ejemplo, cadenas en recuadro. Si eso es inaceptable y tengo que usar el formulario clave-valor por defecto, puedo reformatear la salida a este formulario en 67 caracteres en total:
Explicación por explosión:
Ejemplos:
fuente
Haskell
9687Versión sin golf:
Ejemplo:
Usé la
inits
función, que encuentra todos los prefijos de una lista / cadena. ¿Cuenta como trampa?fuente
concatMap
por(=<<)
, que está en el Preludio. Te ahorra 10 personajes.concatMap
pero no puedo guardar más de 9 caracteres.>>=\
como un solo lexema. Lo siento por eso ...Pitón 3 (97)
Repetimos los prefijos de cada palabra en la entrada, imprimiendo el par de prefijo / palabra correspondiente si aparece exactamente una vez o si corresponde a una palabra completa. Aprovechamos el comportamiento de cortocircuito de
or
(yprint
ser una función) para imprimir solo si se cumple una de estas condiciones.El
while
bucle corta repetidamente el último carácter para crear prefijos cada vez más cortos, terminando cuando la cadena vacía permanece. Esta es la única vez que indexamos o dividimos en algo.Contamos las ocurrencias del prefijo
e
en la entrada buscandoS
subcadenas en la cadena de entrada original separada por comas','+e
. Anteponemos una coma a la cadena de entrada de antemano. Esta adición causa un elemento de cadena vacío adicional cuando nosotrossplit
, pero esto no tiene ningún efecto porque no tiene subcadenas no vacías.Para verificar el caso cuando la subcadena
e
es la palabra completaw
, las comparamos utilizando el operador de comparación de cadenas. Esto se compara lexicográficamente, por lo que los prefijos más cortos son más pequeños. La doble comparación falla sie==w
o bienS.count(c+e)<2
.Si
e,w
se permitieran las salidas de impresión en el formulario , en su lugar guardaría un carácter escribiendoe+c+w
.Crédito a undergroundmonorail de cuya respuesta basé mi estructura general de código.
fuente
(e<w)*S.count(c+e)>1
se puede jugar al golfe<w<w*S.count(c+e)
para guardar 2 caracteres.Rubí, 114
Sin golf:
fuente
k4 (70)
no particularmente golfizado; estoy seguro de que podría ser más corto
bastante similar a la J impl. Creo que antes, básicamente, solo recopila todos los prefijos (apropiados), elimina las palabras de los prefijos nuevamente (para manejar el caso
"car"
/"carpet"
), las agrupa en clases de equivalencia, selecciona las clases con un solo elemento, las reduce de las listas a cadenas y agrega en el mapa de cadenas a sí mismos.algunos casos de prueba
tenga en cuenta que en
k
/q
, una cadena es una lista de caracteres, por lo que una cadena que contiene un solo carácter debe marcarse como tal utilizando la,
función unaria ; & mmwrt una lista de cadenas que contiene una sola cadenaEstos utilizan
q
lashow
función, que tiene un formato incorporado para algunas estructuras de datos, para hacer que los resultados sean más legibles:fuente
JavaScript - 212
Golf inicial
Entrada:
code,golf,going
Salida:
["c:code", "co:code", "cod:code", "code:code", "gol:golf", "golf:golf", "goi:going", "goin:going", "going:going"]
fuente
Perl,
9377Con nuevas líneas y sangría para facilitar la lectura:
Un poco tarde y demasiado largo, pero me alegro de que finalmente haya llegado a menos de 100. La función devuelve una lista que se puede asignar a la variable hash:
y
En realidad, la lista devuelta aún no se filtra; la construcción de hash se completa en el momento de su asignación, es decir, la función externa. SI no es lo suficientemente limpio / justo, agregue 3 para contar y coloque el contenido de la función en llaves, precediendo
+
, luego la función devuelve la referencia hash 'verdadera'.fuente
Q: 44 bytes
Notas
El lenguaje Q tiene un núcleo interno llamado internamente K4 (usado en esta respuesta y otra respuesta previa a esta pregunta)
Para probar el código, descargue el intérprete (kx.com, gratuito para uso no comercial, soporte para Windows, Linux, Mac)
El intérprete admite dos sintaxis:
detallado (nombres más legibles, nombres distintos para montañas y diads, más bibliotecas, ...). Cargar archivo fuente con extensión q o intérprete interactivo
compacto (núcleo interno funcional, operadores de una letra, misma letra para ambos usos mónada / diad, ...). Cargue el archivo fuente con la extensión k, o el intérprete interactivo en modo k (escriba \ en el indicador). El código debe ser probado en este modo
El código define una lambda (función anónima). Para dar nombre a la función, necesitamos el nombre del prefijo: (ex f: {..}), por lo que requiere 46 bytes
PRUEBA
(suponiendo una función con nombre: de lo contrario, sustituya f por el código)
devuelve un diccionario (claves de sintaxis! valores). Las teclas son una lista de símbolos (`symb`symb ..), y valora una lista de símbolos. Si ejecutamos la sentencia en el intérprete interactivo, tenemos una presentación más conveniente (cada clave y valores asociados en una línea diferente)
EXPLICACIÓN
x
es el argumento implícito de la lambda$x
convertir lista de símbolos a lista de cadenas(-1_)\
itera sobre cada elemento de la lista de símbolos(se lee como para cada cadena calcula prefijos (en la iteración de comer cae el último carácter de la cadena (-1_), hasta que la cadena esté vacía)
$
se transforma de nuevo en una lista de símbolos (lista de todos los prefijos)p:
y asigna a p,/
arrasar todo (concatena y crea una estructura de un nivel)=
clasifica -> para cada prefijo único, asocia las palabras correspondientes#:'
calcula la longitud (número de palabras asociadas a cada prefijo)1=
verdadero si longitud = 1 (inequívoco), falso de lo contrario&
donde -> índice de elementos verdaderosp in\:
determina para todos los prefijos si están en un prefijo inequívoco(..)'
se aplica (..) a cada valor a la derecha (prefijo inequívoco)?0,&:
-> distinto 0 concatenado donde (para hacer frente a las palabras como prefijo de sí mismo)p@
transformar índices en símbolosx!..
construir un diccionario con x (palabras) como claves y .. como valoresLeído como:
Construye y devuelve un diccionario con las palabras como claves y valores.
... valores de índices en posiciones distintas 0 (todas las palabras) y donde prefijo inequívoco
... inequívoco calculado como prefijos que aparecen solo en una palabra (la lista de palabras se asocia a cada símbolo tiene una longitud)
... listas resultantes de clasificar todos los símbolos únicos con las palabras correspondientes
... prefijos calculados repitiendo drop last char de cada palabra
fuente
PHP 7.0, 67 bytes (es posterior al desafío)
toma datos de los argumentos de la línea de comandos; imprime una coma final; correr con
-nr
.para PHP más nuevo , agregue un byte: Reemplace
&a
con""<
.para PHP anterior, use estos 70 bytes:
PHP, 70 bytes
fuente
Brachylog , 23 bytes
Pruébalo en línea!
Toma la entrada como una lista a través de la variable de entrada y genera una lista de
[key, value]
pares a través de la variable de salida. Cualquier cadena de entrada que no sea un prefijo de otra cadena de entrada se generará como un prefijo de sí misma dos veces, aunque el encabezado en TIO lo oculta usandoᵘ
para obtener la lista completa en lugar deᶠ
.fuente
{}ᵘ
, a menos que haya una forma más corta de excluir que algo sea un prefijo de sí mismo o generar todos los pares de salida necesarios sin la regla adicional∋gj
.Perl 5
-a
, 76 bytesPruébalo en línea!
fuente
APL (Dyalog Classic) , 38 bytes
gracias Erik the Outgolfer por recordarme que use una codificación de caracteres de un solo byte
Pruébalo en línea!
fuente
Pitón (127)
¿Entonces no pude comentar @undergroundmonorail, pero pensé que sería mejor adoptar un enfoque de diccionario? Estoy seguro de que con un poco de comprensión de listas / diccionarios también podría reducirse enormemente, pero no puedo hacer que funcione con estallidos del dict.
La impresión generará el diccionario, sin ordenar.
EDITAR: Ahh, perdí el auto: auto / auto: criterio de alfombra. Tal vez una verificación de longitud?
fuente
Groovy - 212 caracteres
Golfizado:
salida de ejemplo:
Sin golf:
fuente
JavaScript (Node.js) , 88 bytes
Pruébalo en línea!
fuente
Zsh , 95 bytes
Pruébalo en línea!
La única forma de "devolver" una matriz asociativa en Bash / Zsh es declarándola sin la
local
palabra clave y luego accediendo a ella en el ámbito primario. Esto ahorraría un byte. Sin embargo, la E / S a través de variables generalmente está mal vista, por lo que imprimimos la definición de matriz en su lugar.fuente
Ruby , 84 bytes
Acabo de notar que ya existe una solución Ruby, oh bueno. Básicamente, esto mejora la solución anterior al elegir prefijos de una manera más inteligente (eliminando la necesidad de agregar cada palabra como "prefijo" al final) y contando los prefijos para verificar la unicidad antes de agregarlos al hash, en lugar de sobrescribir el valor con un maniquí si hay un duplicado y luego borrando la entrada.
Pruébalo en línea!
fuente