Napisz program, który zastąpi wszystkie wystąpienia słowa „force” słowem „first”, a wszystkie wystąpienia słowa „first” słowem „force”, zachowując oryginalny przypadek dla wszystkich pozycji znaków:
"ForcefoRcefOrcE" -> "FirstfiRstfIrsT"
"FirstfiRstfIrsT" -> "ForcefoRcefOrcE"
Reszta ciągu musi pozostać niezmieniona, więc dwukrotne uruchomienie programu zwróci oryginalny ciąg:
"thirst of forces" -> "thirst of firsts" -> "thirst of forces"
Twój program powinien działać na dowolnym ciągu początkowym. Tak więc, jako wskazówkę, lepiej unikać używania znaków magicznych jako reprezentacji pośredniej, ponieważ jeśli spróbujesz zastąpienia trzyprzebiegowego ( "force" -> "zzzzz", "first" -> "force", "zzzzz" -> "first"
), to zawiedzie na łańcuchach zawierających "zzzzz"
.
Powinieneś obsługiwać pełny zakres znaków dozwolony w definicji ciągu znaków przez swój język programowania (w większości przypadków jest to Unicode). Przykład z użyciem reprezentacji w stylu JSON dla znaków niedrukowalnych (\ u + 4 cyfry):
"\u0000\u0001\u0002\u0003the Force of the firsT"
|
V
"\u0000\u0001\u0002\u0003the First of the forcE"
[Ff]
nie ma prowadzącego, nie wolno zastępować słowa.Odpowiedzi:
Siatkówka , 33 bajty
Wypróbuj online!
Edycja: Zaoszczędź 5 bajtów dzięki @MartinEnder za wskazanie, co
Ro
robi.źródło
Ro
.R
wpływ na zakresy; na przykład nigdy nie zdałbym sobie sprawy, żeRE
jest to równoważne86420
, gdybyś tego nie zauważył.JavaScript (ES6),
9388 bajtówEdycja: Zapisano 5 bajtów, optymalizując niezmienioną wielkość liter.
źródło
APL (Dyalog) , 61 bajtów
Wymaga
⎕IO←0
ustawienia domyślnego w wielu systemach. Może być o cztery znaki krótszy przy użyciu symbolu Unicode⍠
zamiast⎕OPT
.Wypróbuj online!
źródło
PHP, 88 bajtów
Wersje online
PHP, 110 bajtów
źródło
$t[0]^first^force
zamiaststrtr()
.Perl 5 , 52 bajty
51 bajtów kodu +
-p
flaga.Wypróbuj online!
Nie dzieje się nic szalonego. Znajdź wystąpienia
force
ifirst
bez rozróżniania wielkości liter (s%force|first%%gi
), a następnie transliteruje znaki, aby przekonwertować jeden na drugi.źródło
CJam, 66 bajtów
Przegląda każdą odmianę „pierwszego” i „wymuszenia” i próbuje się na nią rozdzielić. Jeśli to możliwe, łączy je z powrotem odwrotnymi słowami.
Pseudo kod:
źródło
f
jest to istotne, aby uniknąć zmianythirst
nathorce
lubdivorce
nadivirst
?Java 7,
318310 bajtówOk, to było dość trudne w Javie ..
Wyjaśnienie:
Kod testowy:
Wypróbuj tutaj.
Wynik:
źródło
c(c("..."))
!Galaretka ,
3736 bajtówCzy istnieje sposób na użycie zamiast tego skrótu w plasterkach o długości 5?
Wypróbuj online!
W jaki sposób?
źródło
MATL , 47 bajtów
Wypróbuj online!
Wykorzystuje wartości ujemne jako krok pośredni, a po dwóch przejściach przyjmuje wartość bezwzględną.
źródło
Pyt ,
3635 bajtówWypróbuj online!
Pyth nie jest szczególnie dobry w manipulacjach ciągami.
źródło
Flex (Lexer), 72 bajty
Aby skompilować i uruchomić:
źródło
first.l:3: EOF encountered inside an action
(och, nieważne: na końcu wymaga nowego wiersza)ld: library not found for -lfl
(och, nieważne, polecenie jestgcc lex.yy.c -ll
na macOS)Python 2, 171 bajtów
Chciałem to zrobić za pomocą wbudowanych funkcji, ale nie jest w stanie pokonać nieuporządkowanej metody z całym dzieleniem i kompresowaniem.
Myślę, że to całkiem jasne, co tu robię. Podziel ciąg na instancje first i force (bez rozróżniania wielkości liter), zamień te instancje na wersje przetłumaczone przy użyciu str.translate i ponownie dołącz do łańcucha.
Wypróbuj online!
źródło
Python 2.7,
173165 bajtów8 bajtów zapisanych przez kwintopię
Ten dostał brutto:
Wypróbuj online
Podział na krok po kroku:
S.lower().split("force")
: weź ciąg, ujednolicaj małe litery, podziel na podciągi oddzielone"force"
s.replace("first","force")for s in <STEP 1>
Wymienić wszystkie"first"
„s ze"force"
_`.join("first".join(<STEP 2>)`[2::5]`_
Zamienić wszystkie"force"
„s z"first"
o ponowne łączenie"force"
wyodrębnione z podciągi"first"
i dołączyć do pojedynczego łańcucha (podkreślenia dodane dostać znaczniki skorygować)zip(<STEP 3>,[(2,1)[l.isupper()]for l in S])
: zip każdy znak zastępowanej frazy z kodowaniem wielkich i małych liter (2 dla małych liter, 1 dla wielkich liter)_`[(t[0],t[0].upper())[t[1]==1]for t in <STEP 4>]`[2::5]`_
: Przywróć oryginalną obudowę, konwertuje listę na ciąg znaków (dodane podkreślenia, aby poprawnie zaznaczyć znaczniki)źródło
C (brzęk) ,
201183226214 bajtówMiałem kilka błędów ... Nadal trzeba dużo grać w golfa
(uratowano 12 dzięki pułapowi cat)
Wypróbuj online!
źródło
C # 273 bajtów
Wypróbuj online!
Bezpośredni port odpowiedzi Java Kevina Cruijssena , okazuje się, że jeśli chodzi o uzyskanie znaku w ciągu o danym indeksie, C # jest znacznie bardziej golfowy niż Java (
s[i++]
zamiasts.charAt(i++)
)źródło
Japt , 41 bajtów
Wypróbuj online!
Byłoby to znacznie krótsze, gdyby Japt miał rozsądną funkcję transliteracji ...
Alternatywna wersja:
Wypróbuj online!
źródło
C #, 235 znaków
źródło
Rubinowy , 55 bajtów
Wypróbuj online!
źródło
Java, 382 bajty niezgodne
Wypróbuj online
źródło
"The first, force,|first'forced!"
? Możesz też trochę zagrać w swój aktualny kod:if(w.equalsIgnoreCase("force")|w.equalsIgnoreCase("first"))
->,z
poString s=""
iz=w.toLowerCase();if(z.equals("force")|z.equals("first"))
. Ponadto'O'
może być79
,'C'
może być67
i'E'
może być69
. Iif
else
mogą być zastąpione jednym dużym trójskładnikiem, jeśli-jeszcze, bo oba tak robiąs+=
.non competent
w tytuleC # (269 bajtów)
jeszcze inne rozwiązanie c #, tylko drugie najmniejsze, ponieważ zadeklarowałem dwie zmienne, więc nie mogę używać składni lambda. no cóż, dobrze się bawiłem. :)
wyjaśnienie:
w górę oryginalny ciąg znaków, a następnie podziel na „FORCE” i „FIRST”.
agreguj wyniki i przy każdym podziale znajdź pięcioznakowy podciąg, który został użyty do podzielenia oryginalnego łańcucha przy użyciu długości do tej pory agregowanego łańcucha. jeśli była to „siła”, uczyń to „pierwszym” i odwrotnie
źródło