Miksi 6 pelkäsi 7: tä?

Miksi 6 pelkäsi 7: tä? Koska 7 8 9!

Anna merkkijonolle seuraavat muunnokset:

  • Jos 7: n vieressä on 6, poista 6 (6 pelkää) / 7)
  • Jos sekvenssi ”789” ilmestyy, poista 8 ja 9 (7 söivät 9)

(Jos en erehdy, se ei ”t” riippumatta siitä, missä järjestyksessä muunnokset tehdään)

Jatka näiden muunnosten soveltamista, kunnes et voi enää.

Esimerkki:

78966

Ensin näemme ”789”, joten merkkijonosta tulee ”766”. Sitten näemme ”76”, joten otamme 6, ja merkkijonosta tulee ”76”. Sitten näemme jälleen ”76”, joten meille jää ”7”.

Testitapaukset:

  • 987 = > 987 (Ei oikeassa järjestyksessä. Ei tee mitään.)
  • 6 7 => 6 7 (välilyönti toimii puskurina välillä 6 ja 7. Mitään ei tapahdu)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd

Kommentit

  • Miksi Vista pelkäsi 7: tä? Koska 7 8 10.
  • Toinen testitapaus 68978966897896 = > 68977
  • @ThomasKwa Voi, ymmärrän sen: Microsoft ohitti Windows 9: n, koska he menivät yhdessä arvoituksen kanssa. 😉
  • Miksi pelätä seitsemää oli viisi? Koska kuusi seitsemän kahdeksan. – Yoda
  • Kuusi pelkäsi seitsemää, koska seitsemällä oli kylmät, kuolleet silmät.

Vastaus

Verkkokalvo , 12

Sed-vastauksen käännös :

6*7(6|89)* 7 

Kokeile online-tilassa

Kommentit

Vastaa

Javascript ES6, 29 tavua

s=>s.replace(/6*7(89|6)*/g,7) 

Testi:

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]) 

Kommentit

  • Hienoa, ja koska 9 on syöty, sinulla on vain 2 tavua ja voitat tällä vastauksella: P

vastaus

Java, 126 81 66 58 tavua

Kiitos @GamrCorpsille tämän koodin lambda-version toimittamisesta!

Kiitos @ user902383, kun osoitit autoboxing-temppun!

. ..joo.

Se on oikeastaan pidempi kuin minä odotettavissa – Java korvaa merkkijonon kohteet replaceAll() -kerralla kerran ottelussa, ei toistuvasti, ennen kuin se lopettaa muutoksen. Joten minun piti käyttää hienoa silmukalle.

Lambda-lomake:

x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Funktion muoto:

String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}

Testattava Ungolfed-koodi:

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;} }

kommentit

  • Miksi et menisi lambdan kanssa? Säästää vähintään 15 tavua
  • @GamrCorps Don ’ ei osaa ilmaista tätä – älä koskaan käytä funktioita.
  • mitä ’ onko käyttöliittymän kohta eikä luokka?
  • @eis Interface poistaa tarpeen julistaa päätiedot julkiseksi, mikä antaa pienimmän edun. Katso: codegolf.stackexchange.com/a/64713/44713
  • @ user902383 Vähennys, jonka ’ uudelleen tekeminen on muuttamalla .equals arvoksi !=, mikä ei tee samaa. == (tai !=) vertaa objektin heksasijainnin, ei arvon perusteella. Muuten ’ on yhtä pitkä. while() on 7 tavua, for(;;) on 7 tavua.

Vastaa

GNU Sed, 17

Pisteet sisältävät +1 vaihtoehdolle -r.

s/6*7(6|89)*/7/g 

Kommentit

  • Ei toimi ’ ei toimi 67789 pitäisi palauttaa 77, mutta se palauttaa sen sijaan 677
  • Voit käyttää s/67|7(6|89)/7/ s/6?7(6|89)/7/
  • Gee, ihmettelen, mistä Larry keksi idean s///g?

vastaus

Perl 6 , 19 18 tavua

 {S:g/6*7[6|89]*/7/} # 19 bytes  

 $ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes  

(Huomaa, että [6|89] ei ole kapteeni (6|89) -versio, joka on kirjoitettu nimellä (?:6|89) Perl 5: ssä.<[6|89]> on se, miten kirjoitat mitä kirjoitetaan nimellä [6|89] Perl 5: ssä)

käyttö:

 $ 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  

Kommentit

  • En tunne ’ En tunne Perl 6: ta, mutta oletan tämä on toistuva korvaaminen. Jos 6* ja [6|89]* älä ’ t vastaa mitään mikä estää 7: n korvaamisen 7 ad infinitumilla?
  • @DigitalTrauma Se vaihtaa 7 ja 7 alkaa sitten uudelleen seuraavasta kohdasta ja työskentelee tiensä loppuun asti. :g on lyhyt :global ei repeat until it doesn't match anymore.
  • @DigitalTrauma Saadaksesi s/67|76|789/7/ työ Minun on kirjoitettava se jotain seurauksena: while s/67|76|789/7/ {}, joka ei tietenkään koskaan lopu, jos kirjoitat sen nimellä while s/6*7[6|89]*/7/ {} kuten voit odottaa. Myös edellisen kommentin loppu voi tulla keskeneräinen, eli ei miten se tarkoitettiin
  • Pitäisi ’ t [] muutetaan muotoon ()? Et ’ halua sovittaa putkia tai 79999.
  • @jwodder Ei [] on ei-siepattava Perl 6 -versio () -sarjasta. Ajattelusi on kirjoitettu nimellä <[6|89]> Perl 6: ssa .

Vastaa

Pyth, 17 tavua

u:G"67|76|789"\7z 

Kokeile täällä.

Leaky Nun on ohittanut tämän tavulla kommenteissa.

Kommentit

vastaus

Perl 5 , 17 tavua

 perl -pe "s/6*7(6|89)*/7/g" # 16 + 1  

käyttö:

 $ 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  

Vastaa

Mathematica, 52 tavua

StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#& 

Selitys:

 & 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. 

kommentit

  • golfattu koodi on selkeämpi kuin selityskoodi .. 🙂
  • @Rob Haven ’ ei tehnyt monia selityksiä aikaisemmin järjestelmällisen lähestymistavan mukaisesti.
  • Kiusasin vain, kaveri 🙂

Vastaa

ruoste, 96 tavua

 fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}  

Toivottoman pitkä, kuten Rustille tavallista …

Hylätty:

 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 }  

Kommentit

  • Ainakin se ’ ei ole Java

vastaus

Emacs Lisp, 59 tavua

(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s)) 

Välistä tulee hieman selkeämpi:

(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s)) 

vastaus

Ruby, 27 tavua

Tämä ratkaisu on kommenteista, kiitos Brad Gilbert b2gills .

->s{s.gsub /6*7(6|89)*/,?7} 

Rubiini, 37 tavua

(vanha ratkaisu)

Tässä ratkaisussa käytetään sitä, että sinun ei koskaan tarvitse korvata enempää merkkijonossa olevia merkkejä.

->s{s.chars{s.sub! /67|76|789/,?7};s} 

Kommentit

  • Voit käyttää chars -merkkiä size.times -merkin sijaan muutaman tallentamiseksi. tavua.
  • Eikö ’ t Ruby ole maailmanlaajuinen lippu regex-korvaamiseen, vai pitäisikö sen ottamiseen tarvita enemmän tavuja?
  • @ BradGilbertb2gills , Ruby on kuin Awk: on olemassa erilliset sub() – ja gsub() -menetelmät korvaamaan ensin tai kaikki. Joten globaali on vain yksi merkki pidempi.
  • @manatwork Sitten kirjoitan tämän: ->s{s.gsub /6*7(6|89)*/,'7'} ja annan gsub tee kaikki silmukointityöt.
  • Jos ymmärrän komentorivilippujen säännöt oikein, voit tallentaa 16 tavua käyttämällä -p-komentorivilippua (+1) tekemällä siitä gsub /6*7(6|89)*/,?7 kanssa käyttö ruby -pe "gsub /6*7(6|89)*/,?7" yhteensä 20 + 1 tavua

vastaus

Japt , 15 tavua

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

Yksinkertainen RegEx-ratkaisu

Kokeile online-tilassa

Vastaa

PowerShell, 27 tavua

$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 

Hyödyntämällä:

  • jonkun toisen regex-mallia
  • tapaa -replace korvaa oletusarvoisesti yleisen PowerShell-sovelluksen
  • silmukan purkamisen, jossa se käyttää operaattoria -regex taulukossa $args soveltamalla sitä kaikkiin elementteihin erikseen, ja tässä on vain yksi elementti, koska siellä on vain yksi komentosarjaparametri, joten se toimii OK ja voimme välttää indeksoida elementti [0].

Uusi uutuusyritys ennen maailmanlaajuisen korvaamisen toteuttamista tekisi sen; 74 tavua ”-korvaa-korvaa-korvaa” -ketjun rakentamisesta merkkijonon kertomalla niin monta kertaa kuin merkkijonon pituus, sitten eval () se:

""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex 

(Korvausten määrän lyhentämiseksi hieman merkkijonon korvaamista).

Vastaa

MATL , 17 tavua

jt""789|76"55cYX] 

Esimerkki

>> matl > jt""789|76"55cYX] > > 7896789 77 

MUOKKAA : Kokeile verkossa!

Selitys

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 

Tämä toimii soveltamalla tavallista lausekkeen korvaamista niin monta kertaa kuin on merkkejä alkuperäisessä merkkijonossa . Tämä riittää, koska jokainen korvaaminen vähentää merkkien määrää.

Vastaa

Vakavasti, 29 tavua

,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n 

Ottaa syötteen kaksoislainausmerkkijonona, kuten "6789". Kokeile online-tilassa (sinun on annettava syötteesi manuaalisesti).

Selitys:

,;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" 

Vastaa

PHP, 36 tavua

preg_replace("/6*7(6|89)*/","7",$a); 

regex-ratkaisu, ottaa merkkijonon $ ja korvaa lausekkeen.

Kommentit

  • GET parametrit eivät ole hyväksyttäviä syöttötapana PHP: ssä . Sinun on joko tehtävä tästä funktio ja välitettävä syöttö funktioparametreina, tai haettava tulo osoitteesta $argv tai STDIN.
  • @Mego Ei näytä olevan yksimielisyys linkitetystä viestistä.
  • @immibis Oikea. I / O-menetelmän hyväksymiseksi tarvitaan yksimielisyys. Yhden puuttuminen tarkoittaa, että sitä ei voida hyväksyä.
  • TL; DR: llä on vakavia haittoja, jos käytät PHP: tä koodegolfiin.

Vastaa

Thue , 26 tavua

67::=7 76::=7 789::=7 ::= 

sisältää uuden rivin.

Syöttö liitetään ohjelmaan ennen sen käynnistämistä.
Tulos luetaan ohjelman tila, kun se päättyy, samalla tavalla kuin Turingin kone.
(Thue on lähtövirta, mutta sitä on vaikea käyttää oikein, joten en ole varma, onko tämä hyväksyttävä tulosmenetelmä)

Kommentit

  • En ajattele niin ’. Jos sinulla on tapa STDOUT, sinun on. Anteeksi!
  • Kyllä, tämä on sallittua sisällönkuvauksen mukaan.

Vastaa

CJam, 70 64 tavua

Kiitos @Peter Taylor leikkaamalla {"789":I}{"76:":I}? "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

Tiedän tämän voisi todennäköisesti golfata paljon pidemmälle ja apuasi arvostetaan suuresti, mutta rehellisesti sanottuna olen onnellinen, onnistuin saamaan vastauksen. Tämä oli ensimmäinen yritykseni kirjoittaa CJam.

Selitys:

"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 

Kommentit

  • En ole yrittänyt ’ yrittänyt tätä kysymystä itseäni, joten en ’ ole varma, onko tämä paras tapa, mutta jos haluat jakaa ja liittyä, katso / ja *. Huomaa myös, että pinoina ajattelu, kun ’ on tottunut C-tyyppisiin kieliin, kestää s sopeutumista. Esimerkiksi. {"789":I}{"76":I}? voi vetää tehtävän "789""76"?:I, joka voidaan edelleen golfata 78976`3/?:I .
  • Kiitos! En voinut ’ ymmärtää, miten toista ehdotustasi käytetään.
  • Anteeksi, erehdykseni.78976`3/ antaa taulukon ["789" "76"]; sitten sen sijaan, että käytät ?, sinun on käytettävä indeksointiin =; mutta se ’ on edestä eteenpäin, joten se tarvitsee indeksin käänteisen menettää etunsa.

Vastaa

R, 35 tavua

cat(gsub("6*7(6|89)*",7,scan(,""))) 

En tiennyt, että voisin käyttää gsub tällä tavalla suuri kiitos jokaisesta vastauksesta, joka sai minut oppimaan jotain uutta.

Vastaa

/// , 19 tavua (ei kilpaileva)

/67/7//76/7//789/7/ 

Et voi itse antaa syötettä tällä kielellä, joten oletettu syöte menee koodin oikealle puolelle.

Kommentit

  • Huomaa, että Itflabtijtslwi on vinoviiva, mutta syötteellä.
  • @FryAmTheEggman Vaikka tämä syöttää merkkejä , ei merkkijonoja .
  • Linkiltäsi puuttuu yksi kauttaviiva.

Vastaa

PHP 51 merkkiä

while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;} 

Pitkään käsin kirjoitettu testitapaus

$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7; 

Tämä merkkijonojen vertailu ja merkkijono korvaavat molemmat while-ehdossa. Jos ehto täyttyy, se päivittää vertailun vasemman käden tulokseen. Kerro minulle kaikista parannuksista.

Vastaa

Jolf , 15 tavua

Kokeile täällä! Täytyykö minun selittää?

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 

Vastaus

Clojure, 71 tavua

Clojure on vähemmän kuin ihanteellinen golfia varten sen monipuolinen luonne – mutta silti se on mielenkiintoinen harjoitus:

Golfed-versio, käyttäen Java interop -toimintoa:

(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x)))) 

Ei-golfoitu versio, käyttämällä Java Interop -toimintoa:

(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x)))) 

Ei golfia ” puhdas Clojure ” -versio:

(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x)))) 

vastaus

Bash, 102 82 67 (+7)? tavua

extglob-versio

 x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v  

Tämä on tarkoitus lisätä tiedostoon ja kutsua esim. bash -O extglob 789.sh 6567678989689789656. (+7)? tavu on tarkoitettu, jos extglob-vaihtoehto lasketaan tavuihin.

Kiitos @BinaryZebra, että osoitit extglob-ominaisuudet!


Muu kuin extglob-versio (82 tavua)

 x=$1 while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done echo $v  

Tämä on tarkoitus lisätä tiedostoon ja kutsua esim. ./789.sh 65678989656.

Se etsii ja korvaa silmukassa parametrilaajennusta. Osallistuin sarjaan laajennuksia korvaamiseksi, koska en tiedä tapaa ketjun laajennusten tehostamiseen.

Kommentit

  • Tervetuloa PPCG!
  • @BinaryZebra Ah, kiitos @() -syntaksista. Tiesin, että niiden yhdistämiseen on oltava tapa. Ja @Mego, kiitos tervetuloa !

Vastaa

Python 3, 46 tavua

 import re lambda s:re.sub(r"6*7(6|89)*","7",s)  

Vastaa

Japt v2.0a0, 12 tavua

e/6?7(6|89/7 

Kokeile verkossa !

Kuinka se toimii

String.e on rekursiivinen korvaustoiminto. Japt 2: lla on uusi regexaksisyntaksi ja automaattinen täydennys regexin sisällä olevista sulkeista, mikä säästää yhden tavun tähän. (Japt 1.x: ssä jouduimme välittämään merkkijonoja regexeiden sijasta, mikä oli melko kömpelö.)

Vastaa

Dyalog APL , 17 tavua

"6*7(6|89)*"⎕R"7" 

"6* mikä tahansa määrä kuusi
7, jota seuraa seitsemän
()*", jota seuraa nolla tai useampia jaksoja…
6|89 kuusi tai kahdeksan yhdeksän

⎕R R eplace että

"7" seitsemän

vastaus

05AB1E , 12 tavua

Δ67‚7:789¬: 

Kokeile verkossa tai vahvista kaikki testitapaukset .

Selitys:

 Δ # 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)  

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *