Escriba un programa que tome 2 cadenas como entrada y devuelva el prefijo común más largo. Este es el código de golf , por lo que gana la respuesta con la menor cantidad de bytes.
Test Case 1:
"global" , "glossary"
"glo"
Test Case 2:
"department" , "depart"
"depart"
Test Case 3:
"glove", "dove"
""
"aca", "aba"
.global
yGLOSSARY
volverglo
o''
?Respuestas:
Python 3, 54 bytes
¡Gracias Python por tener una función integrada para esta tarea! :RE
Toma entrada como dos palabras separadas por un espacio como
glossary global
.fuente
Haskell, 29 bytes
Uso:
Define recursivamente la función binaria
%
por coincidencia de patrones. En dos cadenas con las primeras letras iguales, toma esas primeras letras y las antepone a la función del resto de las cadenas. En cualquier otra cosa, da la cadena vacía.fuente
Pyth,
87 bytesGracias @isaacg por 1 byte de descuento
Toma la entrada entre comillas y separadas por comas, como
"abc", "acc"
. Esto sale por un error (pero deja stdout vacío) cuando el resultado es la cadena vacía. Si eso es inaceptable, agregue 2 bytes para#e@F._MQq
Banco de pruebas
Explicación
fuente
e|@F._M.z]k
.#...q
es un byte menos que eso, lo"abc", "def"
y puede usar enQ
lugar de.z
C ++,
10110099 bytesLee dos cadenas de
stdin
, imprime el carácter en la posición actual de una de las cadenas, mientras que el carácter en la posición actual es igual al carácter en la misma posición en la otra cadena.Gracias a Zereges por guardar un byte.
fuente
for
declaración ...int i
en el espacio global (para que sea 0 inicializado)Haskell, 38 bytes
Ejemplo de uso:
( ((map fst.fst.span(uncurry(==))).).zip ) "global" "glossary"
->"glo"
.Comprime ambas cadenas de entrada en una lista de pares de caracteres. Haga dos listas: la primera con todos los pares desde el principio siempre que ambos personajes sean iguales, la segunda con todos los restos. Suelte la segunda lista y extraiga todos los caracteres de la primera lista.
fuente
CJam,
12119 bytesEsto lee las cuerdas de dos líneas separadas con terminación de línea de estilo Unix, es decir,
<string>\n<string>\n
.¡Gracias a @ MartinBüttner por -1 byte y a @ jimmy23013 por -2 bytes!
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
l_q.-
.APL, 13
Esta es una función que toma una matriz de dos cadenas y devuelve el prefijo:
fuente
AppleScript, 215 bytes
Y lo intenté mucho ...; (
Quería ver qué tan bien AppleScript podría lograr esto, y hombre , no está diseñado para comparaciones de cadenas.
fuente
tell app "System Events" to <something>
. Sin embargo, es interesante ver cómo se trata este tipo de cosas. @ kirbyfan64sosrs , 14 bytes
Demostración en vivo y casos de prueba.
Esto es bastante simple Simplemente coincide con el prefijo común más largo y elimina el resto de la cadena. Si no hay un prefijo común más largo, simplemente lo borra todo.
fuente
sed, 18
Tenía algo mucho más largo y más complicado en mente, así que el crédito por esta idea va a @ kirbyfan64sos .
Incluye +1 para la
-r
opción de sed.fuente
CJam,
12826Pruébalo en línea.
(Tengo idea de usar. = En lugar de .- después de ver la respuesta de Dennis).
Con todos los casos límite, se hizo difícil para un principiante de CJam como yo mantenerlo corto. Con suerte, esto al menos funciona para todos los casos.
fuente
C #,
201147 bytesSé que no es terriblemente competitivo. Solo quería ver cómo se vería.
EDITAR: Gracias Ash Burlakzenko, Berend y Dennis_E
fuente
using System.*
?.ForEach(x=>Console.Write(x))
podría reducirse a.ForEach(Console.Write)
using System.Collections.Generic;
es innecesario Afeite un byte más quitando el espacio destring[] a
.Contains
es innecesario. 2-Puede guardar algunos bytes quitandousing System;
y diciendoSystem.Console.Write;
3-Este código devuelve el resultado incorrecto ("a") para la entrada "aab", "aaab", debido aIndexOf
. La solución más corta que se me ocurre es usara[0].Take(a[1].Length)
Esto tiene 147 bytes de longitud: "usando System.Linq; clase a {Main void Main (string [] a) {a [0] .Take (a [1] .Length) .TakeWhile ((c, i) => a [1] [i] == c) .ToList (). ForEach (System.Console.Write);}} "Lisp común, 39
Toma dos argumentos de cadena, determina el índice i donde difieren y devuelve una subcadena de 0 a i .
fuente
Perl 5,
201918 bytes19 bytes, más 1 para la
-E
bandera en lugar de-e
:Esto es copiado descaradamente de Digital Trauma 's respuesta SED . Se supone que la entrada es un par de palabras sin espacios en ellas (o antes de la primera) y con un espacio entre ellas.
Actualizar:
ThisSuitIsBlackNot sugirió usar
-pe
lo siguiente para guardar un byte (¡gracias!):Y luego Luk Storms sugirió usar
-nE
lo siguiente para guardar otro byte (¡gracias!):(Estoy contando
-E
como un byte en lugar de la norma-e
, pero-n
o-p
como dos. Mi impresión es que eso es SOP por aquí.)fuente
-M5.010
, cuando es necesario, es gratis" . Por la misma meta publicación,-pe
o-ne
sería 1 byte adicional, no 2. Entoncesperl -nE 'say/^(.*).* \1/'
obtendría 16 bytes.Pitón 3, 72
31 bytes guardados gracias a FryAmTheEggman. 8 guardados gracias a DSM.
fuente
zip
? : Dinput()
s en elzip
y guardar ela
y elb
enlace.Pitón 3, 47
Una función que toma una lista
w
de dos palabras e imprime el prefijo común antes de terminar con un error.La
print
función de Python 3 le permite imprimir cadenas alineadas entre síprint(end=c)
(gracias a Sp3000 por guardar 3 bytes con esta sintaxis más corta). Esto repetidamente toma dos letras de las palabras e imprime la primera de las letras. La indexaciónc[c!=d]
da un error fuera de límites dondec!=d
, terminando la ejecución cuando se encuentran dos letras desiguales.Un bucle for explícito es un carácter más largo que la comprensión de la lista:
fuente
print(end=c[c!=d])
?print
ser opcional significaba que podía llamarse solo con el argumento final, y que podría contener la cadena. Ese es un truco realmente útil en general. Deberías hacer una propina.Javascript ES6, 52 bytes
Uso:
fuente
ada,aca
...f=
(a,b)=>[...a].map((e,i)=>e==b[i]?e:b='').join``
Retina , 14 bytes
Utiliza la misma idea que kirbyfan64sos . Desafortunadamente, a pesar de la afirmación de Martin de que eventualmente el modo Match contará con una forma de imprimir grupos de captura, aún no se ha implementado. De lo contrario,
(.*).* \1
podría usarse junto con 2 bytes más o menos para alguna opción de cadena de configuración aún no existente.Cada línea iría en su propio archivo, con 1 byte agregado por archivo adicional. Alternativamente, ejecute en un solo archivo con la
-s
bandera.fuente
\1
asegura que ambas palabras comiencen con el mismo prefijo. Entonces, no importa cuán codicioso(.*)
sea,\1
es lo mismo.K, 24 bytes
Encuentra el mínimo de la longitud de cada cadena. (
(&/#:'x)
) Recorte cada cuerda a esa longitud (#'x
). Luego compara, difumina y suma la secuencia resultante:Finalmente, tome tantos caracteres de la primera de las cadenas proporcionadas (
#*x
).En acción:
fuente
Powershell, 65 bytes
Compare las cadenas, reduciendo la primera hasta que coincida (imprimir y salir) o la cadena sea nula y el ciclo termine.
fuente
Julia, 62 bytes
Sin golf:
Se solucionó un problema (con un costo considerable de 14 bytes) gracias a xnor!
fuente
C99, 73 bytes
Similar a esta respuesta , pero más corta y cumple con las especificaciones (toma la entrada de stdin).
fuente
#include<stdio.h>
, que es necesario para que el programa compile.main(int c,char**a){for(;*a[1]==*a[2]++;putchar(*a[1]++));}
(59 bytes).MATLAB,
5040 bytesDefine una función que acepta 2 cadenas como entrada, salidas a la ventana de comando
Esta solución funcionará para cualquier cadena, salidas
si no se da coincidencia
Se puede jugar golf usando un script en lugar de una función (usando variables locales a, b) (-16 bytes).
entonces obteniendo 34 Bytes
El estilo de función (que parece ser el estilo aceptado), produce
(Gracias @Stewie Griffin)
fuente
@(a,b)a(1:find([diff(char(a,b)) 1],1)-1)
. =)Perl 6 , 28 bytes
Se me ocurrieron dos que toman sus valores de STDIN que se basan en la respuesta de Perl 5.
El primero requiere exactamente un espacio entre las entradas, mientras que el otro requiere al menos un espacio en blanco entre las entradas.
Eso es bastante más corto que lo primero que probé, que toma los valores de la línea de comando.
o incluso la versión lambda de la misma:
Aunque esto es mucho más fácil de ajustar para que acepte cualquier número de cadenas de entrada, a costa de un solo trazo.
fuente
Japt, 27 bytes
Japt es una versión abreviada de Ja vaScri pt . Interprete
(Las cuerdas van en la caja de entrada, así:
"global" "glossary"
)Este código es exactamente equivalente al siguiente JS:
Todavía no he implementado funciones anónimas, que es para lo que
$...$
sirve: cualquier cosa entre los signos de dólar se deja intacta en el cambio a JS. Después de agregar funciones, este código de 21 bytes será suficiente:Y después de implementar algunas características más, idealmente será de 18 bytes:
Sugerencias bienvenidas!
Entonces resulta que este programa tiene solo 15 bytes en el Japt moderno:
Pruébalo en línea!
fuente
MATL ,
119 bytesPruébalo en línea!
(-2 bytes gracias a Giuseppe)
fuente
y
idea es bastante buena, había intentado cosas como una inicial eniti
lugar de la1Gw
, pero no pensé en usar ely
para eso.Clojure / ClojureScript, 51
Muy claro. Desafortunadamente, los espacios alrededor de la desestructuración de parámetros son necesarios (eso es
[a & b]
todo). No es el más corto, pero supero algunas otras respuestas en idiomas a los que les gusta alardear de su brevedad, así que lo publicaré.fuente
Python 2, 50 bytes
Entrada
La entrada se toma como dos cadenas:
Salida
La salida es cada carácter seguido de un espacio; lo cual, con suerte, no es un problema. Sin embargo, si es así, editaré mi respuesta.
fuente
"global" , "glossary"
(dos cadenas separadas). ¿Cuántas otras respuestas siguen a la carta? @ThomasKwaprint(exit()if a!=b else a,end='')
? No sé si eso funcionará o no, pero podríaTeaScript, 16 bytes
20Toma cada entrada separada por un espacio.
fuente
PHP, 52 bytes
No es espectacular pero hace el trabajo:
Toma dos argumentos de línea de comando:
fuente
while(($a=$argv)[1][$i]==$a[2][$i])echo$a[1][$i++];
: otra solución única de PHP7 (y lo mejor que puedo encontrar con @ 50 bytes)<?=substr(($a=$argv)[1],0,strspn($a[1]^$a[2],~ÿ));
. Asegúrese de que su editor esté en modo ASCII, es importante~ÿ
que no se convierta a Unicode.