Meu cachorro se chama Rex. Toda vez que o repreendo, ele não parece muito impressionado e as únicas vezes em que o vejo reagir é quando pronuncio seu nome. Se eu disser
Rex, I told you not to do this! You're making me angry Rex!
tudo o que ele ouve é
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
O desafio : dada uma sequência de entrada, seu programa deve produzir a mesma sequência em que todos os caracteres alfabéticos foram transformados em estrelas, exceto os caracteres nas aparências da palavra Rex
, que devem ser deixados intocados. Os caracteres não alfabéticos também são deixados intocados.
Detalhes : o desafio não diferencia maiúsculas de minúsculas, portanto, também rex
deve ser deixado intocado. A palavra Rex
pode fazer parte de outra palavra, portanto, por exemplo, anorexic
deve ser renderizada como ***rex**
.
Atualização : como o texto inicial desse desafio não esclareceu como os caracteres sublinhados, os números ou os caracteres acentuados devem ser tratados, não faço nenhum requisito especial para esses caracteres. Portanto, uma solução é válida desde que os caracteres a-zA-Z
(e também os mencionados nos exemplos ,!".
) sejam manipulados corretamente.
Casos de teste :
Entrada : Rex lives in Rexland.
Resultado : Rex ***** ** Rex****.
Entrada : To call Rex, just say "Rex".
Resultado : ** **** Rex, **** *** "Rex".
Entrada : My cat is getting anorexic.
Resultado : ** *** ** ******* ***rex**.
fonte
Hello! Isn't this ... a nice challenge?
você consegue ouvir o cão*****! ***'* *** ... * **** *********?
? Se assim for, você pode considerar a comunicação em morse de agora em diante ...a-zA-Z
, ou também0-9
e / ouäëïöüÿãõñáéíóúýàèìòùç
etc. etc.? E você poderia adicionar alguns casos de teste a esses?"Rex lives in Rexland."
, de saída ="rex ***** ** rex****."
; ou, alternativamente, de entrada ="My cat is getting anorexic."
, saída ="** *** ** ******* ***Rex**."
)Respostas:
Retina ,
2421 bytesExperimente online!
Explicação
Ignorar
rex
s é mais fácil combinando-os também, porque as correspondências não podem se sobrepor. Portanto, se priorizarmosrex
outras letras, elas serão cobertas em uma única correspondência e não serão tocadas pelas correspondências de letras individuais.Mas como fazemos coisas diferentes, dependendo da alternativa usada na partida? Infelizmente, a Retina ainda não possui nenhuma sintaxe de substituição condicional, como o sabor da expressão regular Boost. Mas podemos falsificá-lo incluindo ambas as substituições em uma única substituição e certificando-se de que apenas uma delas esteja vazia:
$1
é o primeiro grupo de captura, ou seja, o(rex)
. Se correspondermos arex
isso, basta gravá-lo de volta (para que não faça nada), mas se não correspondermosrex
,$1
será uma string vazia e desaparecerá.$#2$**
deve ser lido como($#2)$*(*)
.$#2
é o número de vezes que o grupo2
foi usado, ou seja, o(\w)
. Se correspondermos arex
isso0
, mas se correspondermos a qualquer outra letra individual, será1
.$*
repete o próximo caractere tantas vezes quanto o operando esquerdo. Portanto, esta parte insere um único*
para correspondências de letras individuais e nada pararex
.fonte
\a
para[a-z]
zB?** REXX
151148141 bytes **(Parecia meio apropriado)
Experimente aqui
Notas para não-REXXers:
Veja aqui a função de tradução
Veja aqui a função de sobreposição
fonte
JavaScript (ES6),
424138 bytesTente
Explicação
fonte
APL (Dyalog Unicode) , SBCS de 22 bytes
Experimente online!
Simples PCRE R moran Jr..
⍠1
define insensibilidade ao caso. Simplesmente substituirex
por ele mesmo e todos os outros caracteres de palavra por asteriscos.fonte
\w
inclui o caractere sublinhado, assumindo que seja RegEx - não conheço o APL.\w
algumas respostas agora!Perl 5 , 24 bytes
23 bytes de código +
-p
sinalizador.Eu usei o regex de Martin Ender a partir de sua resposta Retina (que por acaso é mais curta em Perl, graças a
\pl
), e só precisei adaptar o lado direito do s ///.Experimente online!
fonte
Retina ,
3231 bytesExperimente online! Explicação: Divide a sequência em ocorrências da palavra
rex
e tudo mais, mas mantém as correspondências. Então, nas linhas que não começamrex
(ou seja, "tudo o resto"), mude as letras para*
s. Finalmente, junte tudo novamente.fonte
C,
9997928674737265 bytesO ambiente IDE Pelles fornece (compila com / Go) a função strnicmp. Esta função é idêntica ao strncasecmp. Veja como funciona aqui (com a função de substituição).
A saída é armazenada no primeiro parâmetro, que é um parâmetro de entrada / saída.
Agradeço a Johan du Toit por me informar que a recursão é um pouco menor.
fonte
Ruby,
363532 bytesComo teste:
Emite:
fonte
PHP, 78 bytes
Experimente online!
PHP, 84 bytes
-1 Byte
\w
vez\pl
neste caso sublinhado e os números são substituídos demasiado\pL
é mais curto como[a-z]
ou[[:alpha:]]
Experimente online!
fonte
\w
vez de\pL
.C (GCC no POSIX),
1671189387 bytesExperimente online!
fonte
f(char*s){for(;*s;s++)strncasecmp("Rex",s,3)?putchar(isalpha(*s)?42:*s):write(1,s-2,3,s+=2);}
. Que tipo de feitiçaria éf(s)char*s;{}
? Eu nunca vi essa sintaxe antes.Python 2 ou 3,
757370 bytesBasicamente, o mesmo que a resposta do meu Ruby .
-2 bytes graças a @Wondercricket.
Como teste:
fonte
x.group(1) or '*'
Java 8,
187192168164159138 bytes-28 bytes graças a @ OlivierGrégoire.
Explicação:
Experimente online.
fonte
0-9
caracteres acentuados não deveriam ser incluídos, apenasa-zA-Z
deveriam."[a-zA-z]"
por/[a-z]/i
?"[a-zA-Z]"
->"(?i)[a-z]"
.s.regionMatches(0<1,i,"rex",0,3)
vez des.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
.l
e salve 4 bytes.Python 2, 87 bytes
Eu acho que isso pode ser reduzido? :)
fonte
sed ,
3733 bytesCódigo de origem de 36 bytes + 1 byte para o sinalizador -r.
Experimente online!
fonte
.
vez de\*
Gema, 25 caracteres
Exemplo de execução:
Doloroso fato que poderia ser
\CRex=$0;<L1>=\*
, mas infelizmente$0
contém o modelo, não a correspondência. ☹fonte
Retina ,
545049 bytesGolfed 5 bytes graças a @MartinEnder
Retina , 49 bytes
Experimente online!
fonte
dex
, dá*e*
enquanto a sua dá**x
.(
após o primeiroi
, não precisará configurar o segundo estágio.[a-z-[rex]]
.PowerShell, 60 bytes
Experimente online
fonte
\w
para\p{L}
.$args
como uma matriz tem consequências quando as coisas são citadas, como em um exemplo. E se você estiver usando apenas o primeiro argumento de qualquer maneira, não precisará doforeach
.\w
. Nota lateral: os aparelhos são\p{L}
realmente necessários?"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'
é muito mais curto no geral, agrupar$args
aspas transforma tudo em uma única sequência e economiza muito.QuadR ,
1110 + 1 = 11 bytes+1 byte para o
i
sinalizador.Experimente online!
Explicação: Substitua maiúsculas de minúsculas por maiúsculas
rex
e minúsculas por caracteres próprios e asteriscos, respectivamente.fonte
MATL , 24 bytes
A entrada é uma cadeia de caracteres entre aspas simples.
Experimente online!
Explicação
Considere entrada
'Rex lives in Rexland.'
fonte
Python 2 ,
9392 bytesExperimente online!
fonte
Perl, 31 bytes
Invoque perl com a
-n
opção Por exemplo:fonte
[a-z]
agora pode ser substituído por,\w
pois a entrada nunca conterá números ou sublinhados.-p
em vez de-n
e remova;print
Bash , 128 bytes
Experimente online!
Estou aderindo ao tr na minha resposta anterior, substituir a string do array bash não funcional e não substituir o preg!
Menos golfe:
Tinha que usar z em vez de * por causa da expansão
fonte
tr
os parâmetros quando eles não contêm nada expansível.r=REXrex
variável valer a pena.'
para"
, portanto, não será necessário escapar do literal"
. Claro, então você escrever uma nova linha literal, quebrando a linha naquele lugar, em vez de\n
:$r'",. !'
.Java 7,
96989796 bytes+2 bytes para e ausentes, precedidos por r ou seguidos de x, mas não ambos
-1 byte para mudar
[a-z&&[^rex]]
para(?![rex])\\w
Experimente online!
Uma versão regex para substituir usando Java
Substitui tudo neste regex por um * (observe em Java \ w deve ser escapado como \\ w)
fonte
C #,
9390 bytesAcredite que esta é a primeira vez que usei uma regex em uma resposta C # aqui por causa do longo espaço para nome
System.Text.RegularExpressions
.Não percebi quando escrevi minha resposta, mas esta parece ser a versão C # da resposta JavaScript de @ Shaggy .
fonte
CJam , 39 bytes
Experimente online!
Como funciona
fonte
VimScript, 34 bytes
E aqui está uma substituição interessante que quase funciona:
Imagine executar isso repetidamente na string.
Rex, dex, I told you not to do this! You're making me angry Rex!
Após a primeira linha, a string éRex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!
A segunda passagem resultaráRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
e a terceira passagem terminará. Quaisquer passes subsequentes não mudarão a sequência. No entanto, pode levar mais de três substituições para chegar lá, por exemplo, na stringxxxxxxxx
. Portanto, se houvesse uma maneira fácil de executar a substituição acima até que ela parasse de mudar as coisas, ou quantas vezes o comprimento da entrada, essa seria outra solução. Aposto que isso poderia ser feito em V, mas provavelmente ainda teria mais de 34 bytes.fonte
Gelatina , 23 bytes
Nenhuma resposta em mais de 24 horas à minha pergunta sobre o caso , por isso vou postar este artigo de 23 bytes.
Veja os casos de teste em Experimente online!
Quão?
fonte
CJam , 26 bytes (saída em maiúsculas) / 36 bytes (preservação de maiúsculas e minúsculas)
Experimente online!
Se for necessário preservar maiúsculas e minúsculas (já que isso ainda é um pouco incerto ), isso pode ser feito com 10 bytes extras:
Experimente online!
A propósito, ao escrever esta resposta, descobri o que consideraria um bug de design no CJam: os operadores bit a bit
&
e|
não são definidos entre dois valores de caracteres, portanto, não posso usar.|
o OR bit a bit de duas strings. A solução, que acabou me custando dois bytes extras, é primeiro converter uma das strings:i
em uma matriz de números inteiros, que podem ser ORed com a outra string. (Na verdade, isso me custou três bytes, porque, se&
funcionasse entre dois caracteres, eu também poderia ter usado emSf&
vez de32f&
salvar as informações da caixa da carta.)No lado positivo, descobri que
{...}f%
realmente funciona como esperado para iterar sobre os caracteres em uma série de strings. Agradável.De qualquer forma, aqui está uma versão (levemente) comentada do código de 36 bytes:
O truque para salvar maiúsculas e minúsculas funciona porque o caso das letras ASCII é determinado exclusivamente pelo quinto bit do código ASCII: esse bit é 0 para letras maiúsculas e 1 para letras minúsculas. Assim, pegar o AND bit a bit do código de caractere com 32 = 2 5 extrai o bit case e OR bit a bit esse bit com as letras maiúsculas restaura o caso original.
Obviamente, caracteres não alfabéticos podem ter valores arbitrários para o quinto bit (embora, devido à organização dos caracteres ASCII, a maioria dos caracteres de pontuação tenha o quinto bit definido como 1), mas isso não importa, pois esses caracteres são deixados intocado por letras maiúsculas e loop de censura de letras de qualquer maneira, e ORing um caractere com seu próprio quinto bit não o altera. Além disso, convenientemente, o
*
personagem já possui o quinto bit definido, por isso também é deixado inalterado pela final.|
.fonte
Pip ,
2119 bytesPega a entrada de stdin, produz para stdout. Experimente online!
Explicação
fonte
V ,
27, 24 bytesEstou deixando as duas respostas, porque acho que são igualmente interessantes.
27 bytes
Experimente online!
Agradecemos a Brian McCutchon por sua idéia de fazer isso em V
Hexdump:
Explicação:
24 bytes
Experimente online!
fonte