Mi perro se llama Rex. Cada vez que lo regaño, no parece muy impresionado y las únicas veces que lo veo reaccionar es cuando pronuncio su nombre. Si yo digo
Rex, I told you not to do this! You're making me angry Rex!
todo lo que oye es
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
El desafío : dada una cadena de entrada, su programa debe generar la misma cadena donde todos los caracteres alfabéticos se han convertido en estrellas, excepto los caracteres en las apariencias de la palabra Rex
, que deben dejarse intactos. Los caracteres no alfabéticos también se dejan intactos.
Detalles : el desafío no distingue entre mayúsculas y minúsculas, por lo que también rex
debe dejarse intacto. La palabra Rex
puede ser parte de otra palabra, por lo que, por ejemplo, anorexic
debe representarse como ***rex**
.
Actualización : como el texto inicial de este desafío no aclaraba cómo debían tratarse los guiones bajos o los números o los caracteres acentuados, no hago ningún requisito especial sobre esos caracteres. Por lo tanto, una solución es válida siempre que los caracteres en a-zA-Z
(y también el mencionado en los ejemplos ,!".
) se manejen correctamente.
Casos de prueba :
Entrada: Rex lives in Rexland.
Salida: Rex ***** ** Rex****.
Entrada: To call Rex, just say "Rex".
Salida: ** **** Rex, **** *** "Rex".
Entrada: My cat is getting anorexic.
Salida: ** *** ** ******* ***rex**.
fuente
Hello! Isn't this ... a nice challenge?
¿Puedes escuchar perro*****! ***'* *** ... * **** *********?
? Si es así, podría considerar comunicarse en morse de ahora en adelante ...a-zA-Z
, o también0-9
y / oäëïöüÿãõñáéíóúýàèìòùç
etc., etc.? ¿Y podría agregar algunos casos de prueba con respecto a estos?"Rex lives in Rexland."
, output ="rex ***** ** rex****."
; o alternativamente input ="My cat is getting anorexic."
, output ="** *** ** ******* ***Rex**."
)Respuestas:
Retina ,
2421 bytesPruébalo en línea!
Explicación
Omitir
rex
s es más fácil al combinarlos también, porque las coincidencias no pueden solaparse. Entonces, si le damos prioridad arex
otras letras, éstas se cubrirán en una sola coincidencia y no se tocarán en las coincidencias de letras individuales.Pero, ¿cómo hacemos diferentes cosas dependiendo de la alternativa que se utilizó para el partido? Desafortunadamente, Retina (todavía) no tiene ninguna sintaxis de sustitución condicional como el sabor Boge regex. Pero podemos fingirlo al incluir ambas sustituciones en un solo reemplazo y asegurarnos de que solo una de ellas no esté vacía:
$1
es el primer grupo de captura, es decir, el(rex)
. Si coincidimos conrex
esto, simplemente lo vuelve a escribir (por lo que no hace nada), pero si no coincidimos,rex
entonces$1
hay una cadena vacía y desaparece.$#2$**
debe leerse como($#2)$*(*)
.$#2
es el número de veces que2
se usó el grupo , es decir, el(\w)
. Si coincidimos conrex
esto es0
, pero si coincidimos con cualquier otra letra individual, esto es1
.$*
repite el siguiente personaje tantas veces como su operando de la izquierda. Entonces, esta parte inserta un solo*
para coincidencias de letras individuales y nada en absolutorex
.fuente
\a
para[a-z]
zB?** REXX
151148141 bytes **(Parecía apropiado)
Pruébalo aquí
Notas para no REXXers:
Ver aquí para la función de traducción
Ver aquí para la función de superposición
fuente
JavaScript (ES6),
424138 bytesIntentalo
Explicación
fuente
APL (Dyalog Unicode) , SBCS de 22 bytes
Pruébalo en línea!
PCRE sencilla R eplace.
⍠1
establece insensibilidad a mayúsculas y minúsculas. Simplemente reemplazarex
consigo mismo y todos los demás caracteres de palabras con asteriscos.fuente
\w
incluye el carácter de subrayado, suponiendo que se trata de RegEx: no sé APL.\w
algunas respuestas ahora!Perl 5 , 24 bytes
23 bytes de código +
-p
bandera.Utilicé la expresión regular de Martin Ender de su respuesta de Retina (que es más corta en Perl, gracias a
\pl
), y solo tuve que adaptar el lado derecho de s ///.Pruébalo en línea!
fuente
Retina ,
3231 bytesPruébalo en línea! Explicación: Divide la cadena en ocurrencias de la palabra
rex
y todo lo demás, pero mantiene las coincidencias. Luego, en líneas que no comienzanrex
(es decir, "todo lo demás"), cambie las letras a*
s. Finalmente, une todo de nuevo.fuente
C,
9997928674737265 bytesEl entorno IDE de Pelles proporciona (compila con / Go) la función strnicmp. Esta función es idéntica a strncasecmp. Vea cómo funciona aquí (con la función de reemplazo).
La salida se almacena en el primer parámetro, que es un parámetro de entrada / salida.
Gracias a Johan du Toit por hacerme saber que la recursividad es un poco más corta.
fuente
Ruby,
363532 bytesComo prueba:
Produce:
fuente
PHP, 78 bytes
Pruébalo en línea!
PHP, 84 bytes
-1 Byte en su
\w
lugar\pl
en este caso subrayado y los números también se reemplazan\pL
es más corto como[a-z]
o[[:alpha:]]
Pruébalo en línea!
fuente
\w
lugar de\pL
.C (GCC en POSIX),
1671189387 bytesPruébalo en línea!
fuente
f(char*s){for(;*s;s++)strncasecmp("Rex",s,3)?putchar(isalpha(*s)?42:*s):write(1,s-2,3,s+=2);}
. ¿Qué tipo de brujería esf(s)char*s;{}
? Nunca he visto esta sintaxis antes.Python 2 o 3,
757370 bytesBásicamente lo mismo que la respuesta de mi Ruby .
-2 bytes gracias a @Wondercricket.
Como prueba:
fuente
x.group(1) or '*'
Java 8,
187192168164 164159138 bytes-28 bytes gracias a @ OlivierGrégoire.
Explicación:
Pruébalo en línea.
fuente
0-9
caracteres acentuados no deberían incluirse, soloa-zA-Z
deberían incluirse ."[a-zA-z]"
con/[a-z]/i
?"[a-zA-Z]"
->"(?i)[a-z]"
.s.regionMatches(0<1,i,"rex",0,3)
lugar des.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
.l
y guarde 4 bytes.Python 2, 87 bytes
¿Supongo que eso se puede acortar? :)
fuente
sed ,
3733 bytesCódigo fuente de 36 bytes + 1 byte para el indicador -r.
Pruébalo en línea!
fuente
.
lugar de\*
Gema, 25 personajes
Ejecución de muestra:
Hecho doloroso que podría ser
\CRex=$0;<L1>=\*
, pero desafortunadamente$0
contiene la plantilla, no la coincidencia. ☹fuente
Retina ,
545049 bytesGolfed 5 bytes gracias a @MartinEnder
Retina , 49 bytes
Pruébalo en línea!
fuente
dex
, da*e*
mientras que la tuya da**x
.(
después de la primerai
, no necesita configurar la segunda etapa.[a-z-[rex]]
.PowerShell, 60 bytes
Pruébalo en línea
fuente
\w
a\p{L}
.$args
como una matriz tiene consecuencias cuando se citan las cosas, como en un ejemplo. Y si de todos modos solo usa el primer argumento, no necesita elforeach
.\w
. Nota al margen: ¿Son\p{L}
realmente necesarios los frenos ?"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'
es mucho más corto en general, envolviendo$args
comillas lo convierte todo en una sola cadena y te ahorra mucho.QuadR ,
1110 + 1 = 11 bytes+1 byte para la
i
bandera.Pruébalo en línea!
Explicación: Reemplazar entre mayúsculas
rex
y minúsculas y caracteres de palabras consigo mismo y con asteriscos, respectivamente.fuente
MATL , 24 bytes
La entrada es una cadena entre comillas simples.
Pruébalo en línea!
Explicación
Considerar entrada
'Rex lives in Rexland.'
fuente
Python 2 ,
9392 bytesPruébalo en línea!
fuente
Perl, 31 bytes
Invocar perl con
-n
opción. Por ejemplo:fuente
[a-z]
ahora puede reemplazarse\w
ya que la entrada nunca contendrá números o guiones bajos.-p
lugar de-n
y eliminar;print
Bash , 128 bytes
Pruébalo en línea!
Me apego a tr en mi respuesta anterior, reemplazo de cadena de matriz bash no funcional y sin reemplazo de preg.
Menos golfizado:
Tuve que usar z en lugar de * debido a la expansión
fuente
tr
los parámetros cuando no contienen nada expandible.r=REXrex
variable que vale la pena.'
a"
, por lo que no necesita escapar del literal"
. Por supuesto, a continuación, se escribe una nueva línea literal al romper la línea en ese lugar en vez de\n
:$r'",. !'
.Java 7,
96989796 bytes+2 bytes para los e faltantes precedidos por r o seguidos por x pero no ambos
-1 byte para cambiar
[a-z&&[^rex]]
a(?![rex])\\w
Pruébalo en línea!
Una versión regex para reemplazar usando Java
Reemplaza todo en esta expresión regular con un * (la nota en Java \ w debe escaparse como \\ w)
fuente
C #,
9390 bytesCree que esta es la primera vez que he usado una expresión regular en una respuesta de C # aquí debido al largo espacio de nombres
System.Text.RegularExpressions
.No me di cuenta cuando escribí mi respuesta, pero esta parece ser la versión C # de la respuesta JavaScript de @ Shaggy .
fuente
CJam , 39 bytes
Pruébalo en línea!
Cómo funciona
fuente
VimScript, 34 bytes
Y aquí hay una sustitución interesante que casi funciona:
Imagine ejecutar esto repetidamente en la cadena
Rex, dex, I told you not to do this! You're making me angry Rex!
Después de la primera línea, la cadena esRex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!
La segunda pasada dará como resultadoRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
, y la tercera pasada la terminará. Cualquier pase posterior no cambiará la cadena. Sin embargo, podría tomar más de 3 sustituciones para llegar allí, por ejemplo, en cadenaxxxxxxxx
. Entonces, si hubiera una manera fácil de ejecutar la sustitución anterior hasta que dejara de cambiar las cosas, o tantas veces como la longitud de la entrada, esa sería otra solución. Apuesto a que podría hacerse en V, pero aún así probablemente sería más largo que 34 bytes.fuente
Jalea , 23 bytes
No hubo respuesta en más de 24 horas a mi pregunta sobre el caso , así que publicaré este tentativo 23 byter.
Vea los casos de prueba en ¡ Pruébelo en línea!
¿Cómo?
fuente
CJam , 26 bytes (salida en mayúscula) / 36 bytes (conservación de mayúsculas y minúsculas)
Pruébalo en línea!
Si se necesita preservar la letra mayúscula (ya que aún no está claro ), eso se puede lograr con 10 bytes adicionales:
Pruébalo en línea!
Por cierto, mientras escribía esta respuesta, encontré lo que consideraría un error de diseño en CJam: los operadores bit a bit
&
y|
no están definidos entre dos valores de caracteres, por lo que no puedo usar.|
para tomar el OR bit a bit de dos cadenas. La solución, que terminó costándome dos bytes adicionales, es convertir primero una de las cadenas:i
en una matriz de enteros, que luego se pueden OR con la otra cadena. (En realidad, me costó tres bytes, porque si hubiera&
funcionado entre dos caracteres, también podría haberlo usado enSf&
lugar de32f&
guardar la información de mayúsculas y minúsculas).En el lado positivo, descubrí que de
{...}f%
hecho funciona como se esperaba para iterar sobre los caracteres en una serie de cadenas. Agradable.De todos modos, aquí hay una versión (ligeramente) comentada del código de 36 bytes:
El truco para guardar mayúsculas y minúsculas funciona porque el caso de las letras ASCII está determinado únicamente por el quinto bit del código ASCII: este bit es 0 para mayúsculas y 1 para letras minúsculas. Por lo tanto, tomar el AND a nivel de bits del código de caracteres con 32 = 2 5 extrae el bit de mayúsculas y ORing a bit este bit con las letras mayúsculas restaura su caso original.
Por supuesto, los caracteres no alfabéticos pueden tener valores arbitrarios para el quinto bit (aunque, debido a la forma en que se organizan los caracteres ASCII, la mayoría de los caracteres de puntuación tienen el quinto bit establecido en 1), pero esto no importa, ya que esos caracteres se dejan intacto por mayúsculas y el bucle de censura de letras de todos modos, y ORing un carácter con su propio quinto bit no lo cambia. Además, convenientemente, el
*
personaje ya tiene el quinto bit establecido, por lo que también queda sin cambios en la final.|
.fuente
Pip ,
2119 bytesToma entrada de stdin, salidas a stdout. Pruébalo en línea!
Explicación
fuente
V ,
27, 24 bytesDejo ambas respuestas, porque creo que son igualmente interesantes.
27 bytes
Pruébalo en línea!
Gracias a Brian McCutchon por su idea de hacer esto en V
Hexdump:
Explicación:
24 bytes
Pruébalo en línea!
fuente