Proč se 6 bojí 7? Protože 7 8 9!
Vzhledem k řetězci použijte následující transformace:
- Pokud je vedle 7 6, odstraňte 6 (6 se bojí ze 7)
 - Pokud se objeví posloupnost „789“, odstraňte 8 a 9 (7 s 9)
 
(Pokud se nemýlím, nedělá to bez ohledu na to, v jakém pořadí provedete transformace)
Tyto transformace používejte, dokud již nebudete moci.
Příklad:
 78966 
Nejprve vidíme „789“, takže řetězec se změní na „766“. Pak vidíme „76“, takže vyjmeme 6 a řetězec se změní na „76“. Pak znovu vidíme „76“, takže nám zbývá „7“.
Testovací případy:
-  
987= >987(Není ve správném pořadí. Nedělá nic.) -  
6 7=>6 7(Mezera funguje jako vyrovnávací paměť mezi 6 a 7. Nic se neděje) -  
676=>7 -  
7896789=>77 -  
7689=>7 -  
abcd=>abcd 
Komentáře
Odpověď
Odpovědět
Javascript ES6, 29 bajtů
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]) 
Komentáře
- Skvělé, a protože 9 se sníží, máte pouze 2 bajty a vyhrajete s touto odpovědí: P
 
Odpověď
 Java,  126   81   66  58 bajtů 
Díky @GamrCorps za poskytnutí lambda verze tohoto kódu!
Díky @ user902383 za upozornění na trik autoboxingu!
. ..up.
 Je to ve skutečnosti delší než já očekává se – Java nahradí položky v řetězcích řetězcem replaceAll() jednou, ne opakovaně, dokud se nepřestane měnit. Takže jsem musel použít efekt pro smyčku. 
Formulář Lambda:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Funkční formulář:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Testovatelný neolgovaný kód:
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;} }
Komentáře
- Proč ne jít s lambdou? Ušetří minimálně 15 bajtů
 - @GamrCorps Nevím, jak to formulovat – nikdy nepoužívat funkce.
 - co iv id ‚ = „1002f10ca7“>
 
s bodem rozhraní a ne třídou?
.equals na !=, což  nedělá  totéž. == (nebo !=) porovnává podle hexadecimálního umístění objektu, nikoli podle hodnoty. Jinak má ‚ stejnou délku. while() je 7 bytů, for(;;) je 7 bytů. Odpověď
GNU Sed, 17
 Skóre zahrnuje +1 pro možnost -r. 
s/6*7(6|89)*/7/g 
Komentáře
-  Nepracuje ‚ pro 
67789by měl vrátit77, ale místo toho vrátí677 -  Můžete použít 
s/67|7(6|89)/7/místos/6?7(6|89)/7/ -  bože, zajímalo by mě, kde Larry přišel s nápadem 
s///g? 
Odpověď
  Perl 6 ,  19  18 bajtů 
 
 {S:g/6*7[6|89]*/7/} # 19 bytes  
 $ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes  
 (Všimněte si, že [6|89] je non-captur verze (6|89), která je v Perlu 5 napsána jako (?:6|89).<[6|89]> je způsob, jakým byste napsali, co je napsáno jako [6|89] v Perlu 5) 
použití:
 $ 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  
Komentáře
-  Neznám ‚ Perl 6, ale předpokládám toto je opakovaná substituce. Pokud se 
6*a[6|89]*don ‚ neshodují s čímkoli , co zastaví nahrazování7za7ad infinitum? -  @DigitalTrauma swapuje 
7s7pak začíná znovu na další pozici a pohybuje se až do konce.:gje zkratka:globalnotrepeat until it doesn't match anymore. -  @DigitalTrauma Chcete-li se dostat 
s/67|76|789/7/pracovat na Musel bych to napsat jako něco ve smyslu:while s/67|76|789/7/ {}což by se samozřejmě nikdy nezastavilo, kdybys to napsal jakowhile s/6*7[6|89]*/7/ {}jak byste čekali. Konec předchozího komentáře také může vypadat jako průměrný temperamentní, to je ne způsob, jakým byl vložen -  měl by ‚ změnit 
[]na()? Nechcete ‚ odpovídat rourám nebo79999. -  @jwodder No 
[]je verze()nezachycující verzi Perlu 6, na co myslíte, je v Perlu 6 napsáno jako<[6|89]>. 
Odpověď
Pyth, 17 bajtů
u:G"67|76|789"\7z 
Děravá jeptiška to v komentářích překonala o bajt.
Komentáře
Odpověď
Perl 5 , 17 bajtů
 perl -pe "s/6*7(6|89)*/7/g" # 16 + 1  
využití:
 $ 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  
Odpověď
Mathematica, 52 bajtů
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#& 
Vysvětlení:
 & 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. 
Komentáře
- Golfový kód je jasnější než vysvětlovací kód .. 🙂
 - @Rob Haven ‚ Dříve jsem dělal mnoho vysvětlení a používal systematický přístup.
 - Jen jsem škádlil, kámo 🙂
 
Odpověď
Rust, 96 bajtů
 fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}  
Beznadějně dlouhý, jako obvykle pro Rust …
Neoprávněný:
 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 }  
Komentáře
- Alespoň to ‚ není Java
 
Odpověď
Emacs Lisp, 59 bajtů
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s)) 
S mezerami je to trochu jasnější:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s)) 
Odpovědět
Rubín, 27 bajtů
Toto řešení je od komentářů, zásluh Brad Gilbert b2gills .
->s{s.gsub /6*7(6|89)*/,?7} 
Ruby, 37 bajtů
(staré řešení)
Toto řešení využívá skutečnosti, že nikdy nebudete muset nahradit vícekrát než znaky v řetězci.
->s{s.chars{s.sub! /67|76|789/,?7};s} 
Komentáře
-  K uložení několika můžete použít 
charsnamístosize.timesbajtů. - Nemá ‚ t Ruby globální příznak pro nahrazení regulárního výrazu, nebo by to vyžadovalo více bajtů?
 -  @ BradGilbertb2gills , v Ruby je jako v Awk: existují samostatné 
sub()agsub()metody, které nahradí první nebo všechny. Takže globální je o jeden znak delší. -  @manatwork Pak bych to napsal asi takto: 
->s{s.gsub /6*7(6|89)*/,'7'}a nechalgsubproveďte všechny smyčkové práce. -  Pokud správně rozumím pravidlům příznaků příkazového řádku, můžete ušetřit 16 bajtů pomocí příznaku příkazového řádku -p (+1), což je 
gsub /6*7(6|89)*/,?7s využitíruby -pe "gsub /6*7(6|89)*/,?7"celkem 20 + 1 bajtů 
odpověď
Odpověď
PowerShell, 27 bajty
$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 
Využití:
- vzor regex někoho jiného
 -  způsob 
-replaceve výchozím nastavení provede globální nahrazení v rozvinutí smyčky PowerShell - , kde použije na pole operátor 
-regex$argsjeho použitím na všechny prvky jednotlivě a je zde pouze jeden prvek, protože existuje pouze jeden parametr skriptu, takže funguje dobře a můžeme se vyhnout tomu, indexovat prvek[0]. 
Novinka předchozí pokus před realizací globálního nahrazení by to udělal; 74 bajtů stavby řetězce „-replace -replace -replace“ pomocí násobení řetězců, tolikrát, kolikrát je délka řetězce, poté eval () ing it:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex 
(S trochou nahrazení řetězců, aby se zkrátil počet nahrazení).
Odpověď
MATL , 17 bajtů
jt""789|76"55cYX] 
Příklad
>> matl > jt""789|76"55cYX] > > 7896789 77 
EDIT : Vyzkoušejte to online!
Vysvětlení
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 
Funguje to tak, že použijete náhradu regulárního výrazu za tolikrát, kolikrát jsou znaky v původním řetězci . To je dost, protože každá substituce snižuje počet znaků.
Odpověď
Vážně, 29 bytů
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n 
 Bere vstup jako dvojitě uvozený řetězec, například "6789".  Vyzkoušejte online  (budete muset ručně uvést citát). 
Vysvětlení:
,;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" 
Odpověď
PHP, 36 bajtů
preg_replace("/6*7(6|89)*/","7",$a); 
řešení regex, vezme $ řetězec a nahradí pomocí výrazu.
Komentáře
-   ZÍSKAT parametry nejsou v PHP přijatelné jako vstupní metoda . Budete muset buďto udělat tuto funkci a předat vstup jako parametry funkce, nebo získat vstup z 
$argvnebo STDIN. - @Mego Zdá se, že neexistuje shoda ohledně příspěvku, na který jste odkazovali.
 - @immibis Správně. K zajištění přijatelnosti I / O metody je nutná shoda. Jeho nedostatek znamená, že je nepřijatelný.
 - TL; DR máte vážné nevýhody, pokud používáte PHP pro codegolf.
 
Odpověď
Thue , 26 bajtů
67::=7 76::=7 789::=7 ::= 
včetně koncového nového řádku.
 Vstup je k programu připojen před jeho spuštěním. 
 Výstup je přečten ze stavu programu po jeho ukončení, podobně jako u Turingova stroje. 
 (Thue  má  výstupní proud, ale jeho použití je obtížné, takže si nejsem jistý, zda se jedná o přijatelnou výstupní metodu) 
Komentáře
- Nemyslím si to ‚. Pokud máte způsob, jak STDOUT, musíte. Je nám líto!
 - Ano, podle meta příspěvku je to povoleno.
 
Odpovědět
 CJam,  70  64 bajtů 
 Děkujeme @Peter Taylor za snížení {"789":I}{"76:":I}? na "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 
Znám to by pravděpodobně mohl být golfován mnohem dále a vaše pomoc by byla velmi oceněna, ale upřímně jsem rád, že se mi podařilo získat odpověď. Toto byl můj první pokus o napsání CJam.
Vysvětlení:
"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 
Komentáře
-  O tuto otázku jsem se ‚ nepokusil já sám, takže si ‚ nejsem jistý, zda je to nejlepší přístup, ale pokud chcete provést rozdělení a připojení, podívejte se na 
/a*. Všimněte si také, že přemýšlení ve smyslu hromádek, když jste ‚ zvyklí na jazyky podobné C, je nějaká adaptace. Např.{"789":I}{"76":I}?může vytáhnout úkol a stát se"789""76"?:I, které lze dále přepnout na78976`3/?:I. - Děkuji! Nemohl jsem však ‚ úplně pochopit, jak použít váš druhý návrh.
 -  Lituji, moje chyba.
78976`3/dává pole["789" "76"]; pak místo použití?budete muset použít=k indexování; ale ‚ je back-to-front, takže by bylo nutné index převrátit a ztratit tak výhodu. 
Odpověď
R, 35 bajtů
cat(gsub("6*7(6|89)*",7,scan(,""))) 
 Nevěděl jsem, že mohu použít gsub tímto způsobem velké poděkování za každou odpověď, která mě přiměla naučit se něco nového. 
Odpovědět
/// , 19 bajtů (nekonkurenční)
/67/7//76/7//789/7/ 
Ve skutečnosti nemůžete zadat vstup v tomto jazyce, takže předpokládaný vstup jde napravo od kódu.
Komentáře
- Všimněte si, že Itflabtijtslwi je lomítko, ale se vstupem.
 - @FryAmTheEggman Ačkoli ten zadává znaky , ne řetězce .
 - Zdá se, že vašemu odkazu chybí jedno lomítko.
 
Odpověď
  PHP 51 znaků  
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;} 
Testovací případ napsaný dlouhou rukou
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7; 
Tímto způsobem se provede porovnání řetězce a řetězec se nahradí za podmínky while. Pokud je podmínka splněna, aktualizuje se levá ruka porovnání s výsledkem. Dejte mi vědět o jakýchkoli vylepšeních.
Odpověď
Jolf , 15 bajtů
Vyzkoušejte to zde! Opravdu to musím vysvětlit?
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 
Odpověď
Clojure, 71 bajtů
Clojure je díky golfu méně než ideální pro golf podrobná povaha – ale přesto je to zajímavé cvičení:
Golfová verze s využitím Java interop:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x)))) 
Negolfovaná verze, pomocí Java interop:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x)))) 
Ungolfovaný “ čistý Clojure “ verze:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x)))) 
Odpověď
 Bash,  102   82  67 (+7)? bajtů 
verze extglob
 x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v  
 To má být vloženo do souboru a voláno např. bash -O extglob 789.sh 6567678989689789656. The (+7)? bytes is for if the extglob option counts towards bytes. 
Díky @BinaryZebra za poukázání na funkce extglob!
Non-extglob verze (82 bytů)
 x=$1 while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done echo $v  
 To má být vloženo do souboru a voláno např. ./789.sh 65678989656. 
Při vyhledávání a nahrazování ve smyčce využívá rozšíření parametrů. Do výměny jsem zapojil řadu expanzí, protože si nejsem vědom způsobu, jak efektivněji rozšiřovat řetězce.
Komentáře
- Vítejte na PPCG!
 -  @BinaryZebra Ah, díky za syntax 
@(). Věděl jsem, že musí existovat způsob, jak je kombinovat. A @Mego, děkuji za přivítání ! 
Odpověď
Python 3, 46 bajtů
 import re lambda s:re.sub(r"6*7(6|89)*","7",s)  
odpověď
Japt v2.0a0, 12 bajtů
e/6?7(6|89/7 
Jak to funguje
 String.e je rekurzivní funkce nahrazení. Japt 2 má novou syntaxi regexu a automatické dokončování závorek uvnitř regexu, který zde uloží jeden bajt. (V Japt 1.x jsme museli předat řetězce místo regexů, což bylo trochu neohrabané.) 
Odpovědět
Dyalog APL , 17 bajtů
"6*7(6|89)*"⎕R"7" 
 "6* libovolný počet šestek 
 7 následovaný sedmičkou 
 (… )*" následuje nula nebo více sekvencí… 
 6|89 šest nebo osm devět 
 ⎕R  R  místo, kde 
 "7" sedm 
odpověď
05AB1E , 12 bajtů
Δ67‚7:789¬: 
Vyzkoušejte to online nebo ověřte všechny testovací případy .
Vysvětlení:
 Δ # 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