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 
.equalsna!=, 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 
67789powinien 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 powstrzymuje7zastępowanie7ad infinitum? -  @DigitalTrauma It swap 
7z7, a następnie rozpoczyna się ponownie na następnej pozycji, dochodząc do końca.:gto skrót od:globalnierepeat 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ć 
charszamiastsize.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 niechgsubwykonuje 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)*/,?7z 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 
-replacedomyślnie wykonuje globalne zastąpienie w PowerShell -  rozwijanie pętli, gdzie zastosuje operator 
-regexdo tablicy$argsprzez 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 
$argvlub 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