Proč se 6 bojí 7?

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

  • Proč se Vista bála 7? Protože 7 8 10.
  • Další testovací případ 68978966897896 = > 68977
  • @ThomasKwa No, chápu: Microsoft přeskočil Windows 9, protože šli spolu s hádankou. 😉
  • Proč se bát sedmičky bylo pět? Protože šest sedm osm. –Yoda
  • Šest se bála sedmi, protože sedm měla chladné, mrtvé oči.

Odpověď

Retina , 12

Překlad odpovědi sed :

6*7(6|89)* 7 

Vyzkoušejte online

Komentáře

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?

  • @eis Rozhraní odstraňuje potřebu deklarovat main jako public, což poskytuje sebemenší výhodu. Viz: codegolf.stackexchange.com/a/64713/44713
  • @ user902383 Redukce, kterou ‚ je změnou .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átit 77, ale místo toho vrátí 677
    • Můžete použít s/67|7(6|89)/7/ místo s/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 za 7 ad infinitum?
    • @DigitalTrauma swapuje 7 s 7 pak začíná znovu na další pozici a pohybuje se až do konce. :g je zkratka :global not repeat 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 jako while 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 nebo 79999.
    • @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 

    Vyzkoušejte to zde.

    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ísto size.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() a gsub() 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 nechal gsub 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ěď

    Japt , 15 bajtů

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

    Jednoduché řešení RegEx

    Vyzkoušejte online

    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 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 na 78976`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 

    Vyzkoušejte online !

    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)  

    Napsat komentář

    Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *