Explicación
Se pueden barajar dos cadenas intercalando sus letras para formar una nueva cadena, al igual que dos pilas de cartas se pueden barajar para formar una sola pila.
Por ejemplo, las cadenas HELLO
y WORLD
se pueden mezclar para formar HWEOLRLLOD
, o HEWORLLLDO
, o quizás simplemente HELLOWORLD
.
Es no una reproducción aleatoria si la orden original de las cartas no se conserva. Por ejemplo, la D
de WORLD
que no puede aparecer siempre antes del R
después de haber sido barajadas. Esto significa que EHLLOWRDLO
, por ejemplo, no es una mezcla de , HELLO
y WORLD
aunque contiene todas las letras originales.
Una cadena es una mezcla de gemelos si se puede formar barajando dos cadenas idénticas. Por ejemplo, ABACBDECDE
es una mezcla de gemelos porque puede formarse barajando ABCDE
y ABCDE
. DBEACBCADE
no es una mezcla de gemelos porque no se puede formar mezclando dos cadenas idénticas.
Detalles del programa
Dada una cadena de entrada, salida 0
si no es una combinación aleatoria de gemelos, y salida de una de las cadenas gemelas si es una combinación aleatoria de gemelos.
Puede suponer que la cadena de entrada tiene una longitud inclusive entre cuatro y veinte caracteres y está compuesta completamente por caracteres alfabéticos en mayúsculas. Debería poder ejecutarse en un tiempo razonable, digamos, menos de 10 minutos.
Este es el código de golf, por lo que gana la solución más corta.
Ejemplo de E / S
> ABACBDECDE
ABCDE
> DBEACBCADE
0
> FFFFFF
FFF
> FFGGG
0
> ABBA
0
> AABB
AB
> AABAAB
AAB
Tengo un ejemplo (no golfizado) de implementación .
fuente
that the input string has a length inclusively between four and twenty characters
, y no me digas "¡nunca confíes en la entrada del usuario!", "¡Nunca confíes en las especificaciones!"FFGGG
para que sea consistente.Respuestas:
Haskell, 114
Sin golf:
Explicación:
La mayor parte del trabajo se realiza en la
partitions
función. Funciona generando recursivamente todas las particiones(a, b)
de la cola de la lista, y luego usando la mónada de la lista para anteponer el elemento inicialx
a cada una de ellas y reunir todos los resultados.findMatch
funciona filtrando esta lista para que solo permanezcan las particiones donde las subsecuencias son iguales. Luego devuelve la primera subsecuencia en la primera partición. Si no queda ninguno, la lista está vacía, por lo que"0"
se devuelve el agregado al final.main
solo lee la entrada, la alimenta a través de estas dos funciones y la imprime.fuente
R, 113 caracteres
Sin golf (y en su lugar, una función que toma la cadena):
La solución se basa en la
combn
función que genera todas las combinaciones de índices como columnas en una matriz.apply
luego aplica una función a cada columna (dimensión2
) en la matriz y devuelve un vector de cadenas o ceros.max
luego encuentre la cadena más grande (que triunfa 0).Una característica interesante en R es la capacidad de seleccionar un subconjunto de un vector dado un vector de índices, y luego seleccionar el complemento de ese subconjunto negando los índices:
x[i] == x[-i]
fuente
Mathematica, 87
Esto se basa directamente en la publicación de hammar, pero es de esperar que sea lo suficientemente distinto como para merecer publicación.
Prueba:
fuente
re
usando la búsqueda recursiva en profundidad primero
Puedo hacerlo más rápido con una
int i = min(a.length,b.length);if(a[0..i]!=b[0..i])return "0";
cláusula de guardiafuente
void main(){writeln(c("ABCADABCAD"));}
, solo una versión diferente de D, mi culpa, ¿algo más? ¿Qué pasa con "ABCABCA"?Ruby, 89 caracteres
Este código implementa un algoritmo de búsqueda recursiva simple. La entrada debe darse en STDIN.
fuente
Perl, 68 caracteres
Se supone que la cadena de entrada está en el
$_
variable, la salida es el valor de la expresión. Las nuevas líneas finales en la entrada se ignoran. Puede ejecutar esto desde la línea de comando de esta manera:Este código utiliza el motor regexp de Perl (y específicamente su función de ejecución de código incrustada ) para realizar el seguimiento. Básicamente, hace coincidir la cadena de entrada con la expresión regular
^((.+))+$
, haciendo un seguimiento de las coincidencias pares e impares en$x
y$,
, y rechazando la coincidencia al final si las dos no son iguales.fuente
AABAAB
?AABAAB
es un caso fácil para esta solución, ya que el grupo externo solo necesita coincidir dos veces. Me tomó mucho más tiempo lograr que se manejeAABB
bien).Python, 168 caracteres
fuente