Mój pies nazywa się Rex. Za każdym razem, gdy go besztam, wydaje się, że nie jest pod wielkim wrażeniem, a kiedy widzę, że reaguje, to kiedy wymawiam jego imię. Jeśli powiem
Rex, I told you not to do this! You're making me angry Rex!
wszystko co słyszy to
Rex, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
Wyzwanie : biorąc pod uwagę ciąg wejściowy, twój program musi wypisać ten sam ciąg, w którym wszystkie znaki alfabetu zostały zamienione na gwiazdki, z wyjątkiem znaków w wyglądzie słowa Rex
, które muszą pozostać nietknięte. Znaki niealfabetyczne również pozostają nietknięte.
Szczegóły : w wyzwaniu nie jest rozróżniana wielkość liter, dlatego rex
też nie można go zmieniać. Słowo Rex
może być częścią innego słowa, więc na przykład anorexic
musi być renderowane jako ***rex**
.
Aktualizacja : ponieważ początkowy tekst tego wyzwania nie wyjaśniał, w jaki sposób należy traktować podkreślenia, liczby lub znaki akcentowane, nie wymagam od tych znaków żadnych specjalnych wymagań. Dlatego rozwiązanie jest ważne, o ile znaki w a-zA-Z
(a także te wymienione w przykładach ,!".
) są obsługiwane poprawnie.
Przypadki testowe :
Wejście : Rex lives in Rexland.
Wynik : Rex ***** ** Rex****.
Wejście : To call Rex, just say "Rex".
Wynik : ** **** Rex, **** *** "Rex".
Wejście : My cat is getting anorexic.
Wynik : ** *** ** ******* ***rex**.
źródło
Hello! Isn't this ... a nice challenge?
czy pies słyszy*****! ***'* *** ... * **** *********?
? Jeśli tak, możesz odtąd rozważyć komunikację w morse ...a-zA-Z
, czy też0-9
i / lubäëïöüÿãõñáéíóúýàèìòùç
itd. Itd.? Czy możesz dodać kilka przypadków testowych?"Rex lives in Rexland."
, output ="rex ***** ** rex****."
; lub alternatywnie input ="My cat is getting anorexic."
, output ="** *** ** ******* ***Rex**."
)Odpowiedzi:
Siatkówka ,
2421 bajtówWypróbuj online!
Wyjaśnienie
Pomijanie
rex
s jest najłatwiejsze, dopasowując je również, ponieważ dopasowania nie mogą się nakładać. Więc jeśli damy pierwszeństworex
innym literom, zostaną one pokryte jednym dopasowaniem i nie będą dotknięte dopasowaniami pojedynczych liter.Ale jak robimy różne rzeczy w zależności od alternatywy użytej do meczu? Niestety, Retina (jeszcze) nie ma żadnej składni warunkowej substytucji, takiej jak smak regexu Boost. Ale możemy to sfałszować, włączając obie substytucje do jednego zamiennika i upewniając się, że tylko jedna z nich nie jest pusta:
$1
jest pierwszą grupą przechwytującą, tj(rex)
. Jeśli to zrobiliśmy,rex
po prostu zapisuje to z powrotem (więc nic nie robi), ale jeśli nie pasujemy,rex
to$1
jest pusty ciąg i znika.$#2$**
należy czytać jako($#2)$*(*)
.$#2
oznacza liczbę przypadków2
użycia grupy , tj(\w)
. Jeśli tak,rex
to0
jeśli tak, ale jeśli dopasowaliśmy inną indywidualną literę, to jest1
.$*
powtarza następną postać tyle razy, ile operand po lewej stronie. Ta część wstawia singiel*
dla pojedynczych liter i nicrex
.źródło
\a
na[a-z]
zb?** REXX
151148141 bajtów **(Trochę mi się to wydawało właściwe)
Wypróbuj tutaj
Uwagi dla nie-REXXerów:
Zobacz tutaj funkcję tłumaczenia
Zobacz tutaj funkcję nakładki
źródło
JavaScript (ES6),
424138 bajtówSpróbuj
Wyjaśnienie
źródło
APL (Dyalog Unicode) , 22 bajty SBCS
Wypróbuj online!
Proste PCRE R EUmieãæ.
⍠1
ustawia niewrażliwość na wielkość liter. Po prostu zastępujerex
siebie i wszystkie inne znaki słowne gwiazdkami.źródło
\w
zawiera znak podkreślenia, przy założeniu, że jest to RegEx - nie znam APL-a.\w
do kilku odpowiedzi teraz!Perl 5 , 24 bajtów
23 bajty kodu +
-p
flaga.Użyłem wyrażenia regularnego Martina Endera z jego odpowiedzi Retina (która dzięki Perlowi jest krótsza, dzięki
\pl
) i musiałem tylko dostosować prawą stronę s ///.Wypróbuj online!
źródło
Retina ,
3231 bajtówWypróbuj online! Objaśnienie: Dzieli ciąg na wystąpienia słowa
rex
i wszystkiego innego, ale zachowuje dopasowania. Następnie w wierszach, które się nie rozpoczynająrex
(tj. „Wszystko inne”), zmień litery na*
s. Na koniec połącz wszystko z powrotem razem.źródło
C,
9997928674737265 bajtówŚrodowisko Pelles IDE udostępnia (kompiluje z / Go) funkcję strnicmp. Ta funkcja jest identyczna jak strncasecmp. Zobacz, jak to działa tutaj (z funkcją zastępowania).
Dane wyjściowe są przechowywane w pierwszym parametrze, który jest parametrem wejścia / wyjścia.
Dzięki Johan du Toit za poinformowanie mnie, że rekursja jest nieco krótsza.
źródło
Rubinowy,
363532 bajtówJako test:
Wytwarza:
źródło
PHP, 78 bajtów
Wypróbuj online!
PHP, 84 bajtów
-1 bajt
\w
zamiast\pl
tego w tym przypadku podkreślenie i liczby również są zastępowane\pL
jest krótszy jako[a-z]
lub[[:alpha:]]
Wypróbuj online!
źródło
\w
zamiast\pL
.C (GCC na POSIX),
1671189387 bajtówWypróbuj online!
źródło
f(char*s){for(;*s;s++)strncasecmp("Rex",s,3)?putchar(isalpha(*s)?42:*s):write(1,s-2,3,s+=2);}
. Co to za czaryf(s)char*s;{}
? Nigdy wcześniej nie widziałem tej składni.Python 2 lub 3,
757370 bajtówW zasadzie taki sam jak mój Ruby odpowiedź .
-2 bajty dzięki @Wondercricket.
Jako test:
źródło
x.group(1) or '*'
Java 8,
187192168164159 159138 bajtów-28 bajtów dzięki @ OlivierGrégoire.
Wyjaśnienie:
Wypróbuj online.
źródło
0-9
i znaki akcentowane nie powinny być uwzględniane, tylkoa-zA-Z
powinny."[a-zA-z]"
z/[a-z]/i
?"[a-zA-Z]"
->"(?i)[a-z]"
.s.regionMatches(0<1,i,"rex",0,3)
zamiasts.toLowerCase().substring(i,i+(i>l-3?1:3)).equals("rex")
.l
i zapisz 4 bajty.Python 2, 87 bajtów
Myślę, że można to skrócić? :)
źródło
sed ,
3733 bajtów36 bajtów kod źródłowy + 1 bajt dla flagi -r.
Wypróbuj online!
źródło
.
zamiast\*
Gema, 25 znaków
Przykładowy przebieg:
Bolesny fakt, który może być
\CRex=$0;<L1>=\*
, ale niestety$0
zawiera szablon, a nie dopasowanie. ☹źródło
Siatkówka ,
545049 bajtówGrał w golfa 5 bajtów dzięki @MartinEnder
Siatkówka , 49 bajtów
Wypróbuj online!
źródło
dex
, daje,*e*
podczas gdy twoje daje**x
.(
po pierwszymi
, nie musisz konfigurować drugiego etapu.[a-z-[rex]]
.PowerShell, 60 bajtów
Wypróbuj online
źródło
\w
na\p{L}
.$args
jako tablicy ma konsekwencje przy cytowaniu rzeczy, jak w jednym przykładzie. A jeśli i tak używasz tylko pierwszego argumentu, nie potrzebujeszforeach
.\w
. Uwaga dodatkowa: Czy aparaty ortodontyczne są\p{L}
naprawdę potrzebne?"$args"-replace'(rex)|\p{L}','$1*'-replace'(x)\*','$1'
jest ogólnie znacznie krótszy, zawijanie$args
cudzysłowów zamienia wszystko w jeden ciąg i bardzo oszczędza.QuadR ,
1110 + 1 = 11 bajtów+1 bajt dla
i
flagi.Wypróbuj online!
Objaśnienie: Zastępuje bez rozróżniania wielkości liter
rex
i znaków słownych odpowiednio z samym sobą i gwiazdkami.źródło
MATL , 24 bajty
Dane wejściowe to ciąg ujęty w pojedyncze cudzysłowy.
Wypróbuj online!
Wyjaśnienie
Rozważ wejście
'Rex lives in Rexland.'
źródło
Python 2 ,
9392 bajtyWypróbuj online!
źródło
Perl, 31 bajtów
Wywołaj perla z
-n
opcją. Na przykład:źródło
[a-z]
można teraz zastąpić,\w
ponieważ dane wejściowe nigdy nie będą zawierać liczb ani znaków podkreślenia.-p
zamiast-n
i usunąć;print
Bash , 128 bajtów
Wypróbuj online!
Trzymam się tr na mojej poprzedniej odpowiedzi, zastępuję niefunkcjonalny ciąg tablicy bash i nie zastępuję preg!
Mniej golfa:
Musiałem użyć z zamiast * z powodu rozszerzenia
źródło
tr
parametrów, gdy nie zawierają one elementów rozwijalnych.r=REXrex
zmiennej o wartości.'
na"
, więc nie musisz uciekać od literału"
. Oczywiście, po czym piszesz dosłownego przełamane przez zerwania linii w tym miejscu zamiast\n
:$r'",. !'
.Java 7,
96989796 bajtów+2 bajty za brakujące e poprzedzone r lub po którym następuje x, ale nie oba
-1 bajt do zmiany
[a-z&&[^rex]]
na(?![rex])\\w
Wypróbuj online!
Wersja wyrażenia regularnego do zastępowania za pomocą Java
Zamienia wszystko w tym wyrażeniu regularnym na * (uwaga w Javie \ w musi być zmieniona jako \\ w)
źródło
C #,
9390 bajtówUwierz, że po raz pierwszy użyłem wyrażenia regularnego w odpowiedzi w języku C # ze względu na długą przestrzeń nazw
System.Text.RegularExpressions
.Nie zdawałem sobie z tego sprawy, kiedy napisałem swoją odpowiedź, ale wygląda na to, że jest to wersja C # odpowiedzi JavaScript @ Shaggy'ego .
źródło
CJam , 39 bajtów
Wypróbuj online!
Jak to działa
źródło
VimScript, 34 bajty
A oto ciekawa substytucja, która prawie działa:
Wyobraź sobie, że powtarzasz to wielokrotnie w ciągu.
Rex, dex, I told you not to do this! You're making me angry Rex!
Po pierwszym wierszu napis:Rex, *ex, * **** *** *** ** ** ****! ***'*e ****** *e ***** Rex!
Drugie przejście spowodujeRex, **x, * **** *** *** ** ** ****! ***'** ****** ** ***** Rex!
, a trzecie przejście go zakończy. Wszelkie kolejne przejścia nie zmienią ciągu. Jednak może to zająć więcej niż 3 podstawienia, na przykład w łańcuchuxxxxxxxx
. Tak więc, jeśli istniałby łatwy sposób uruchomienia powyższej substytucji, dopóki nie przestanie ona zmieniać rzeczy lub tyle razy, ile wynosi długość danych wejściowych, byłoby to inne rozwiązanie. Założę się, że można to zrobić w V, ale prawdopodobnie będzie to dłużej niż 34 bajty.źródło
Galaretka , 23 bajty
Brak odpowiedzi w ciągu ponad 24 godzin na moje pytanie dotyczące sprawy , więc opublikuję ten niepewny 23 bajt.
Zobacz przypadki testowe na stronie Wypróbuj online!
W jaki sposób?
źródło
CJam , 26 bajtów (wyjście wielkich liter) / 36 bajtów (zachowanie wielkości liter)
Wypróbuj online!
Jeśli trzeba zachować wielkość liter (ponieważ nadal jest to trochę niejasne ), można to osiągnąć za pomocą 10 dodatkowych bajtów:
Wypróbuj online!
Nawiasem mówiąc, pisząc tę odpowiedź, znalazłem coś, co uważam za błąd projektowy w CJam: operatory bitowe
&
i|
nie są zdefiniowane między dwiema wartościami char, więc nie mogę użyć.|
bitowej LUB dwóch ciągów. Rozwiązaniem, które w końcu kosztowało mnie dwa dodatkowe bajty, jest najpierw konwersja jednego z łańcuchów za pomocą:i
na tablicę liczb całkowitych, które następnie można ORedować z drugim łańcuchem. (W rzeczywistości kosztowało mnie to trzy bajty, ponieważ jeśli&
działałem między dwoma znakami, mógłbym również użyćSf&
zamiast32f&
zapisywania informacji o wielkości liter).Z drugiej strony odkryłem, że
{...}f%
rzeczywiście działa zgodnie z oczekiwaniami w przypadku iteracji znaków w szeregu ciągów. Miły.W każdym razie oto (lekko) skomentowana wersja 36-bajtowego kodu:
Sztuczka polegająca na zapisywaniu wielkości liter działa, ponieważ wielkość liter ASCII jest określana wyłącznie przez piąty bit kodu ASCII: ten bit to 0 dla wielkich liter i 1 dla małych liter. Zatem pobranie bitowego AND kodu znakowego o wartości 32 = 25 wyodrębnia bit wielkości liter, a bitowe ORowanie tego bitu wielkimi literami przywraca ich pierwotną wielkość.
Oczywiście znaki niealfabetyczne mogą mieć dowolne wartości dla piątego bitu (chociaż ze względu na sposób organizacji znaków ASCII większość znaków interpunkcyjnych ma ustawiony piąty bit na 1), ale to nie ma znaczenia, ponieważ znaki te pozostały i tak nietknięte przez górną część obudowy i pętlę cenzurowania liter, a ORing znaku z jego piątym bitem go nie zmienia. Ponadto, dogodnie,
*
postać ma już ustawiony piąty bit, więc pozostaje również niezmieniony przez finał.|
.źródło
Pip ,
2119 bajtówPobiera dane wejściowe ze standardowego wejścia, a wyjściowe na standardowe wyjście. Wypróbuj online!
Wyjaśnienie
źródło
V ,
27, 24 bajtówObie odpowiedzi pozostawiam, bo myślę, że są równie interesujące.
27 bajtów
Wypróbuj online!
Dzięki Brianowi McCutchonowi za pomysł zrobienia tego w V
Hexdump:
Wyjaśnienie:
24 bajty
Wypróbuj online!
źródło