Cadenas con contexto
Para los propósitos de este desafío, una cadena con contexto es un triple de cadenas, llamada contexto izquierdo , parte de datos y contexto derecho . Representa una subcadena de una cadena más larga. Usamos la tubería vertical |
como separador, por lo que un ejemplo de una cadena con contexto es cod|e-go|lf
, donde está el contexto izquierdo cod
, los datos e-go
y el contexto correcto lf
. Este ejemplo representa la subcadena e-go
de code-golf
.
Ahora, para concatenar dos cadenas con contexto, procedemos de la siguiente manera, usando aa|bcc|dee
y cc|de|eee
como ejemplos. Alineamos las cuerdas como en el diagrama.
a a|b c c|d e e
c c|d e|e e e
para que sus partes de datos sean adyacentes. La parte de datos de la concatenación es la concatenación de las partes de datos, en este caso bccde
. El contexto de la izquierda es la parte que extiende los elementos hacia la izquierda de la primera parte de datos, en este caso aa
. Del mismo modo, el contexto correcto es eee
, por lo que la concatenación es la cadena con contexto aa|bccde|eee
. Para un segundo ejemplo, considere a|bb|cd
y aabb|cd|
, donde la segunda palabra tiene un contexto derecho vacío. El diagrama de alineación es
a|b b|c d
a a b b|c d|
donde el contexto izquierdo de la segunda palabra se extiende más allá del de la primera. La concatenación es aa|bbcd|
.
Pero espera, hay un problema: si las letras del diagrama de alineación no coinciden, ¡la concatenación no existe! Como ejemplo, el diagrama de aa|bb|cc
y c|c|c
es
a a|b b|c c
c|c|c
donde la b
y c
en la cuarta columna no están de acuerdo, por lo que no se pueden concatenar.
La tarea
Su trabajo consiste en escribir un programa que tome dos cadenas con contexto cuyas partes estén separadas por |
lo anterior, y genere su concatenación si existe, y algo más si no. El "algo más" puede ser cualquier valor, sin salida, siempre que no sea una cadena válida con contexto y sea igual en todos los casos. Sin embargo, arrojar un error no es aceptable. Puede asignar un programa STDIN a STDOUT o una función, y también se aceptan funciones anónimas. El conteo de bytes más pequeño gana, y las lagunas estándar no se permiten.
Casos de prueba
aa|bcc|dee cc|de|eee -> aa|bccde|eee
a|bb|cd aabb|cd| -> aa|bbcd|
a|b|cccd aab|cc|c -> aa|bcc|cd
a|b|c b||cd -> a|b|cd
aa|bb|cc c|c|c -> None
aaa|b|c abb|cd|d -> None
|bb|cd abb|c|ed -> None
a|b|c a||cd -> None
|1<2=""
a la definición de&
debería resolver eso. Lo siento, no especifiqué esto más explícitamente en las especificaciones, lo'|'
signos cuando las cadenas no coinciden?Python (242 bytes)
Explicación
La función lambda
m
devuelve la más larga de dos cadenas siempre que compartan un prefijo común. Esto se hace mediante la concatenación de la cadena vacía''
, en lugar de cualquiera de los valores que faltan, a continuación, girando el resultado (que puede tomar la formaaa
,ab
,a
, ob
en los casos de coincidencia / no coincide / longitudes desiguales) en un conjunto de caracteres únicos en cada posición.join
espera un único argumento, por lo que desempaquetar un conjunto con más de un elemento hará que genere aTypeError
.La función principal entonces
m
para combinar el contexto izquierdo y la parte de datos de la primera palabra con el contexto izquierdo de la segunda (de derecha a izquierda sobre cadenas invertidas)m
para combinar el contexto correcto de la primera palabra con la parte de datos y el contexto correcto de la segundaLas partes de datos de las dos palabras originales se recortan de los lados derecho e izquierdo de los nuevos contextos.
Como sabemos que las desalineaciones provocan
m
un aTypeError
, en estos casos captamos la excepción y regresamos implícitamenteNone
.Pruebas
Salida
fuente