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
Vastaus
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 palauttaa77
, mutta se palauttaa sen sijaan677
- 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 korvaamisen7
ad infinitumilla? - @DigitalTrauma Se vaihtaa
7
ja7
alkaa sitten uudelleen seuraavasta kohdasta ja työskentelee tiensä loppuun asti.:g
on lyhyt:global
eirepeat 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 tai79999
. - @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
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()
– jagsub()
-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 annangsub
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
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 golfata78976`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
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)
68978966897896
= >68977