Dlaczego 6 bało się 7? Ponieważ 7 8 9!
Podany ciąg znaków stosuje następujące przekształcenia:
- Jeśli obok 7 jest 6, usuń 6 (6 boi się 7)
- Jeśli pojawi się sekwencja „789”, usuń 8 i 9 (7 zjadł 9)
(Jeśli się nie mylę, nie ma znaczenia, w jakiej kolejności przeprowadzacie transformacje)
Stosuj te transformacje, aż przestaniesz.
Przykład:
78966
Najpierw widzimy „789”, więc ciąg staje się „766”. Następnie widzimy „76”, więc wyjmujemy 6, a ciąg staje się „76”. Następnie ponownie widzimy „76”, więc pozostaje nam „7”.
Przypadki testowe:
987
=>987
(Nie w odpowiedniej kolejności. Nic nie robi.)6 7
=>6 7
(Biała spacja działa jako bufor między 6 a 7. Nic się nie dzieje)676
=>7
7896789
=>77
7689
=>7
abcd
=>abcd
68978966897896
=>68977
Odpowiedzi:
Siatkówka , 12
Tłumaczenie odpowiedzi sed:
Wypróbuj online
źródło
JavaScript ES6, 29 bajtów
Test:
źródło
Java,
126816658 bajtówDzięki @GamrCorps za udostępnienie wersji kodu lambda!
Dzięki @ user902383 za wskazanie sztuczki polegającej na autoboksowaniu!
...tak.
Jest faktycznie dłuższy niż się spodziewałem - Java zamienia elementy w ciągach
replaceAll()
jeden raz na dopasowanie, nie wielokrotnie, dopóki nie przestanie się zmieniać. Musiałem więc użyć fantazyjnej pętli.Formularz lambda:
Formularz funkcji:
Testowany niepoznany kod:
źródło
.equals
na!=
, co nie robi tego samego.==
(lub!=
) porównuje według położenia szesnastkowego obiektu, a nie według wartości. W przeciwnym razie ma taką samą długość.while()
ma 7 bajtów,for(;;)
ma 7 bajtów.GNU Sed, 17
Wynik obejmuje +1 dla
-r
opcji.źródło
67789
powinien wrócić,77
ale zamiast tego zwraca677
s/67|7(6|89)/7/
zamiasts/6?7(6|89)/7/
s///g
?Perl 6 ,
1918 bajtów(Zauważ, że
[6|89]
wersja,(6|89)
której nie można przechwycić, jest napisana tak, jak(?:6|89)
w Perlu 5. Sposób<[6|89]>
pisania tego, co napisane jest[6|89]
w Perlu 5)stosowanie:
źródło
6*
i[6|89]*
nie pasują do niczego, co powstrzymuje7
bycie zastąpionym7
ad infinitum?7
z,7
a następnie zaczyna od nowa na następnej pozycji, działając do końca.:g
jest skrótem od:global
nierepeat until it doesn't match anymore
.s/67|76|789/7/
do pracy667
, musiałbym napisać to jako coś w stylu:while s/67|76|789/7/ {}
co oczywiście nigdy by się nie skończyło, gdybyś napisał to tak,while s/6*7[6|89]*/7/ {}
jak się spodziewałeś. Również koniec poprzedniego komentarza może odejść jako wredny, nie taki był jego zamiar[]
należy tego zmienić na()
? Nie chcesz dopasowywać rur lub79999
.[]
to nie przechwytująca wersja Perla 6()
, o której myślisz, napisane jak<[6|89]>
w Perlu 6.Pyth, 17 bajtów
Wypróbuj tutaj.
Dziurawa Zakonnica przerosła to bajtem w komentarzach.
źródło
Perl 5 , 17 bajtów
stosowanie:
źródło
Mathematica, 52 bajty
Wyjaśnienie:
źródło
Rdza, 96 bajtów
Beznadziejnie długi, jak zwykle dla Rust ...
Nie golfowany:
źródło
Emacs Lisp, 59 bajtów
Staje się nieco jaśniejszy ze spacjami:
źródło
Rubinowy, 27 bajtów
To rozwiązanie pochodzi z komentarzy, dzięki uprzejmości Brada Gilberta b2gills .
Rubinowy, 37 bajtów
(stare rozwiązanie)
To rozwiązanie wykorzystuje fakt, że nigdy nie będziesz musiał zamieniać więcej razy niż znaków w ciągu.
źródło
chars
zamiastsize.times
zapisać kilka bajtów.sub()
igsub()
metody, aby zastąpić najpierw lub wszystkie. Tak więc globalny jest tylko jedną postacią dłuższą.->s{s.gsub /6*7(6|89)*/,'7'}
igsub
wykonał całą pętlę.gsub /6*7(6|89)*/,?7
używanyruby -pe "gsub /6*7(6|89)*/,?7"
łącznie do 20 + 1 bajtówJapt , 15 bajtów
Proste rozwiązanie RegEx
Wypróbuj online
źródło
PowerShell, 27 bajtów
Z wykorzystaniem:
-replace
globalnie zastępuje domyślnie w PowerShell-regex
operator do tablicy$args
, stosując go indywidualnie do wszystkich elementów, i jest tylko jeden element, ponieważ jest tylko jeden parametr skryptu, więc działa OK i możemy uniknąć konieczności indeksowania elementu[0]
.Zrobiłoby to nowa poprzednia próba przed realizacją globalnego zastąpienia; 74 bajty budowania łańcucha „-replace -replace -replace” przy użyciu mnożenia ciągu znaków tyle razy, ile wynosi długość ciągu, a następnie eval ():
(Z odrobiną podstawienia łańcucha w celu skrócenia liczby zamienników).
źródło
CJam,
7064 bajtówDzięki @Peter Taylora do cięcia
{"789":I}{"76:":I}?
do"789""76"?:I
"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I={"789":I}{"76":I}?];}?}/A"67":Iq:A{AI#:B){AB<7+A{BI,+}~>+s:A];}{"76"I="789""76"?:I];}?}/A
Wiem, że prawdopodobnie można by grać o wiele dalej i twoja pomoc byłaby bardzo mile widziana, ale szczerze mówiąc, po prostu cieszę się, że udało mi się uzyskać odpowiedź. To była moja pierwsza próba napisania CJam.
Wyjaśnienie:
źródło
/
i*
. Pamiętaj również, że myślenie w kategoriach stosów, gdy jesteś przyzwyczajony do języków podobnych do C, wymaga pewnej adaptacji. Np.{"789":I}{"76":I}?
Może wyciągnąć zadanie, aby zostać"789""76"?:I
, na które można dalej grać w golfa78976`3/?:I
.78976`3/
daje tablicę["789" "76"]
; wtedy zamiast używać,?
będziesz musiał użyć=
do indeksowania; ale jest on skierowany do przodu, więc musiałby być odwrócony indeks, tracąc przewagę.MATL , 17 bajtów
Przykład
EDYCJA : Wypróbuj online!
Wyjaśnienie
Działa to poprzez zastosowanie regularnego zastępowania wyrażeń tyle razy, ile znaków ma oryginalny ciąg . To wystarczy, ponieważ każda zamiana zmniejsza liczbę znaków.
źródło
Poważnie, 29 bajtów
Pobiera dane wejściowe jako ciąg cudzysłowu, np
"6789"
. Wypróbuj online (będziesz musiał ręcznie zacytować dane wejściowe).Wyjaśnienie:
źródło
Czw. 26 bajtów
w tym końcowy znak nowej linii.
Dane wejściowe są dołączane do programu przed jego uruchomieniem.
Wyjście jest odczytywane ze stanu programu po jego zakończeniu, podobnie jak maszyna Turinga.
(Thue nie mają strumień wyjściowy, ale trudno używać prawidłowo, więc nie jestem pewien, czy jest to dopuszczalna metoda wyjścia)
źródło
Bash,
1028267 (+7)? bajtywersja extglob
Jest to przeznaczone do umieszczenia w pliku i wywołania np
bash -O extglob 789.sh 6567678989689789656
. (+7)? bajtów jest, jeśli opcja extglob liczy się do bajtów.Dzięki @BinaryZebra za wskazanie funkcji extglob!
Wersja bez extglob (82 bajty)
Jest to przeznaczone do umieszczenia w pliku i wywołania np
./789.sh 65678989656
.Wykorzystuje rozszerzenie parametrów do wyszukiwania i zamiany w pętli. Wymieniłem serię rozszerzeń, ponieważ nie znam sposobu na bardziej efektywne łączenie rozszerzeń.
źródło
@()
składnię. Wiedziałem, że musi istnieć sposób na ich połączenie. I @Mego, dzięki za powitanie!R, 35 bajtów
Nie wiedziałem, że mogę skorzystać z
gsub
tego sposobu, wielkie dzięki za każdą odpowiedź, która sprawiła, że nauczyłem się czegoś nowego.źródło
PHP 51 znaków
Przypadek testowy napisany długimi rękami
Dokonuje to porównania łańcucha i łańcucha zastępuje oba w stanie while. Jeśli warunek jest spełniony, aktualizuje lewą rękę porównania z wynikiem. Daj mi znać o wszelkich ulepszeniach.
źródło
Jolf , 15 bajtów
Wypróbuj tutaj! Czy naprawdę muszę to wyjaśniać?
źródło
PHP, 36 bajtów
Wyrażenie regularne, pobiera $ ciąg i zastępuje poprzez wyrażenie.
źródło
$argv
lub STDIN.Clojure, 71 bajtów
Clojure jest mniej niż idealny do gry w golfa ze względu na jego pełną naturę - ale mimo to jest to interesujące ćwiczenie:
Wersja golfowa, wykorzystująca interfejs Java:
Wersja bez gry w golfa, z wykorzystaniem Java Interop:
Wersja „czystego Clojure” bez gry w golfa:
źródło
/// , 19 bajtów (niekonkurujące)
Nie można tak naprawdę wprowadzić danych w tym języku, więc domniemane dane wejściowe znajdują się po prawej stronie kodu.
źródło
Python 3, 46 bajtów
źródło
Japt v2.0a0, 12 bajtów
Wypróbuj online!
Jak to działa
String.e
jest funkcją zastępowania rekurencyjnego. Japt 2 ma nową składnię wyrażeń regularnych i automatyczne uzupełnianie nawiasów w wyrażeniach regularnych, co oszczędza tutaj jeden bajt. (W Japt 1.x musieliśmy przekazywać łańcuchy zamiast wyrażeń regularnych, co było trochę niezgrabne.)źródło
Dyalog APL , 17 bajtów
'6*
dowolna liczba szóstek,7
po których następuje siedem(
…)*'
a następnie zero lub więcej sekwencji…6|89
sześć lub osiem-dziewięć⎕R
R EUmieãæ że z'7'
siódemkaźródło
05AB1E , 12 bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło