Dlaczego 6 bało się 7? Ponieważ 7 8 9!
Biorąc pod uwagę ciąg, zastosuj następujące przekształcenia:
- Jeśli obok 7 znajduje się 6, usuń 6 (6 boi się z 7)
- Jeśli pojawi się sekwencja „789”, usuń 8 i 9 (7 zjadło 9)
(Jeśli się nie mylę, to nie bez względu na to, w jakiej kolejności wykonujesz transformacje)
Stosuj te przekształcenia, dopóki nie będziesz mógł.
Przykład:
78966
Najpierw widzimy „789”, więc ciąg staje się „766”. Następnie widzimy „76”, więc wyjmujemy 6 i ciąg staje się „76”. Następnie ponownie widzimy „76”, więc pozostaje „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
Komentarze
Odpowiedź
Odpowiedź
Javascript ES6, 29 bajtów
s=>s.replace(/6*7(89|6)*/g,7)
Test:
f=s=>s.replace(/6*7(89|6)*/g,7) ;`987 -> 987 6 7 -> 6 7 676 -> 7 7896789 -> 77 7689 -> 7 abcd -> abcd` .split`\n`.every(t=>(t=t.split` -> `)&&f(t[0])==t[1])
Komentarze
- Świetnie, a ponieważ zjadłeś 9, masz tylko 2 bajty i wygrywasz tą odpowiedzią: P
Odpowiedź
Java, 126 81 66 58 bajtów
Dziękujemy @GamrCorps za udostępnienie wersji lambda tego kodu!
Dziękujemy @ user902383 za wskazanie sztuczki z automatycznym blokowaniem!
. .. tak.
Właściwie to dłużej niż ja oczekiwano – Java zamienia elementy w łańcuchach na replaceAll()
raz na dopasowanie, a nie wielokrotnie, dopóki nie przestanie się zmieniać. Musiałem więc użyć wymyślnej pętli for.
Forma lambda:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Forma funkcji:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Testowalny Ungolfed Code:
class B{ public static void main(String[]a){ System.out.print(new B().s(a[0])); } String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;} }
Komentarze
- Dlaczego nie wybrać lambdy? Zaoszczędzi co najmniej 15 bajtów.
- @GamrCorps Don ' Nie wiem, jak to wyrazić – nigdy nie używaj funkcji.
- co ' jest punktem interfejsu, a nie klasy?
- Interfejs @eis eliminuje potrzebę deklarowania main jako publicznego, co daje najmniejszą przewagę. Zobacz: codegolf.stackexchange.com/a/64713/44713
- @ user902383 Redukcja ' polega na zmianie
.equals
na!=
, co nie robi to samo.==
(lub!=
) porównuje obiekt w formacie szesnastkowym, a nie według wartości. W przeciwnym razie ' ma taką samą długość.while()
ma 7 bajtów,for(;;)
ma 7 bajtów.
Odpowiedź
GNU Sed, 17
Wynik obejmuje +1 dla opcji -r
.
s/6*7(6|89)*/7/g
Komentarze
- Nie ' nie działa dla
67789
powinien zwrócić77
, ale zamiast tego zwraca677
- Możesz użyć
s/67|7(6|89)/7/
zamiasts/6?7(6|89)/7/
- O rany, zastanawiam się, skąd Larry wpadł na pomysł
s///g
?
Odpowiedź
Perl 6 , 19 18 bajtów
{S:g/6*7[6|89]*/7/} # 19 bytes
$ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes
(Zwróć uwagę, że [6|89]
to nie-captur w wersji (6|89)
, zapisanej jako (?:6|89)
w Perlu 5.<[6|89]>
to sposób, w jaki można napisać to, co jest zapisane jako [6|89]
w Perlu 5)
użycie:
$ perl6 -pe "s:g/6*7[6|89]*/7/" <<< " 987 6 7 6676689 7896789 7689 abcd 68978966897896 79|689 "
987 6 7 7 77 7 abcd 68977 79|689
Komentarze
- Nie ' nie znam Perla 6, ale zakładam to jest wielokrotne podstawianie. Jeśli
6*
i[6|89]*
nie ' nie pasują do niczego , co powstrzymuje7
zastępowanie7
ad infinitum? - @DigitalTrauma It swap
7
z7
, a następnie rozpoczyna się ponownie na następnej pozycji, dochodząc do końca.:g
to skrót od:global
nierepeat until it doesn't match anymore
. - @DigitalTrauma Aby uzyskać
s/67|76|789/7/
do pracuj nad musiałbym napisać to jako coś, co skutkuje:while s/67|76|789/7/ {}
, co oczywiście nigdy by się nie skończyło, gdybyś napisał to jakowhile s/6*7[6|89]*/7/ {}
jak można się spodziewać. Ponadto koniec poprzedniego komentarza może wydawać się złośliwy, to znaczy nie , jak został intedowany. - Powinien ' t
[]
zostanie zmienione na()
? Nie ' nie chcesz dopasowywać potoków ani79999
. - @jwodder No
[]
to nieprzechwytująca wersja Perla 6()
, to, o czym myślisz, jest zapisywane jako<[6|89]>
w Perlu 6 .
Odpowiedź
Pyth, 17 bajtów
u:G"67|76|789"\7z
Dziurawa Zakonnica pokonała to o bajt w komentarzach.
Komentarze
Odpowiedź
Perl 5 , 17 bajtów
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
użycie:
$ perl -pe "s/6*7(6|89)*/7/g" <<< " 987 6 7 6676689 7896789 7689 abcd 68978966897896 "
987 6 7 7 77 7 abcd 68977
Odpowiedź
Mathematica, 52 bajty
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&
Wyjaśnienie:
& A function returning & a function returning # its first argument StringReplace[ , ] with "67" "67" | or "76" "76" | or "789" "789" -> replaced with "7" "7" ~FixedPoint~ applied to # its first argument until it no longer changes.
Komentarze
- Kod do gry w golfa jest wyraźniejszy niż kod wyjaśnienia .. 🙂
- @Rob Haven ' Wcześniej przedstawiłem wiele wyjaśnień, stosując systematyczne podejście.
- Po prostu drażniłem się, kolego 🙂
Odpowiedź
Rust, 96 bajtów
fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}
Beznadziejnie długi, jak zwykle dla Rusta …
Ungolfed:
fn seven_ate_nine(mut str: String) -> String { for _ in 0..str.len() { for to_replace in &["67","76","789"] { str = str.replace(to_replace, "7"); } } s }
Komentarze
- Przynajmniej to ' to nie Java
Odpowiedź
Emacs Lisp, 59 bajtów
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
Staje się trochę jaśniejsze dzięki spacjom:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Odpowiedź
Ruby, 27 bajtów
To rozwiązanie pochodzi z komentarzy, autorstwo Brad Gilbert b2gills .
->s{s.gsub /6*7(6|89)*/,?7}
Ruby, 37 bajtów
(stare rozwiązanie)
W tym rozwiązaniu wykorzystano fakt, że nigdy nie będziesz musiał podmieniać więcej razy niż znaków w ciągu.
->s{s.chars{s.sub! /67|76|789/,?7};s}
Komentarze
- Możesz użyć
chars
zamiastsize.times
, aby zapisać kilka bajtów. - Czy nie ' t Ruby ma globalną flagę do podstawiania wyrażeń regularnych, czy włączenie tego wymagałoby więcej bajtów?
- @ BradGilbertb2gills , w Rubim jest jak w Awk: istnieją oddzielne metody
sub()
igsub()
do zamiany pierwszej lub wszystkich metod. Tak więc wartość globalna jest tylko o jeden znak dłuższa. - @manatwork Następnie napisałbym coś takiego:
->s{s.gsub /6*7(6|89)*/,'7'}
i niechgsub
wykonuje całą pracę zapętloną. - Jeśli dobrze rozumiem zasady dotyczące flag wiersza poleceń, możesz zaoszczędzić 16 bajtów, używając flagi -p wiersza poleceń (+1), dzięki czemu
gsub /6*7(6|89)*/,?7
z użycieruby -pe "gsub /6*7(6|89)*/,?7"
łącznie 20 + 1 bajtów
Odpowiedź
Odpowiedz
PowerShell, 27 bytes
$args-replace"6*7(89|6)*",7 e.g. PS C:\temp> .\ate.ps1 "7689" 7 PS C:\temp> .\ate.ps1 "abcd" abcd PS C:\temp> .\ate.ps1 "68978966897896" 68977
Wykorzystując:
- wzorzec wyrażenia regularnego innej osoby
- sposób
-replace
domyślnie wykonuje globalne zastąpienie w PowerShell - rozwijanie pętli, gdzie zastosuje operator
-regex
do tablicy$args
przez zastosowanie go do wszystkich elementów osobno, a tutaj jest tylko jeden element, ponieważ jest tylko jeden parametr skryptu, więc działa dobrze i możemy uniknąć do indeksu elementu[0]
.
Nowatorska poprzednia próba przed wykonaniem globalnej zamiany zrobiłaby to; 74 bajty budowania łańcucha „-replace -replace -replace” przy użyciu mnożenia ciągów, tyle razy, ile jest długość ciągu, a następnie eval () go:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(Z niewielką zmianą ciągu w celu skrócenia liczby zmian).
Odpowiedź
MATL , 17 bajtów
jt""789|76"55cYX]
Przykład
>> matl > jt""789|76"55cYX] > > 7896789 77
EDYTUJ : Wypróbuj online!
Wyjaśnienie
j % input string t % duplicate " % for each character. Iterates as many times as the string length "789|76" % regular expression for replacement 55c % string to insert instead: character "7" YX % regexprep ] % end for
Działa to poprzez zastosowanie zwykłego zamiany wyrażenia na tyle razy, ile znaków jest w oryginalnym ciągu . To wystarczy, ponieważ każde podstawienie zmniejsza liczbę znaków.
Odpowiedź
Poważnie, 29 bajtów
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
Pobiera dane wejściowe jako ciąg znaków w podwójnych cudzysłowach, na przykład "6789"
. Wypróbuj online (konieczne będzie ręczne zacytowanie danych wejściowych).
Wyjaśnienie:
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n ,;l get input and push its length (we"ll call it n) ` `n call the following function n times: "7;;"67"(Æ replace all occurrences of "67" with "7" "76"(Æ replace all occurrences of "76" with "7" "789"(Æ replace all occurrences of "789" with "7"
Odpowiedź
PHP, 36 bajtów
preg_replace("/6*7(6|89)*/","7",$a);
rozwiązanie regex, pobiera ciąg znaków $ i zamienia go za pomocą wyrażenia.
Komentarze
- GET parametry nie są akceptowane jako metoda wprowadzania danych w PHP . Będziesz musiał albo uczynić to funkcją i przekazać dane wejściowe jako parametry funkcji, albo pobrać dane wejściowe z
$argv
lub STDIN. - @Mego Wygląda na to, że nie ma konsensus w sprawie posta, do którego utworzyłeś link.
- @immibis Poprawnie. Aby metoda We / Wy była akceptowalna, wymagany jest konsensus. Brak jednego oznacza, że jest to niedopuszczalne.
- TL; DR Masz poważne wady, jeśli używasz PHP dla codegolf.
Odpowiedź
czw , 26 bajtów
67::=7 76::=7 789::=7 ::=
włączając 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 w maszynie Turinga.
(Thue ma strumień wyjściowy, ale trudno go używać poprawnie, więc nie jestem pewien, czy jest to akceptowalna metoda wyjściowa)
Komentarze
- Nie ' nie sądzę. Jeśli masz drogę do STDOUT, musisz. Przepraszamy!
- Tak, jest to dozwolone zgodnie z meta postem.
Odpowiedź
CJam, 70 64 bajty
Dzięki @Peter Taylor za wycięcie {"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 o tym prawdopodobnie można zagrać w golfa znacznie dalej, a twoja pomoc byłaby bardzo doceniona, ale szczerze mówiąc, jestem po prostu szczęśliwy, że udało mi się uzyskać odpowiedź. To była moja pierwsza próba napisania CJam.
Wyjaśnienie:
"67":I e# Assign the value of 67 to I q:A e# Read the input and assign to A { e# Opening brackets for loop AI#:B) e# Get the index of I inside A and assign to B. The increment value by 1 to use for if condition (do not want to process if the index was -1) { e# Open brackets for true result of if statement AB< e# Slice A to get everything before index B 7+ e# Append 7 to slice A{BI,+}~> e# Slice A to get everything after index B plus the length of string I (this will remove I entirely) +s:A e# Append both slices, convert to string, and assign back to A ]; e# Clear the stack } e# Closing brackets for the if condition { e# Open brackets for false result of if statement "76"I= e# Check if I is equal to 76 "789" e# If I is 76, make I 789 "76"?:I e# If I is not 76, make I 76 ]; e# Clear the stack if I does not exist inside A }? e# Closing brackets for false result of if statement }/ e# Loop A e# Output A
Komentarze
- Nie ' nie próbowałem tego pytania siebie, więc ' nie jestem pewien, czy to najlepsze podejście, ale jeśli chcesz podzielić i dołączyć, spójrz na
/
i*
. Zwróć też uwagę, że myślenie w kategoriach stosów, gdy ' używasz języków podobnych do C, wymaga to pewna adaptacja. Na przykład.{"789":I}{"76":I}?
może wyciągnąć przypisanie, aby stać się"789""76"?:I
, które można dalej przesyłać do78976`3/?:I
. - Dziękuję! Nie mogłem jednak ' całkiem zrozumieć, jak użyć twojej drugiej sugestii.
- Przepraszam, mój błąd.
78976`3/
daje tablicę["789" "76"]
; zamiast używać?
, do indeksowania należy użyć=
; ale ' jest odwrócony, więc indeks musiałby zostać odwrócony, tracąc przewagę.
Odpowiedź
R, 35 bajtów
cat(gsub("6*7(6|89)*",7,scan(,"")))
Nie wiedziałem, że mogę użyć gsub
w ten sposób wielkie dzięki za każdą odpowiedź, dzięki której nauczyłem się czegoś nowego.
Odpowiedź
/// , 19 bajtów (niekonkurujące)
/67/7//76/7//789/7/
W rzeczywistości nie możesz wprowadzić danych wejściowych w tym języku, więc przypuszczalne dane wejściowe znajdują się po prawej stronie kodu.
Komentarze
- Zwróć uwagę, że Itflabtijtslwi to ukośniki, ale z danymi wejściowymi.
- @FryAmTheEggman Chociaż wprowadza się znaki , a nie ciągi .
- W Twoim linku brakuje jednego ukośnika.
Odpowiedź
PHP 51 znaków
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
Przypadek testowy napisany odręcznie
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
W ten sposób porównuje się ciągi i zastępuje oba w warunku while. Jeśli warunek jest spełniony, aktualizuje lewą rękę porównania wynikiem. Daj mi znać o wszelkich ulepszeniach.
Odpowiedź
Jolf , 15 bajtów
Spróbuj tutaj! Czy naprawdę muszę wyjaśniać?
pi"6*7(6|89)*"7 p replace any entity in i the input "6*7(6|89)*" that matches this regex 7 with 7 implicit output
Odpowiedź
Clojure, 71 bajtów
Clojure jest mniej niż idealny do gry w golfa ze względu na rozwlekły charakter – ale mimo wszystko jest to interesujące ćwiczenie:
Wersja do gry w golfa z wykorzystaniem języka Java:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
Wersja bez gry w golfa, przy użyciu języka Java:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
Un-golfed ” pure Clojure ” wersja:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x))))
Odpowiedź
Bash, 102 82 67 (+7)? bytes
wersja extglob
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
Ma to na celu umieszczenie go w pliku i wywołanie np. bash -O extglob 789.sh 6567678989689789656
. (+7)? bajty są przeznaczone, jeśli opcja extglob liczy się do bajtów.
Dzięki @BinaryZebra za wskazanie funkcji extglob!
Wersja non-extglob (82 bajty)
x=$1 while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done echo $v
Ma to być umieszczone w pliku i wywołane np. ./789.sh 65678989656
.
Wykorzystuje rozwinięcie parametrów do wyszukiwania i zamiany w pętli. Wykorzystałem serię rozszerzeń, aby dokonać wymiany, ponieważ nie znam sposobu na skuteczniejsze łączenie rozszerzeń w łańcuchu.
Komentarze
- Witamy w PPCG!
- @BinaryZebra Ach, dzięki za składnię
@()
. Wiedziałem, że musi być sposób na połączenie tych elementów. I @Mego, dzięki za powitanie !
Odpowiedź
Python 3, 46 bajtów
import re lambda s:re.sub(r"6*7(6|89)*","7",s)
Odpowiedź
Japt v2.0a0, 12 bajtów
e/6?7(6|89/7
Jak to działa
String.e
to funkcja rekurencyjnej zamiany. Japt 2 ma nową składnię wyrażeń regularnych i automatyczne uzupełnianie nawiasów wewnątrz wyrażenia regularnego, co zapisuje tutaj jeden bajt. (W Japt 1.x musieliśmy przekazać ciągi znaków zamiast wyrażeń regularnych, co było trochę niezgrabne).
Odpowiedź
Dyalog APL , 17 bajtów
"6*7(6|89)*"⎕R"7"
"6*
dowolna liczba szóstek
7
, po których następuje siedem
(
… )*"
, po których następuje zero lub więcej sekwencji…
6|89
sześć lub osiem dziewięć
⎕R
R wstaw to
"7"
siódemka
Odpowiedź
05AB1E , 12 bajtów
Δ67‚7:789¬:
Wypróbuj online lub zweryfikuj wszystkie przypadki testowe .
Wyjaśnienie:
Δ # Continue doing the following until it no longer changes: 67 # Push 67 to the stack  # Bifurcate (short for Duplicate & Reverse); which pushes 76 to the stack ‚ # Pair them up 7: # Replace all occurrences of 67 or 76 with 7 in the (implicit) input # i.e. 17893762 → 1789372 789 # Push 789 to the stack ¬ # Take the head (without popping); which pushes 7 to the stack : # Replace all 789 with 7 # i.e. 1789372 → 17372 # (And implicitly output the result after the loop)
68978966897896
= >68977