Mein Hund heißt Rex. Jedes Mal, wenn ich ihn schimpfe, scheint er nicht sehr beeindruckt zu sein, und ich sehe ihn nur dann reagieren, wenn ich seinen Namen ausspreche. Wenn ich sage
Rex, I told you not to do this! You're making me angry Rex!
alles was er hört ist
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
Die Herausforderung : Wenn Sie eine Eingabezeichenfolge angeben, muss Ihr Programm dieselbe Zeichenfolge ausgeben, in der alle alphabetischen Zeichen in Sterne umgewandelt wurden, mit Ausnahme der Zeichen im Wort Rex
, die unangetastet bleiben müssen. Die nicht alphabetischen Zeichen bleiben ebenfalls unberührt.
Details : Die Herausforderung ist unabhängig von Groß- und Kleinschreibung und rex
muss daher auch unangetastet bleiben. Das Wort Rex
kann Teil eines anderen Wortes sein, muss also beispielsweise anorexic
als gerendert werden ***rex**
.
Update : Da der ursprüngliche Text dieser Herausforderung nicht klarstellte, wie Unterstriche oder Zahlen oder akzentuierte Zeichen zu behandeln sind, habe ich keine besonderen Anforderungen an diese Zeichen. Daher ist eine Lösung gültig, solange die Zeichen in a-zA-Z
(und auch die in den Beispielen genannten ,!".
) korrekt behandelt werden.
Testfälle:
Eingabe: Rex lives in Rexland.
Ausgabe : Rex ***** ** Rex****.
Eingabe: To call Rex, just say "Rex".
Ausgabe : ** **** Rex, **** *** "Rex".
Eingabe: My cat is getting anorexic.
Ausgabe : ** *** ** ******* ***rex**.
quelle
Hello! Isn't this ... a nice challenge?
Kannst du Hund hören*****! ***'* *** ... * **** *********?
? In diesem Fall sollten Sie ab sofort überlegen, ob Sie in der Morse kommunizieren möchten ...a-zA-Z
, oder auch0-9
und / oderäëïöüÿãõñáéíóúýàèìòùç
etc. etc.? Und könnten Sie einige Testfälle dazu hinzufügen?"Rex lives in Rexland."
, Ausgabe ="rex ***** ** rex****."
; oder alternativ Eingabe ="My cat is getting anorexic."
, Ausgabe ="** *** ** ******* ***Rex**."
)Antworten:
Netzhaut ,
2421 BytesProbieren Sie es online!
Erläuterung
Das Überspringen von
rex
s ist am einfachsten, wenn Sie diese ebenfalls zuordnen, da Übereinstimmungen nicht überlappen können. Wenn wir alsorex
anderen Buchstaben Vorrang einräumen, werden diese in einer einzelnen Übereinstimmung behandelt und von den Übereinstimmungen mit einzelnen Buchstaben nicht berührt.Aber wie machen wir verschiedene Dinge, je nachdem, welche Alternative für das Match verwendet wurde? Leider hat Retina (noch) keine bedingte Substitutionssyntax wie die Boost-Regex-Variante. Aber wir können es vortäuschen, indem wir beide Ersetzungen in eine einzige Ersetzung aufnehmen und sicherstellen, dass nur eine von ihnen nicht leer ist:
$1
ist die erste Erfassungsgruppe, dh die(rex)
. Wenn wir das täten passenrex
diese einfach schreibt sie zurück (so es tut nichts), aber wenn wir nicht übereinstimmen ,rex
dann$1
ist eine leere Zeichenfolge und verschwindet.$#2$**
sollte als gelesen werden($#2)$*(*)
.$#2
ist die Häufigkeit, mit der die Gruppe2
verwendet wurde, dh(\w)
. Wenn wir das gefundenrex
haben0
, aber wenn wir einen anderen Buchstaben gefunden haben, dann ist das der Fall1
.$*
wiederholt das nächste Zeichen so oft wie sein linker Operand. Dieser Teil fügt also eine Single*
für Einzelbuchstaben -Übereinstimmungen ein und überhaupt nichts fürrex
.quelle
\a
für[a-z]
zB?** REXX
151148141 Bytes **(Ein bisschen schien angemessen)
Probieren Sie es hier aus
Hinweise für Nicht-REXXer:
Siehe hier für die Übersetzungsfunktion
Siehe hier für die Überlagerungsfunktion
quelle
JavaScript (ES6),
424138 ByteVersuch es
Erläuterung
quelle
APL (Dyalog Unicode) , 22 Byte SBCS
Probieren Sie es online!
Einfacher PCRE R ersatz.
⍠1
Legt die Groß- / Kleinschreibung fest. Ersetzt einfachrex
mit sich selbst und alle anderen Wortzeichen mit Sternchen.quelle
\w
Beinhaltet den Unterstrich, vorausgesetzt dies ist RegEx - ich kenne APL nicht.\w
zu ein paar Antworten jetzt hinterlassen habe !Perl 5 , 24 Bytes
23 Byte Code +
-p
Flag.Ich habe Martin Enders Regex aus seiner Retina-Antwort (die in Perl dank kürzer ist
\pl
) verwendet und musste nur die rechte Seite des s /// anpassen.Probieren Sie es online!
quelle
Retina ,
32-31BytesProbieren Sie es online! Erläuterung: Teilt die Zeichenfolge in Vorkommen des Wortes
rex
und alles andere auf, behält jedoch die Übereinstimmungen bei.rex
Ändern Sie dann in Zeilen, die nicht beginnen (dh "alles andere"), die Buchstaben in*
s. Zum Schluss alles wieder zusammenfügen.quelle
C
9997928674737265 BytesDie Pelles IDE-Umgebung bietet (Kompilieren mit / Go) die Funktion strnicmp. Diese Funktion ist identisch mit strncasecmp. Sehen Sie , wie es hier funktioniert (mit der Ersatzfunktion).
Die Ausgabe wird im ersten Parameter gespeichert, der ein In / Out-Parameter ist.
Vielen Dank an Johan du Toit, der mir mitteilte, dass die Rekursion etwas kürzer ist.
quelle
Ruby,
363532 BytesAls Test:
Es gibt aus:
quelle
PHP, 78 Bytes
Probieren Sie es online!
PHP, 84 Bytes
-1 Byte
\w
stattdessen,\pl
in diesem Fall werden Unterstrich und Zahlen ebenfalls ersetzt\pL
ist kürzer als[a-z]
oder[[:alpha:]]
Probieren Sie es online!
quelle
\w
anstelle von verwenden\pL
.C (GCC auf POSIX),
1671189387 BytesProbieren Sie es online!
quelle
f(char*s){for(;*s;s++)strncasecmp("Rex",s,3)?putchar(isalpha(*s)?42:*s):write(1,s-2,3,s+=2);}
. Was ist Zaubereif(s)char*s;{}
? Ich habe diese Syntax noch nie gesehen.Python 2 oder 3,
757370 BytesGrundsätzlich das gleiche wie meine Ruby- Antwort .
-2 Bytes dank @Wondercricket.
Als Test:
quelle
x.group(1) or '*'
Java 8,
187192168164159138 Bytes-28 Bytes dank @ OlivierGrégoire.
Erläuterung:
Probieren Sie es online aus.
quelle
0-9
Zeichen mit Akzenten nicht eingeschlossen werden sollten, sondern nura-zA-Z
sollten."[a-zA-z]"
durch/[a-z]/i
?"[a-zA-Z]"
->"(?i)[a-z]"
.s.regionMatches(0<1,i,"rex",0,3)
anstelle von verwendens.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
.l
und speichere 4 Bytes.Python 2, 87 Bytes
Ich denke, das kann gekürzt werden? :)
quelle
sed ,
3733 bytes36 Byte Quellcode + 1 Byte für -r Flag.
Probieren Sie es online!
quelle
.
anstelle von\*
Gema, 25 Zeichen
Probelauf:
Schmerzhafte Tatsache, die sein könnte
\CRex=$0;<L1>=\*
, aber leider$0
die Vorlage enthält, nicht die Übereinstimmung. ☹quelle
Retina ,
545049 BytesGolf 5 Bytes dank @MartinEnder
Netzhaut , 49 Bytes
Probieren Sie es online!
quelle
dex
, sie gibt,*e*
während deine gibt**x
.(
nach der ersten gruppieren,i
müssen Sie die zweite Stufe nicht konfigurieren.[a-z-[rex]]
.PowerShell, 60 Byte
Probieren Sie es online aus
quelle
\w
zu\p{L}
.$args
als Array Konsequenzen hat, wenn Dinge in Anführungszeichen gesetzt werden, wie in einem Beispiel. Und wenn Sie sowieso nur das erste Argument verwenden, brauchen Sie das nichtforeach
.\w
. Randnotiz: Werden die Zahnspangen\p{L}
wirklich benötigt?"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'
ist insgesamt viel kürzer, das Einwickeln$args
in Anführungszeichen macht alles zu einer einzigen Zeichenfolge und erspart Ihnen viel.QuadR ,
1110 + 1 = 11 Bytes+1 Byte für das
i
Flag.Probieren Sie es online!
Erklärung: Ersetzen Sie
rex
und word-chars mit sich selbst bzw. Sternchen case-insensitively .quelle
MATL , 24 Bytes
Die Eingabe ist eine Zeichenfolge in einfachen Anführungszeichen.
Probieren Sie es online!
Erläuterung
Betrachten Sie die Eingabe
'Rex lives in Rexland.'
quelle
Python 2 ,
9392 BytesProbieren Sie es online!
quelle
Perl, 31 Bytes
Perl mit
-n
Option aufrufen . Zum Beispiel:quelle
[a-z]
kann jetzt durch ersetzt werden,\w
da die Eingabe niemals Zahlen oder Unterstriche enthält.-p
anstelle von verwenden-n
und entfernen;print
Bash , 128 Bytes
Probieren Sie es online!
Ich halte mich an meine vorherige Antwort, nicht funktionierende Bash-Array-Zeichenfolge ersetzen und kein Preg ersetzen!
Weniger golfen:
Musste wegen der Erweiterung z anstelle von * verwenden
quelle
tr
indem Sie die Parameter nicht in Anführungszeichen setzen , wenn sie nichts Erweiterbares enthalten.r=REXrex
Variable, die es wert ist.'
zu"
, so dass keine Notwendigkeit , die wörtlichen zu entkommen"
. Natürlich, dann schreiben Sie eine wörtliche Newline durch die Linie an diesem Ort anstatt zu brechen\n
:$r'",. !'
.Java 7,
96989796 Bytes+2 Bytes für fehlende e vor r oder gefolgt von x, aber nicht beide
-1 Byte für den Wechsel
[a-z&&[^rex]]
zu(?![rex])\\w
Probieren Sie es online!
Eine Regex-Version zum Ersetzen mit Java
Ersetzt alles in diesem regulären Ausdruck durch ein * (Anmerkung in Java \ w muss als \\ w maskiert werden)
quelle
C #
9390 BytesIch glaube, dies ist das erste Mal, dass ich in einer C # -Antwort aufgrund des langen Namespaces einen regulären Ausdruck verwende
System.Text.RegularExpressions
.Ich wusste es nicht, als ich meine Antwort schrieb, aber dies scheint die C # -Version von @ Shaggys JavaScript-Antwort zu sein .
quelle
CJam , 39 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
VimScript, 34 Bytes
Und hier ist eine interessante Ersetzung, die fast funktioniert:
Stellen Sie sich vor, Sie führen dies wiederholt für die Zeichenfolge aus.
Rex, dex, I told you not to do this! You're making me angry Rex!
Nach der ersten Zeile lautet die Zeichenfolge.Rex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!
Der zweite Durchgang führt zuRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
und der dritte Durchgang beendet die Zeichenfolge . Alle nachfolgenden Durchläufe ändern die Zeichenfolge nicht. Es können jedoch mehr als 3 Substitutionen erforderlich sein, beispielsweise auf einer Zeichenfolgexxxxxxxx
. Wenn es also eine einfache Möglichkeit gäbe, die obige Substitution auszuführen, bis sich die Dinge nicht mehr ändern oder so oft wie die Länge der Eingabe, wäre dies eine andere Lösung. Ich wette, es könnte in V gemacht werden, aber es wäre wahrscheinlich immer noch länger als 34 Bytes.quelle
Jelly , 23 Bytes
Keine Antwort in mehr als 24 Stunden auf meine Frage bezüglich des Falls , also werde ich dieses vorläufige 23 Byte posten.
Sehen Sie sich die Testfälle unter Online testen an !
Wie?
quelle
CJam , 26 Bytes (Ausgabe in Großbuchstaben) / 36 Bytes (Groß- / Kleinschreibung beachten )
Probieren Sie es online!
Wenn die Groß- und Kleinschreibung beibehalten werden muss (da dies noch etwas unklar ist ), kann dies mit 10 zusätzlichen Bytes erreicht werden:
Probieren Sie es online!
By the way, während diese Antwort zu schreiben, fand ich , was würde ich für ein Design - Fehler in CJam sein: die Bit - Operatoren
&
und|
nicht zwischen zwei char Werten definiert, so kann ich nicht verwenden ,.|
das bitweise zu nehmen oder von zwei Strings. Die Lösung, die mich zwei zusätzliche Bytes:i
gekostet hat , besteht darin, zuerst eine der Zeichenfolgen mit in ein Array von Ganzzahlen zu konvertieren, die dann mit der anderen Zeichenfolge ODER-verknüpft werden können. (Eigentlich hat es mich drei Bytes gekostet , denn wenn&
zwischen zwei Zeichen gearbeitet, konnte ich auch verwendet habe ,Sf&
statt32f&
die Groß- und Kleinschreibung Informationen zu speichern.)Positiv ist, dass ich das entdeckt habe
{...}f%
Durchlaufen der Zeichen in einer Reihe von Zeichenfolgen tatsächlich wie erwartet funktioniert. Nett.Wie auch immer, hier ist eine (leicht) kommentierte Version des 36-Byte-Codes:
Der Trick zum Speichern der Groß- und Kleinschreibung funktioniert, da die Groß- und Kleinschreibung von ASCII-Buchstaben ausschließlich durch das fünfte Bit des ASCII-Codes bestimmt wird: Dieses Bit ist 0 für Großbuchstaben und 1 für Kleinbuchstaben. Wenn Sie also das bitweise UND des Zeichencodes mit 32 = 2 5 nehmen, wird das Groß- / Kleinschreibung-Bit extrahiert, und wenn Sie dieses Bit mit den Großbuchstaben bitweise ODER-verknüpfen, wird die ursprüngliche Groß- / Kleinschreibung wiederhergestellt.
Natürlich können nicht-alphabetische Zeichen beliebige Werte für das fünfte Bit haben (obwohl aufgrund der Art und Weise, wie ASCII-Zeichen organisiert sind, das fünfte Bit bei den meisten Interpunktionszeichen auf 1 gesetzt ist), aber dies spielt keine Rolle, da diese Zeichen übrig bleiben Unberührt von Großbuchstaben und der Buchstaben-Zensur-Schleife ändert sich dies nicht, wenn Sie ein Zeichen mit einem eigenen fünften Bit ODER-verknüpfen. Praktischerweise ist für das
*
Zeichen bereits das fünfte Bit gesetzt, so dass es auch für das Finale unverändert bleibt.|
.quelle
Pip ,
21 bis19 BytesÜbernimmt die Eingabe von stdin und gibt sie an stdout aus. Probieren Sie es online!
Erläuterung
quelle
V ,
27, 24 BytesIch lasse beide Antworten offen, weil ich denke, dass sie gleichermaßen interessant sind.
27 Bytes
Probieren Sie es online!
Vielen Dank an Brian McCutchon für seine Idee, dies in V zu tun
Hexdump:
Erläuterung:
24 Bytes
Probieren Sie es online!
quelle