Mon chien s'appelle Rex. À chaque fois que je le gronde, il ne semble pas très impressionné et la seule fois où je le vois réagir, c'est quand je prononce son nom. Si je dis
Rex, I told you not to do this! You're making me angry Rex!
tout ce qu'il entend c'est
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
Le défi : étant donné une chaîne de saisie, votre programme doit générer la même chaîne où tous les caractères alphabétiques ont été convertis en étoiles, à l'exception des caractères apparaissant dans le mot Rex
, qui ne doivent pas être modifiés. Les caractères non alphabétiques sont également laissés inchangés.
Détails : Le défi est insensible à la casse et rex
doit donc être laissé inchangé. Le mot Rex
peut faire partie d'un autre mot. Par exemple, il anorexic
doit être rendu sous la forme ***rex**
.
Mise à jour : comme le texte initial de ce défi ne précisait pas comment les traits de soulignement, les chiffres ou les caractères accentués devaient être traités, je ne pose aucune exigence particulière à ces caractères. Ainsi, une solution est valable tant que les caractères a-zA-Z
(ainsi que celui mentionné dans les exemples ,!".
) sont gérés correctement.
Cas de test:
Contribution : Rex lives in Rexland.
Sortie: Rex ***** ** Rex****.
Contribution : To call Rex, just say "Rex".
Sortie: ** **** Rex, **** *** "Rex".
Contribution : My cat is getting anorexic.
Sortie: ** *** ** ******* ***rex**.
la source
Hello! Isn't this ... a nice challenge?
pouvez-vous entendre votre chien*****! ***'* *** ... * **** *********?
? Si oui, vous pourriez envisager de communiquer en morse à partir de maintenant ...a-zA-Z
, ou aussi0-9
et / ouäëïöüÿãõñáéíóúýàèìòùç
etc. etc.? Et pourriez-vous ajouter quelques cas de test à ce sujet?"Rex lives in Rexland."
, output ="rex ***** ** rex****."
; ou alternativement input ="My cat is getting anorexic."
, output ="** *** ** ******* ***Rex**."
)Réponses:
Retina ,
2421 octetsEssayez-le en ligne!
Explication
Sauter
rex
s est plus facile en les associant également, car les correspondances ne peuvent pas se chevaucher. Donc, si nous accordons la priorité auxrex
autres lettres, celles-ci seront couvertes en une seule correspondance et ne seront pas touchées par les correspondances individuelles.Mais comment pouvons-nous faire différentes choses en fonction de l'alternative utilisée pour le match? Malheureusement, Retina n’a pas (encore) de syntaxe de substitution conditionnelle comme la saveur Boost regex. Mais nous pouvons le simuler en incluant les deux substitutions dans un seul remplaçant et en veillant à ce qu'un seul d'entre eux soit non vide:
$1
est le premier groupe de capture, c’est-à-dire le(rex)
. Si nous avons fait correspondrerex
ceci, nous le réécrirons simplement (de sorte que cela ne fera rien), mais si nous ne faisons pas correspondre,rex
alors$1
une chaîne vide et disparaîtra.$#2$**
devrait être lu comme($#2)$*(*)
.$#2
est le nombre de fois où le groupe a2
été utilisé, c’est-à-dire le(\w)
. Si nous avons appariérex
ceci est0
, mais si nous avons apparié toute autre lettre individuelle, ceci est1
.$*
répète le caractère suivant autant de fois que son opérande de gauche. Donc, cette partie insère un simple*
pour les correspondances de lettre individuelle et rien du tout pourrex
.la source
\a
pour[a-z]
zB?** REXX
151148141 octets **(Kinda semblait approprié)
Essayez ici
Remarques pour les non-REXXers:
Voir ici pour la fonction de traduction
Voir ici pour la fonction de superposition
la source
JavaScript (ES6),
424138 octetsL'essayer
Explication
la source
APL (Dyalog Unicode) , SBCS 22 octets
Essayez-le en ligne!
Simple PCRE R eplace.
⍠1
définit l'insensibilité à la casse. Remplace simplementrex
par lui-même et tous les autres caractères du mot avec des astérisques.la source
\w
inclut le caractère de soulignement, en supposant qu'il s'agisse de RegEx - je ne connais pas APL.\w
de quelques réponses maintenant!Perl 5 , 24 octets
23 octets de code +
-p
drapeau.J'ai utilisé l'expression régulière de Martin Ender de sa réponse Retina (qui est plus courte en Perl, grâce à
\pl
), et je n'ai eu qu'à adapter le côté droit du s ///.Essayez-le en ligne!
la source
Retina ,
32 à31 octetsEssayez-le en ligne! Explanation: Divise la chaîne en occurrences du mot
rex
et de tout le reste, mais conserve les correspondances. Ensuite, sur les lignes qui ne commencent pasrex
(c'est-à-dire "tout le reste"), remplacez les lettres par*
s. Enfin, réunissez tout.la source
C,
9997928674737265 octetsL'environnement IDE de Pelles fournit (compile avec / Go) la fonction strnicmp. Cette fonction est identique à strncasecmp. Voir cela fonctionne ici (avec la fonction de remplacement).
La sortie est stockée dans le premier paramètre qui est un paramètre in / out.
Merci à Johan du Toit de me faire savoir que la récursion est légèrement plus courte.
la source
Ruby,
363532 octetsÀ titre de test:
Il produit:
la source
PHP, 78 octets
Essayez-le en ligne!
PHP, 84 octets
-1 octet à la
\w
place,\pl
dans ce cas, le trait de soulignement et les nombres sont également remplacés\pL
est plus courte que[a-z]
ou[[:alpha:]]
Essayez-le en ligne!
la source
\w
au lieu de\pL
.C (GCC sur POSIX),
1671189387 octetsEssayez-le en ligne!
la source
f(char*s){for(;*s;s++)strncasecmp("Rex",s,3)?putchar(isalpha(*s)?42:*s):write(1,s-2,3,s+=2);}
. Quel genre de sorcellerie estf(s)char*s;{}
? Je n'ai jamais vu cette syntaxe auparavant.Python 2 ou 3,
757370 octetsFondamentalement, la même chose que la réponse de mon Ruby .
-2 octets grâce à @Wondercricket.
À titre de test:
la source
x.group(1) or '*'
Java 8,
187192168164159138 octets-28 octets grâce à @ OlivierGrégoire.
Explication:
Essayez-le en ligne.
la source
0-9
les caractères accentués ne devraient pas être inclus, seulementa-zA-Z
devraient."[a-zA-z]"
par/[a-z]/i
?"[a-zA-Z]"
->"(?i)[a-z]"
.s.regionMatches(0<1,i,"rex",0,3)
au lieu des.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
.l
et enregistrez 4 octets.Python 2, 87 octets
Je suppose que cela peut être raccourci? :)
la source
sed ,
3733 octets36 octets code source + 1 octet pour l'indicateur -r.
Essayez-le en ligne!
la source
.
place de\*
Gema, 25 caractères
Échantillon échantillon:
Fait douloureux qui pourrait être
\CRex=$0;<L1>=\*
, mais$0
contient malheureusement le modèle, pas la correspondance. ☹la source
Retina ,
545049 bytesGolfé 5 octets grâce à @MartinEnder
Retina , 49 octets
Essayez-le en ligne!
la source
dex
, elle donne,*e*
tandis que la vôtre donne**x
.(
après la première,i
vous n'avez pas besoin de configurer la deuxième étape.[a-z-[rex]]
.PowerShell, 60 octets
Essayez-le en ligne
la source
\w
à\p{L}
.$args
tant que tableau a des conséquences lorsque des choses sont citées, comme dans un exemple. Et si vous n’utilisez que le premier argument de toute façon, vous n’avez pas besoin deforeach
.\w
. Note latérale: les accolades sont-elles\p{L}
vraiment nécessaires?"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'
est globalement beaucoup plus court, le fait$args
de mettre des guillemets en fait un tout en une seule chaîne et vous épargne beaucoup.QuadR ,
1110 + 1 = 11 octets+1 octet pour le
i
drapeau.Essayez-le en ligne!
Explanation: Remplacer les caractères
rex
et les caractères sans tenir compte de la casse par eux-mêmes et par des astérisques, respectivement.la source
MATL , 24 octets
L'entrée est une chaîne entre guillemets simples.
Essayez-le en ligne!
Explication
Considérer l'entrée
'Rex lives in Rexland.'
la source
Python 2 ,
9392 octetsEssayez-le en ligne!
la source
Perl, 31 octets
Invoquer perl avec
-n
option. Par exemple:la source
[a-z]
peut maintenant être remplacé par\w
car l'entrée ne contiendra jamais de chiffres ni de soulignés.-p
place de-n
et supprimer;print
Bash , 128 octets
Essayez-le en ligne!
Je m'en tiens à ma réponse précédente, chaîne de tableau de bash non fonctionnelle remplacer et pas de remplacement de preg!
Moins joué au golf:
Doit utiliser z au lieu de * à cause de l'expansion
la source
tr
les paramètres quand ils ne contiennent rien d’extensible.r=REXrex
variable.'
de"
, donc pas besoin d'échapper au littéral"
. Bien sûr, vous écrivez un retour ligne en brisant la ligne à cet endroit au lieu de\n
:$r'",. !'
.Java 7,
96989796 octets+2 octets pour les e manquants précédés de r ou suivis de x mais pas les deux
-1 octet pour passer
[a-z&&[^rex]]
à(?![rex])\\w
Essayez-le en ligne!
Une version regex pour remplacer en utilisant Java
Remplace tout ce qui est dans cette regex par un * (note en Java \ w doit être échappé sous la forme \\ w)
la source
C #,
9390 octetsCroyez que c’est la première fois que j’utilise une expression rationnelle dans une réponse C # ici à cause du long espace de noms
System.Text.RegularExpressions
.Je ne m'en étais pas rendu compte quand j'ai écrit ma réponse, mais cela semble être la version C # de la réponse JavaScript de @ Shaggy .
la source
CJam , 39 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
VimScript, 34 octets
Et voici une substitution intéressante qui fonctionne presque:
Imaginez que vous exécutiez ceci de manière répétée sur la chaîne.
Rex, dex, I told you not to do this! You're making me angry Rex!
Après la première ligne, la chaîne est la suivanteRex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!
: la deuxième passe aboutitRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
et la troisième passe la termine. Les passes suivantes ne changeront pas la chaîne. Cependant, il faut parfois plus de 3 substitutions pour y arriver, par exemple en chaînexxxxxxxx
. Ainsi, s’il existait un moyen simple d’exécuter la substitution ci-dessus jusqu’à ce qu’elle cesse de changer, ou autant de fois que la longueur de l’entrée, ce serait une autre solution. Je parie que cela pourrait être fait en V, mais ce serait toujours plus long que 34 octets.la source
Gelée , 23 octets
En 24 heures , je n'ai reçu aucune réponse à ma question sur l'affaire . Je vais donc poster ce 23 byter provisoire.
Voir les cas de test sur Essayez-le en ligne!
Comment?
la source
CJam , 26 octets (sortie en majuscule) / 36 octets (préservant la casse)
Essayez-le en ligne!
Si la casse des lettres doit être préservée (étant donné que cela reste un peu flou ), vous pouvez le faire avec 10 octets supplémentaires:
Essayez-le en ligne!
En passant, en écrivant cette réponse, j'ai trouvé ce que je considérerais comme un bug de conception dans CJam: les opérateurs au niveau du bit
&
et|
ne sont pas définis entre deux valeurs de caractère. Je ne peux donc pas utiliser.|
le OU au niveau du bit de deux chaînes. La solution, qui a fini par me coûter deux octets supplémentaires, est d’abord de convertir l’une des chaînes avec:i
un tableau d’entiers, qui peuvent ensuite être convertis en OR avec l’autre chaîne. (En fait, cela m'a coûté trois octets, car si&
je travaillais entre deux caractères, j'aurais aussi pu utiliserSf&
au lieu de32f&
sauvegarder les informations de casse des lettres.)Sur le plan positif, j’ai découvert qu’en
{...}f%
fait, il fonctionnait comme prévu pour effectuer une itération sur les caractères d’un tableau de chaînes. Agréable.Quoi qu'il en soit, voici une version (légèrement) commentée du code à 36 octets:
L'astuce de sauvegarde de la casse fonctionne car la casse des lettres ASCII est uniquement déterminée par le cinquième bit du code ASCII: ce bit est 0 pour les lettres majuscules et 1 pour les lettres minuscules. Ainsi, prendre le bit ET du code de caractère avec 32 = 2 5 extrait le bit de casse, et ORer ce bit avec les lettres en majuscule rétablit leur casse initiale.
Bien sûr, les caractères non alphabétiques peuvent avoir des valeurs arbitraires pour le cinquième bit (bien que, en raison de la manière dont les caractères ASCII sont organisés, le cinquième bit de la plupart des caractères de ponctuation soit défini sur 1), mais cela n'a pas d'importance, car ces caractères sont laissés. de toute façon insensible à la casse et à la boucle de censure des lettres, et ORer un caractère avec son cinquième bit ne le change pas. En outre,
*
le cinquième bit est déjà défini sur le caractère et reste donc inchangé pour le final.|
.la source
Pip ,
2119 octetsPrend les entrées de stdin, les sorties sur stdout. Essayez-le en ligne!
Explication
la source
V ,
27, 24 octetsJe laisse les deux réponses, parce que je pense qu'elles sont tout aussi intéressantes.
27 octets
Essayez-le en ligne!
Merci à Brian McCutchon pour son idée de faire cela en V
Hexdump:
Explication:
24 octets
Essayez-le en ligne!
la source