Inspirado en esta sencilla pregunta de StackOverflow .
La idea es simple; dada una Cadena y una matriz de Cadenas, elimine cualquier instancia de palabras en la matriz (ignorando mayúsculas y minúsculas) de la Cadena de entrada que no sea la primera, junto con cualquier espacio en blanco adicional que esto pueda dejar. Las palabras deben coincidir con palabras completas en la cadena de entrada, y no con partes de palabras.
por ejemplo, "A cat called matt sat on a mat and wore a hat A cat called matt sat on a mat and wore a hat", ["cat", "mat"]
debería salir"A cat called matt sat on a mat and wore a hat A called matt sat on a and wore a hat"
Entrada
- La entrada puede tomarse como una Cadena y como una matriz de Cadenas o una matriz de Cadenas donde la Cadena de entrada es el primer elemento. Estos parámetros pueden estar en cualquier orden.
- La cadena de entrada no puede tomarse como una lista de cadenas delimitadas por espacios.
- La cadena de entrada no tendrá espacios iniciales, finales o consecutivos.
- Toda entrada solo contendrá caracteres [A-Za-z0-9] con la excepción de la Cadena de entrada que también incluye espacios.
- La matriz de entrada puede estar vacía o contener palabras que no están en la cadena de entrada.
Salida
- La salida puede ser el valor de retorno de una función o imprimirse en STDOUT
- La salida debe estar en el mismo caso que la cadena original
Casos de prueba
the blue frog lived in a blue house, [blue] -> the blue frog lived in a house
he liked to read but was filled with dread wherever he would tread while he read, [read] -> he liked to read but was filled with dread wherever he would tread while he
this sentence has no matches, [ten, cheese] -> this sentence has no matches
this one will also stay intact, [] -> this one will also stay intact
All the faith he had had had had no effect on the outcome of his life, [had] -> All the faith he had no effect on the outcome of his life
5 times 5 is 25, [5, 6] -> 5 times is 25
Case for different case, [case] -> Case for different
the letters in the array are in a different case, [In] -> the letters in the array are a different case
This is a test Will this be correct Both will be removed, [this,will] -> This is a test Will be correct Both be removed
Como se trata de código de golf, gana el conteo de bytes más bajo
This is a test Will this be correct Both will be removed
+this will
. Las dos últimas palabras se eliminan correctamente, pero también eliminóbe
la segunda después de la segundawill
por alguna razón.@B=<>;$_=join$",grep!(/^$_$/xi~~@B&&$v{+lc}++),@F
lc
llamaran sin padres. ¡Increíble! Y usar una expresión regular contra la matriz es mucho mejor, ¡Gracias! ¡Me cuesta recordar todos tus consejos!Pyth, 27 bytes
Pruébalo en línea
Explicación
Estoy seguro de que los 10 bytes para la comprobación de mayúsculas y minúsculas se pueden reducir, pero no veo cómo.
fuente
Stax , 21 bytes CP437
25 bytes cuando está desempaquetado,
El resultado es una matriz. La salida conveniente para Stax es un elemento por línea.
¡Ejecute y depure en línea!
Explicación
fuente
Perl 6 , 49 bytes
Pruébalo
Expandido:
fuente
Perl 5 ,
5048 bytesIncluye
+1
para-p
Dé la cadena de destino seguida de cada palabra de filtro en líneas separadas en STDIN:
los
chop
única que se necesita para arreglar el espacio final en caso de que la última palabra se retiraSolo el código:
Pruébalo en línea!
fuente
JavaScript (ES6), 98 bytes
fuente
K4 , 41 bytes
Solución:
Ejemplos:
Explicación:
Dividir en espacios en blanco, poner en minúsculas ambas entradas, buscar coincidencias, eliminar todas menos la primera aparición, volver a unir la cadena.
fuente
JavaScript (Node.js) , 75 bytes
Pruébalo en línea!
fuente
f=
en su recuento de bytes. También puede guardar un byte por ganarse los parámetros, reemplazando(s,a)=>
cons=>a=>
y después de llamar a la función conf(s)(a)
.JavaScript ES6, 78 bytes
Cómo funciona:
fuente
f
de la función para una llamada recursiva, una función sin nombre también sería un envío válido, por lo que puede guardar dos bytes soltando elf=
.PowerShell v3 o posterior, 104 bytes
Al costo de un byte, puede ejecutarse en PS 2.0 reemplazándolo
$Matches.0
por$Matches[0]
.Versión larga:
Uso
Guardar como Whatever.ps1 y llamar con la cadena y las palabras como argumentos. Si se necesita pasar más de una palabra, las palabras deben estar envueltas en @ ():
Alternativa sin archivo (se puede pegar directamente en una consola PS):
guarde el script como ScriptBlock (dentro de llaves) en una variable, luego llame a su método Invoke (), o úselo con Invoke-Command:
fuente
Javascript, 150 bytes
fuente
Limpio ,
153142138134 bytesPruébalo en línea!
Define la función
$ :: String [String] -> String
, haciendo literalmente lo que describe el desafío. Encuentra y elimina cada aparición después de la primera, para cada palabra objetivo.fuente
Retina,
4637 bytes-14 bytes gracias a @Neil , y +5 bytes para una corrección de errores.
Entrada en el formato
word1,word2,word3,sentence
, porque no estoy seguro de cómo tener una entrada de varias líneas (donde las entradas se usan de manera diferente).Explicación:
Pruébalo en línea.
fuente
+i`((.+),.*\2.* )\2( |$)
y la segunda,$1
pero noto que su código falla deoften,he intended to keep ten geese
todos modos.\b
lugar de(^|,)
, pero la mala noticia es que creo que lo necesita\b\3\b
(aunque todavía no he ideado un caso de prueba adecuado).Rojo , 98 bytes
Pruébalo en línea!
fuente
Casco , 13 bytes
Toma una lista de cadenas y una sola cadena como argumentos, en este orden. Asume que la lista está libre de duplicados. Pruébalo en línea!
Explicación
fuente
Min , 125 bytes
La entrada está
quot
en la pila con la cadena de entrada como primer elemento, y unaquot
de las cadenas duplicadas como segundo elemento, es decirfuente
Python 3 , 168 bytes
Pruébalo en línea!
fuente
AWK , 120 bytes
Pruébalo en línea!
La parte "eliminar espacios en blanco" hizo que esto fuera un poco más desafiante de lo que pensaba. Establecer un campo para
""
, se elimina un campo, pero se deja un separador adicional.El enlace TIO tiene 28 bytes adicionales para permitir múltiples entradas.
La entrada se da en 2 líneas. La primera línea es la lista de palabras y la segunda es la "oración". Tenga en cuenta que "palabra" y "palabra" no se consideran idénticas a la puntuación adjunta. Tener requisitos de puntuación probablemente haría que este sea un problema aún más divertido .
fuente
Ruby ,
63 61 6059 bytesPruébalo en línea!
Una versión más corta que distingue entre mayúsculas y minúsculas y falla ~ cada 10 15 veces debido a la aleatoriedad (37 bytes)
fuente
Python 2 , 140 bytes
Pruébalo en línea!
Explicación:
re.sub(..)
puede tomar como argumento una función en lugar de una cadena de reemplazo. Así que aquí tenemos una elegante lambda. Se llama a la función para cada aparición del patrón y se pasa un objeto a esta función: matchobject. Este objeto tiene información sobre la ocurrencia fundada. Estoy interesado en el índice de esta ocurrencia, que puede ser recuperado porstart()
oend()
función. Este último es más corto, por lo que se usa.Para excluir el reemplazo de la primera aparición de la palabra, utilicé otra función de búsqueda de expresiones regulares para obtener exactamente la primera y luego comparar índices, usando el mismo
end()
Flag
re.I
es una versión corta dere.IGNORECASES
fuente