De ce 6 se temea de 7?

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

  • De ce Vista se temea de 7? Pentru că 7 8 10.
  • Un alt caz de test 68978966897896 = > 68977
  • @ThomasKwa Oh, am înțeles: Microsoft a omis Windows 9 pentru că mergeau împreună cu enigma. 😉
  • De ce frica de șapte era cinci? Pentru că șase șapte opt. –Yoda
  • Șase se temeau de șapte, deoarece șapte aveau ochi reci și morți.

Răspuns

Retina , 12

Traducerea răspunsului sed :

6*7(6|89)* 7 

Încercați online

Comentarii

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ă returneze 77, dar în schimb returnează 677
  • Puteți utiliza s/67|7(6|89)/7/ în loc de s/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 ca 7 să fie înlocuit cu 7 ad infinitum?
  • @DigitalTrauma Se schimbă 7 cu 7 apoi începe din nou la următoarea poziție, lucrându-și drumul până la sfârșit. :g este scurt pentru :global nu repeat 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 ca while 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 sau 79999.
  • @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 

Încercați aici.

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 de size.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() și gsub() 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ți gsub 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 utilizare ruby -pe "gsub /6*7(6|89)*/,?7" pentru un total de 20 + 1 octeți

Răspuns

Japt , 15 octeți

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

Soluție simplă RegEx

Încercați online

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

Încercați online !

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)  

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *