Dlaczego 6 bało się 7?

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

  • Dlaczego Vista bała się 7? Ponieważ 7 8 10.
  • Kolejny przypadek testowy 68978966897896 = > 68977
  • @ThomasKwa Och, rozumiem: Microsoft pominął Windows 9, ponieważ zajmował się zagadką. 😉
  • Dlaczego bałem się siedmiu to pięć? Ponieważ sześć siedem osiem. – Yoda
  • Sześciu bało się siedmiu, ponieważ siedmiu miało zimne, martwe oczy.

Odpowiedź

Retina , 12

Tłumaczenie sed odpowiedzi :

6*7(6|89)* 7 

Wypróbuj online

Komentarze

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 zwraca 677
  • Możesz użyć s/67|7(6|89)/7/ zamiast s/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 powstrzymuje 7 zastępowanie 7 ad infinitum?
  • @DigitalTrauma It swap 7 z 7, a następnie rozpoczyna się ponownie na następnej pozycji, dochodząc do końca. :g to skrót od :global nie repeat 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 jako while 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 ani 79999.
  • @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 

Wypróbuj tutaj.

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 zamiast size.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() i gsub() 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 niech gsub 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życie ruby -pe "gsub /6*7(6|89)*/,?7" łącznie 20 + 1 bajtów

Odpowiedź

Japt , 15 bajtów

Ur"6*7(89|6)*"7 

Proste rozwiązanie RegEx

Wypróbuj online

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ć do 78976`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 

Wypróbuj online !

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)  

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *