Considere la siguiente lista de palabras ordenadas alfabéticamente:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
Todas las palabras comienzan con b
, y las primeras 5 comienzan con bal
. Si solo miramos las primeras 2 palabras:
balderdash
ballet
podríamos escribir en su lugar:
balderdash
+let
donde ' '
se usa donde una palabra comparte un carácter de prefijo con la palabra anterior; excepto el '+'
carácter que indica el ÚLTIMO carácter donde la segunda palabra comparte un prefijo con la palabra anterior.
Esta es una especie de visualización 'trie' : el padre es ' bal
' y tiene 2 descendientes: 'derdash'
y 'let'
.
Con una lista más larga, como:
balderdash
ballet
brooding
también podemos usar el carácter de canalización '|'
para aclarar dónde termina el prefijo compartido, de la siguiente manera:
balderdash
| +let
+rooding
y el árbol equivalente tendría una raíz de 'b'
tener dos hijos: el subárbol con raíz 'al'
y sus dos hijos 'derdash'
y 'let'
; y 'rooding'
.
Si aplicamos esta estrategia a nuestra lista original,
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
obtenemos resultados que se parecen a:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
Si dos palabras consecutivas en la lista no tienen prefijo compartido, no se sustituyen caracteres especiales; Por ejemplo, para la lista:
broom
brood
crude
crumb
queremos la salida:
broom
+d
crude
+mb
Entrada
Las palabras en la entrada estarán compuestas únicamente de caracteres alfanuméricos (sin espacios ni signos de puntuación); Esto puede ser en forma de una lista de cadenas, una sola cadena o cualquier otro enfoque razonable, siempre que especifique el formato elegido. No hay dos palabras consecutivas iguales. La lista se ordenará alfabéticamente.
Salida
Su salida puede contener espacios en blanco finales por línea o en total, pero no espacios en blanco iniciales. Una lista de cadenas o similar también sería aceptable.
Este es el código de golf ; El código más corto en cada idioma conserva los derechos de fanfarronear. Se aplican las prohibiciones habituales contra las lagunas.
Casos de prueba
Input:
apogee
apology
app
apple
applique
apply
apt
Output:
apogee
|+logy
+p
|+le
| +ique
| +y
+t
Input:
balderdash
ballet
balloonfish
balloonist
ballot
brooding
broom
donald
donatella
donna
dont
dumb
Output:
balderdash
| +let
| +oonfish
| | +ist
| +t
+rooding
+m
donald
| |+tella
| +na
| +t
+umb
ball
despuésballoon
? ¿Qué salida debemos esperar?+
debajo del primeroo
, pero no escribí el desafío, así que no estoy seguro.Respuestas:
Retina 0.8.2 ,
5857 bytesPruébalo en línea! El enlace incluye un caso de prueba. Editar: Guardado 1 byte gracias a @FryAmTheEggman señalando que pasé por alto un cambio de
\b
al^
hecho posible por elm)
. Explicación:Active por línea
^
para todo el programa.Para cada palabra, intente hacer coincidir tanto como sea posible desde el comienzo de la palabra anterior. Cambia la coincidencia a espacios, excepto el último carácter, que se convierte en a
+
.Reemplace repetidamente todos los espacios inmediatamente superiores a
+
so|
s con|
s.fuente
m)
específicamente para poder hacer eso, así que me molesta que me haya perdido una instancia.JavaScript (ES6), 128 bytes
Espera y devuelve una lista de listas de caracteres.
Pruébalo en línea!
¿Cómo?
Los espacios y
+
's se pueden insertar caminando a través de la primera a la última palabra en orden, pero|
solo se pueden insertar a posteriori una vez que+
se ha identificado. Esto podría lograrse haciendo dos pases distintos, pero en su lugar guardamos un puntero en cada entrada modificadaa[~y]
para que luego pueda actualizarse nuevamente dentro del mismomap()
ciclo.En teoría, una solución más simple sería recorrer las palabras en orden inverso y también invertir la salida al final del proceso. Pero esto es un poco costoso en JS y no encontré una manera de obtener una versión más corta con este método.
fuente
JavaScript (Node.js) ,
125122118117 bytesPruébalo en línea!
fuente
Python,
263260 bytes- 3 bytes gracias a Jonathan Frech
Código:
Pruébalo en línea!
Explicación:
Esta solución crea un trie a partir de las palabras de entrada y lo analiza de forma recursiva en la salida requerida. La función a toma un trie t y una cadena s y agrega x a t. Las pruebas se implementan como diccionarios anidados. Cada diccionario representa un nodo en el trie. Por ejemplo, el diccionario que representa el trie generado por el primer caso de prueba se ve así:
La función p se repite a través de esta estructura y genera la representación en cadena del trie esperado por el desafío. La función f toma un montón de cadenas como argumentos, las agrega todas a un trie con a, luego devuelve el resultado de llamar a p en el trie.
fuente
C (gcc) ,
165155bytesToma tres argumentos:
char** a
: una matriz de palabras terminadas en nulochar* m
: una matriz de la longitud de cada palabraint n
: el número de palabras en la matrizPruébalo en línea!
fuente
++i<n&j<m[i]&a[i--]
un comportamiento indefinido? ¿Puedo confiar en que gcc lo evalúe de izquierda a derecha?Perl 6 ,
149144142bytesPruébalo en línea!
Estoy seguro de que esto se puede jugar más, especialmente porque no soy un experto en expresiones regulares. Esto utiliza el mismo proceso que la respuesta de Retina de Neil .
fuente
Python 2 , 191 bytes
Pruébalo en línea!
fuente
Ruby , 118 bytes
Pruébalo en línea!
Acepta una matriz de cadenas, salidas modificando la matriz de entrada original en el lugar.
Explicación
La transformación de cadena básica no es demasiado compleja, pero para insertar tuberías verticales correctamente, necesitamos iterar en orden inverso, y dado que el
reverse
método es bastante detallado, lo haremos de una manera más complicada. Aquí, usamosmap
solo para ejecutar el ciclo, dejamos la primera palabra sola y luego iteramos desde el final usando índices negativos:fuente