En este desafío, eliminará palabras duplicadas de cada oración .
Ejemplos
Hello Hello, World!
Hello, World!
Code Code! Golf Code
Code! Golf Code
Hello hello World
Hello World
Programming Golf Programming!
Programming Golf!
Especificación
- La entrada será una cadena de caracteres ASCII.
- Una oración se define como cualquier cosa hasta el final de la cadena, un salto de línea (
\n
) o una puntuación (.!?
). - Una palabra se define como una secuencia de
A-Za-z
. - Las palabras no distinguen entre mayúsculas y minúsculas (
Hello
==heLlO
).
- Solo se mantiene la primera aparición de una palabra en una oración.
- Si se elimina una palabra, se deben eliminar los espacios antes de la palabra eliminada. (por ejemplo,
A A B
->A B
).
- Como siempre, las lagunas estándar no están permitidas.
Este es el código de golf, ¡el código más corto en bytes gana!
a b a.
va a que?a b.
porque se elimina la `a`.a__b_b_a
, ¿obtienesa_b_a
(primerob
eliminado) oa__b_a
(segundob
eliminado)?a__b__
porque lo repetidob
se elimina y lo repetidoa
se eliminaRespuestas:
Vim, 27 bytes
Tenga en cuenta que los 27 bytes incluyen un retorno de carro final al final.
Pruébalo en línea! Nota al margen: Este es un enlace a un idioma diferente que estoy escribiendo llamado "V". V es en su mayoría compatible con vim, por lo que, para todos los efectos, puede contar como un intérprete de vim. También agregué un byte
%
para que pueda verificar todos los casos de prueba a la vez.Explicación:
fuente
JavaScript (ES6), 98
Tenga en cuenta que aunque lo encontré yo mismo, es molestamente similar a @ Neil, solo que con la lógica adicional para dividir toda la cadena de entrada en oraciones.
Prueba
fuente
Retina ,
6646 bytesEl recuento de bytes asume la codificación ISO 8859-1.
Pruébalo en línea!
Explicación
Dado que solo las letras deben considerarse caracteres de palabras (pero regex trata los dígitos y los guiones bajos como caracteres de palabras también), necesitamos establecer nuestros propios límites de palabras. Como se garantiza que la entrada contiene solo caracteres ASCII, estoy insertando
·
(fuera de ASCII, pero dentro de ISO 8859-1) alrededor de todas las palabras y las elimino nuevamente con los duplicados. Eso ahorra 20 bytes sobre el uso de lookarounds para implementar límites de palabras genéricas.Esto coincide con cada palabra y lo rodea
·
.Estos son dos pasos comprimidos en uno.
<sp>*(·[a-z]+·)(?<=\1[^.!?¶]+)
coincide con una palabra completa (asegurada al incluirla·
en la coincidencia), junto con los espacios que la preceden, siempre que (tal como lo asegura el reverso) podamos encontrar la misma palabra en algún lugar anterior en la oración. (El¶
coincide con un salto de línea).La otra parte es simplemente el
·
, que coincide con todos los límites de palabras artificiales que no coincidieron como parte de la primera mitad. En cualquier caso, la coincidencia simplemente se elimina de la cadena.fuente
C, 326 bytes
¿Quién necesita expresiones regulares?
fuente
Perl 6 , 104 bytes
Uso:
Explicación
fuente
Perl 5, 57 bytes
56 bytes código + 1 para
-p
Uso:
Puede que tenga que ser +1, actualmente estoy asumiendo que solo habrá espacios en la entrada, sin pestañas.
fuente
\s
en su lugar ... ¡Sin embargo, aún no estoy cerca de tu respuesta de retina!