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
67789
by 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í7
za7
ad infinitum? - @DigitalTrauma swapuje
7
s7
pak začíná znovu na další pozici a pohybuje se až do konce.:g
je zkratka:global
notrepeat 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
chars
namístosize.times
bajtů. - 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 nechalgsub
proveď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)*/,?7
s 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
-replace
ve výchozím nastavení provede globální nahrazení v rozvinutí smyčky PowerShell - , kde použije na pole operátor
-regex
$args
jeho 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
$argv
nebo 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