A veces sucede que mientras escribo una oración, me distraigo y termino escribiendo el mismo par de palabras dos veces, dos veces seguidas.
Para asegurarse de que otras personas no se molesten por esto, su tarea es escribir un programa que resuelva este problema.
Tarea
Dada una cadena de entrada (si es importante para su idioma, puede suponer una entrada ASCII solo que no contiene saltos de línea) str
, que contiene en algún lugar en el medio una subcadena que ocurre dos veces en sucesión inmediata, devuelva la cadena con una instancia de este subcadena eliminada.
En el caso de múltiples posibilidades, devuelva la respuesta más corta posible (es decir, elija la subcadena repetida consecutiva más larga y elimine esa).
En el caso de múltiples subcadenas repetitivas consecutivas de igual longitud, elimine la primera (es decir, la primera que se encuentre al leer la cadena de adelante hacia atrás).
Puede suponer que la entrada es correcta (es decir, siempre contiene una subcadena repetida consecutiva), lo que podría ayudar a reducirla.
Ejemplos
- Entrada:
hello hello world
-> Salida:hello world
. - Entrada:
foofoo
-> Salida:foo
. (Entonces: Sí, la cadena solo puede consistir en la parte repetida dos veces). - Entrada:
aaaaa
-> Salida:aaa
como la subcadena consecutiva más larga está aquíaa
. - Entrada:
Slartibartfast
-> Esta no es una entrada válida, ya que no contiene una subcadena repetida consecutiva, por lo que no necesita manejar este caso. - Entrada:
the few the bar
-> Esta es otra entrada no válida, ya que la parte que se repite debe seguir inmediatamente a la parte original. En este caso,the
ythe
están separados por otra cosa intermedia, por lo que esta entrada no es válida. - Entrada:
ababcbc
-> Salida:abcbc
. Las dos subcadenas repetidas consecutivas más largas posibles sonab
ybc
. Comoab
se encontró anteriormente en la cadena, esta es la respuesta correcta. - Entrada:
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo
. Salida:Buffalo buffalo buffalo buffalo Buffalo buffalo
. (El reemplazo realizado debe ser sensible a mayúsculas y minúsculas). - Entrada:
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
-> Salida:Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Solo se elimina la subcadena repetida consecutiva más larga.
Su código debe ser lo más corto posible, ya que es code-golf , por lo que gana la respuesta más corta en bytes. ¡Buena suerte!
Sometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice couple of words twice in succession.
como entrada, la salida debería serSometimes it happens that while typing a sentence, I am distracted and I end up typing the same couple of words twice in succession.
. Solo se elimina la duplicación encontrada más larga.p
enhappens
Respuestas:
Perl 6 , 40 bytes
Intentalo
fuente
Retina ,
3533 bytesEl recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
Explicación
Dado que los motores regex buscan coincidencias de izquierda a derecha, no es trivial encontrar la coincidencia más larga, independientemente de la posición. Se puede hacer con los grupos de equilibrio de .NET, pero el resultado es bastante desagradable:
Así que pensé que trataría de evitar eso haciendo uso de algunas otras funciones de Retina.
Comenzamos aplicando esencialmente todas las sustituciones posibles, una en cada línea. Para hacer esto, hacemos coincidir la posición frente a una coincidencia (en lugar de la coincidencia misma), para permitir coincidencias superpuestas. Esto se hace poniendo la expresión regular real en una anticipación. Esa búsqueda anticipada luego captura el resto excepto el duplicado que queremos eliminar en el grupo 2. Reescribimos el grupo 2 (eliminando el duplicado), un salto de línea, y luego toda la entrada hasta la coincidencia, que nos da básicamente una nueva línea para ser sustituido
Al final tendremos una línea para cada partido, con el correspondiente duplicado eliminado. Al final, también habrá una entrada completa nuevamente sin ninguna sustitución.
Ahora que tenemos todas las sustituciones posibles, queremos el resultado más corto (que corresponde a la repetición eliminada más larga).
Entonces, primero ordenamos las líneas por longitud.
Y luego solo mantenemos la primera línea.
fuente
Jalea ,
2219 bytes-2 bytes gracias a Dennis (evite una inversión de argumento, elimine incrementos sutilmente redundantes)
Pruébalo en línea!
Programa completo (se ha encontrado un error al
ÐṀ
no actuar con el arity correcto sobre las díadas, que se solucionará pronto; aunque no estoy seguro de que pueda hacer un código más corto aquí).¿Cómo?
Encuentra el primero de los segmentos más largos de la entrada de modo que exista una repetición en la entrada y lo elimina de la entrada.
fuente
JavaScript (ES6),
8174 bytesEditar: Guardado 7 bytes al robar el
m[r.length]
truco de @ Arnauld .fuente
PowerShell , 87 bytes
Pruébalo en línea! (todos los casos de prueba)
Explicación
Comenzando desde adentro básicamente, corremos
Matches
con la(.+)\1
expresión regular, para devolver todos los objetos coincidentes para la cadena especificada. La expresión regular coincide con cualquier secuencia de caracteres seguida sola.Luego, los objetos de coincidencia resultantes se canalizan
sort
para ser ordenados por suLength
propiedad (acortados a comodín). Esto da como resultado una serie de coincidencias ordenadas por longitud, ascendentes, por lo que debe indexarse[-1]
para obtener el último elemento (el más largo). Sin embargo, el valor de esa coincidencia es la coincidencia, no el grupo, por lo que incluye la repetición, por lo que recuperamos el objeto Grupo (|% Gr*
) y luego el valor de ese (|% V*
) para obtener la cadena repetida más grande. La cosa es que el objeto de grupo es en realidad una matriz porque el grupo 0 siempre es la coincidencia, pero quiero el grupo real (1), por lo que el valor resultante es en realidad el valor s , por lo tanto, la indexación para obtener el segundo elemento[1]
. Este valor se convierte en un objeto regex y luego elReplace
Se llama al método contra la cadena original, reemplazándolo por nada, y solo se reemplaza la primera coincidencia (|% Re* $s '' 1
).fuente
Haskell , 101 bytes
La función principal es
f
, toma y devuelve aString
.Pruébalo en línea!
Cuando empecé esto, he importado
Data.List
y usadomaximum
,tails
,inits
yisPrefixOf
. De alguna manera eso se convirtió en esto. Pero aún así solo logré eliminar 11 bytes ...Notas
splitAt
/a
divide una cadena en un índice dado.s
es la cadena de entrada.i
es la lista de números[0 .. length s - 1]
,-1
es para evitar que sesplitAt
divida al final si se le da un índice demasiado grande.n
eslength s
menos el objetivo de longitud actual para la parte repetida, se elige de esa manera para que no tengamos que usar dos listas de números y / o la sintaxis detallada de lista decreciente.p
,r
Yt
son una división de tres vías des
, conr
el destinados repiten parte. Elfmap
no utiliza el(,) String
Functor
de evitar una variable para una división intermedia.!!0
selecciona el primer elemento de la lista de coincidencias.fuente
Jalea ,
2321 bytesGracias a @JonathanAllan por su
Ṭœp
idea que ahorró 2 bytes.Pruébalo en línea!
fuente
Mathematica,
636059 bytes4 bytes guardados debido a Martin Ender .
Función anónima. Toma una cadena como entrada y devuelve una cadena como salida.
fuente
~SortBy~StringLength
ordena las cadenas alfabéticamente si sus longitudes son las mismas ...SortBy
y envolverStringLength
en una lista para obtener una ordenación estable.JavaScript (ES6), 70 bytes
Casos de prueba
Mostrar fragmento de código
fuente
aaaabaaab
, pero buen uso dereduce
.Esto debería ser un comentario, pero no tengo suficientes reputaciones para comentar. Solo quiero decirle a @Neil que su código se puede reducir a 77 bytes. No es necesario utilizar la aserción directa en regex. Aquí está la versión reducida:
fuente
aabab
es el ejemplo más corto de dónde falla su sugerencia.C #, 169 bytes
Explicación
Este es el enfoque de la fuerza bruta: pruebe todas las subcadenas posibles hasta que encontremos la subcadena más larga que se repite. Indudablemente, Regex es más eficiente, pero tratar con Regex en C # tiende a ser bastante detallado.
fuente
PHP,
8482 bytesNota: utiliza la codificación IBM-850.
Corre así:
Explicación
Ajustes
fuente