De ce 6 i-a fost frică de 7? Deoarece 7 8 9!
Având în vedere un șir, aplicați următoarele transformări:
- Dacă există un 6 lângă un 7 eliminați 6 (6 se teme din 7)
- Dacă apare secvența „789” eliminați 8 și 9 (7 mâncați 9)
(Dacă „nu mă înșel nu este” indiferent în ce ordine faceți transformările)
Continuați să aplicați aceste transformări până când nu mai puteți.
Exemplu:
78966
Mai întâi vedem „789”, deci șirul devine „766”. Apoi vedem „76”, deci scoatem 6, iar șirul devine „76”. Apoi vom vedea din nou „76”, așa că rămânem cu „7”.
Cazuri de testare:
-
987
= >987
(Nu în ordinea corectă. Nu face nimic.) -
6 7
=>6 7
(Spațiul alb acționează ca un tampon între 6 și 7. Nu se întâmplă nimic) -
676
=>7
-
7896789
=>77
-
7689
=>7
-
abcd
=>abcd
Comentarii
Răspuns
Răspunde
Javascript ES6, 29 octeți
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])
Comentarii
- Super, și din moment ce se mănâncă 9, aveți doar 2 octeți și câștigați cu acest răspuns: P
Răspuns
Java, 126 81 66 58 octeți
Mulțumim lui @GamrCorps pentru că ați furnizat versiunea lambda a acestui cod!
Vă mulțumim lui @ user902383 pentru că ați arătat un truc autoboxing!
. ..da.
De fapt, este mai lung decât mine așteptat – Java înlocuiește elementele din șiruri cu replaceAll()
o dată pe meci, nu în mod repetat până când nu se mai modifică. Așa că a trebuit să folosesc o fantezie pentru buclă.
Forma Lambda:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Forma funcției:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Cod ungolfabil testabil:
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;} }
Comentarii
- De ce să nu mergi cu o lambda? Va economisi cel puțin 15 octeți
- @GamrCorps Nu ‘ nu știi cum să formulezi asta – să nu folosești niciodată funcții.
- ce ‘ este punctul de interfață și nu clasa?
- Interfața @eis elimină necesitatea de a declara principal ca public, ceea ce oferă cel mai mic avantaj. Vedeți: codegolf.stackexchange.com/a/64713/44713
- @ user902383 Reducerea ‘ re se face prin schimbarea
.equals
în!=
, care nu face același lucru.==
(sau!=
) compară după locația hexagonală a obiectului, nu după valoare. ‘ are aceeași lungime în caz contrar.while()
are 7 octeți,for(;;)
este de 7 octeți.
Răspuns
GNU Sed, 17
Scorul include +1 pentru opțiunea -r
.
s/6*7(6|89)*/7/g
Comentarii
- Nu ‘ funcționează pentru
67789
ar trebui să returneze77
, dar în schimb returnează677
- Puteți utiliza
s/67|7(6|89)/7/
în loc des/6?7(6|89)/7/
- Gee, mă întreb de unde Larry a venit cu ideea de
s///g
?
Răspuns
Perl 6 , 19 18 octeți
{S:g/6*7[6|89]*/7/} # 19 bytes
$ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes
(Rețineți că [6|89]
este non-captur versiunea (6|89)
care este scris ca (?:6|89)
în Perl 5.<[6|89]>
este modul în care ați scrie ceea ce este scris în [6|89]
în Perl 5)
utilizare:
$ 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
Comentarii
- Nu ‘ nu cunosc Perl 6, dar presupun aceasta este o înlocuire repetată. Dacă
6*
și[6|89]*
nu ‘ t se potrivesc cu ceva , ce oprește ca7
să fie înlocuit cu7
ad infinitum? - @DigitalTrauma Se schimbă
7
cu7
apoi începe din nou la următoarea poziție, lucrându-și drumul până la sfârșit.:g
este scurt pentru:global
nurepeat until it doesn't match anymore
. - @DigitalTrauma Pentru a obține
s/67|76|789/7/
la lucrați la Ar trebui să-l scriu ca ceva în sensul:while s/67|76|789/7/ {}
care, desigur, nu s-ar opri niciodată dacă l-ați scrie cawhile s/6*7[6|89]*/7/ {}
așa cum v-ați aștepta. De asemenea, sfârșitul comentariului anterior se poate dovedi a fi spiritul mediu, adică nu modul în care a fost intitulat - Nu ar trebui ‘ t
[]
poate fi schimbat în()
? Nu ‘ nu doriți să se potrivească țevilor sau79999
. - @jwodder Nu
[]
este versiunea Perl 6 care nu capturează()
, ceea ce vă gândiți este scris ca<[6|89]>
în Perl 6 .
Răspuns
Pyth, 17 octeți
u:G"67|76|789"\7z
Leaky Nun a depășit acest lucru cu un octet în comentarii.
Comentarii
Răspuns
Perl 5 , 17 octeți
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
utilizare:
$ 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
Răspuns
Mathematica, 52 bytes
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&
Explicație:
& 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.
Comentarii
- Codul de golf este mai clar decât codul de explicație .. 🙂
- @Rob Haven nu a făcut multe explicații înainte, alegând o abordare sistematică.
- Tocmai, prietene 🙂
Răspuns
Rugină, 96 octeți
fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}
Speranță de lungă, ca de obicei pentru Rust …
Ungolfed:
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 }
Comentarii
- Cel puțin ‘ nu este Java
Răspuns
Emacs Lisp, 59 octeți
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
Devine puțin mai clar cu spații:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Răspuns
Ruby, 27 octeți
Această soluție este de la comentarii, credit la Brad Gilbert b2gills .
->s{s.gsub /6*7(6|89)*/,?7}
Ruby, 37 octeți
(soluție veche)
Această soluție folosește faptul că nu va trebui niciodată să înlocuiți mai multe ori decât caracterele din șir.
->s{s.chars{s.sub! /67|76|789/,?7};s}
Comentarii
- Puteți utiliza
chars
în loc desize.times
pentru a salva câteva octeți. - Nu ‘ t Ruby are steagul global pentru substituirea regexului, sau ar fi nevoie de mai mulți octeți pentru a activa?
- @ BradGilbertb2gills , în Ruby este ca în Awk: există
sub()
șigsub()
metode separate pentru a înlocui primul sau toate. Deci, globalul este cu doar un caracter mai lung. - @manatwork Apoi aș scrie acest lucru de genul:
->s{s.gsub /6*7(6|89)*/,'7'}
și lăsațigsub
face toate lucrările de looping. - Dacă înțeleg corect regulile steagurilor liniei de comandă, puteți salva 16 octeți utilizând steagul liniei de comandă -p (+1) făcându-l
gsub /6*7(6|89)*/,?7
cu utilizareruby -pe "gsub /6*7(6|89)*/,?7"
pentru un total de 20 + 1 octeți
Răspuns
Răspundeți
PowerShell, 27 octeți
$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
Utilizarea:
- modelului regex al altcuiva
- modul
-replace
înlocuiește global în mod implicit în PowerShell - derularea buclei, unde va aplica operatorul
-regex
matricei$args
aplicându-l la toate elementele în mod individual și există un singur element aici, deoarece există un singur parametru de script, deci funcționează OK și putem evita să avem pentru a indexa elementul[0]
.
Încercarea anterioară de noutate înainte de a realiza o înlocuire globală ar face-o; 74 de octeți de construire a unui lanț de „-replace -replace -replace” folosind multiplicarea șirului, de câte ori este lungimea șirului, apoi evaluându-l:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(Cu un pic de substituție de șir pentru a scurta numărul de înlocuiri).
Răspuns
MATL , 17 octeți
jt""789|76"55cYX]
Exemplu
>> matl > jt""789|76"55cYX] > > 7896789 77
EDIT : Încercați online!
Explicație
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
Acest lucru funcționează aplicând o înlocuire regulată a expresiei pentru de câte ori există caractere în șirul original . Acest lucru este suficient, deoarece fiecare substituție reduce numărul de caractere.
Răspuns
Serios, 29 octeți
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
Preține intrarea ca un șir de ghilimele duble, cum ar fi "6789"
. Încercați-l online (va trebui să citați manual intrarea).
Explicație:
,;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"
Răspuns
PHP, 36 octeți
preg_replace("/6*7(6|89)*/","7",$a);
soluție regex, ia $ un șir și îl înlocuiește prin expresie.
Comentarii
- GET parametrii nu sunt acceptabili ca metodă de introducere în PHP . Va trebui fie să faceți din aceasta o funcție și să transmiteți intrarea ca parametri de funcție, fie să obțineți intrare de la
$argv
sau STDIN. - @Mego Se pare că nu există consens cu privire la postarea la care v-ați conectat.
- @immibis Corect. Este necesar un consens pentru a face acceptabilă o metodă I / O. Lipsa unuia înseamnă că nu este acceptabilă.
- TL; DR aveți dezavantaje grave dacă utilizați PHP pentru codegolf.
Răspuns
Joi , 26 octeți
67::=7 76::=7 789::=7 ::=
inclusiv o linie nouă finală.
Intrarea este adăugată la program înainte de al porni.
Ieșirea este citită de la starea programului când se termină, în mod similar cu o mașină Turing. are un flux de ieșire, dar este dificil de utilizat corect, așa că nu sunt sigur dacă aceasta este o metodă de ieșire acceptabilă)
Comentarii
- Nu ‘ nu cred. Dacă aveți o modalitate de STDOUT, trebuie. Ne pare rău!
- Da, acest lucru este permis conform meta postării.
Răspuns
CJam, 70 64 bytes
Mulțumim lui @Peter Taylor pentru că a tăiat {"789":I}{"76:":I}?
la "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
Știu asta probabil ar putea fi jucat mult mai mult și ajutorul tău ar fi foarte apreciat, dar sincer sunt „fericit că am reușit să obțin răspunsul. Aceasta a fost prima mea încercare de a scrie CJam.
Explicație:
"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
Comentarii
- Nu am încercat ‘ această întrebare Eu însumi, deci ‘ nu sunt sigur dacă aceasta este cea mai bună abordare, dar dacă doriți să faceți împărțirea și alăturarea, aruncați o privire la
/
și*
. De asemenea, rețineți că gândirea în termeni de stive atunci când ‘ sunteți folosit pentru limbile C-like Este o oarecare adaptare. De exemplu.{"789":I}{"76":I}?
poate extrage misiunea pentru a deveni"789""76"?:I
, care poate fi jucat în continuare la78976`3/?:I
. - Vă mulțumim! Nu am putut ‘ să înțeleg cum să folosesc a doua dvs. sugestie.
- Ne pare rău, greșeala mea.
78976`3/
oferă o matrice["789" "76"]
; atunci, mai degrabă decât să folosiți?
, ar trebui să utilizați=
pentru a indexa; dar ‘ este înapoi în față, deci ar avea nevoie ca indexul să fie inversat, pierzând avantajul.
Răspuns
R, 35 octeți
cat(gsub("6*7(6|89)*",7,scan(,"")))
Nu știam că aș putea folosi gsub
în acest fel, vă mulțumesc pentru fiecare răspuns de aici care m-a făcut să învăț ceva nou.
Răspuns
/// , 19 octeți (neconcurenți)
/67/7//76/7//789/7/
De fapt, nu puteți furniza intrări în această limbă, astfel încât presupusa intrare merge în dreapta codului.
Comentarii
- Rețineți că Itflabtijtslwi este bară, dar cu intrare.
- @FryAmTheEggman Deși acesta introduce caractere , nu șiruri .
- Se pare că lipsește o bară la linkul dvs.
Răspuns
PHP 51 de caractere
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
Caz de test scris cu mână lungă
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
Aceasta face comparația șirului și șirul le înlocuiește pe ambele în condiția while. Dacă în timp ce condiția este îndeplinită, actualizează mâna stângă a comparației cu rezultatul. Anunță-mă despre orice îmbunătățiri.
Răspunde
Jolf , 15 octeți
Încercați aici! Chiar trebuie să explic?
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
Răspuns
Clojure, 71 octeți
Clojure este mai puțin decât ideal pentru golf, datorită natură detaliată – dar totuși este un exercițiu interesant:
Versiune golfed, folosind interop Java:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
Versiune non-golfed, folosind interop Java:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
Un-golfed ” Clojure pur ” versiune:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x))))
Răspuns
Bash, 102 82 67 (+7)? bytes
versiunea extglob
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
Aceasta este menită să fie introdusă într-un fișier și apelată cu de ex. bash -O extglob 789.sh 6567678989689789656
. (+7)? octeți este pentru dacă opțiunea extglob contează pentru octeți.
Vă mulțumim pentru @BinaryZebra pentru că a subliniat caracteristicile extglob!
Versiunea non-extglob (82 octeți)
x=$1 while v=${x/76/7};v=${v/67/7};v=${v/789/7};[ $v != $x ];do x=$v;done echo $v
Aceasta este menită să fie pusă într-un fișier și apelată cu de ex. ./789.sh 65678989656
.
Utilizează extinderea parametrilor pentru a căuta și a înlocui într-o buclă. Am implicat o serie de extinderi pentru a face înlocuirea, deoarece „nu sunt conștient de o modalitate de a lanța extinderi mai eficient.
Comentarii
- Bine ați venit la PPCG!
- @BinaryZebra Ah, mulțumesc pentru sintaxa
@()
. Știam că trebuie să existe o modalitate de a le combina. Și @Mego, mulțumesc pentru bun venit !
Răspuns
Python 3, 46 octeți
import re lambda s:re.sub(r"6*7(6|89)*","7",s)
Răspuns
Japt v2.0a0, 12 octeți
e/6?7(6|89/7
Cum funcționează
String.e
este o funcție recursivă de înlocuire. Japt 2 are o nouă sintaxă regex și completare automată de paranteze în interiorul regexului, care salvează un octet aici. (În Japt 1.x, a trebuit să trecem șiruri în locul regexurilor, care a fost cam neîndemânatic.)
Răspuns
Dyalog APL , 17 octeți
"6*7(6|89)*"⎕R"7"
"6*
orice număr de șase
7
urmat de un șapte
(
… )*"
urmat de zero sau mai multe secvențe de …
6|89
a șase sau opt-nouă
⎕R
R eplace that with
"7"
a seven
Răspuns
05AB1E , 12 octeți
Δ67‚7:789¬:
Încercați-l online sau verificați toate cazurile de testare .
Explicație:
Δ # 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