Hvorfor var 6 redd for 7?

Hvorfor var 6 redd for 7? Fordi 7 8 9!

Gitt en streng, bruk følgende transformasjoner:

  • Hvis det er en 6 ved siden av en 7, fjern 6 (6 er redd av 7)
  • Hvis sekvensen «789» vises, fjern 8 og 9 (7 ate 9)

(Hvis jeg ikke tar feil, gjør det ikke uansett hvilken rekkefølge du gjør transformasjonene i)

Fortsett å bruke disse transformasjonene til du ikke lenger kan.

Eksempel:

78966

Først ser vi «789», så strengen blir «766». Så ser vi «76», så vi tar ut 6, og strengen blir «76». Så ser vi «76» igjen, så vi sitter igjen med «7».

Test Cases:

  • 987 = > 987 (Ikke i riktig rekkefølge. Gjør ingenting.)
  • 6 7 => 6 7 (det hvite rommet fungerer som en buffer mellom 6 og 7. Ingenting skjer)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd

Kommentarer

  • Hvorfor var Vista redd for 7? Fordi 7 8 10.
  • Nok en testtilfelle 68978966897896 = > 68977
  • @ThomasKwa Å, jeg skjønner det: Microsoft hoppet over Windows 9 fordi de gikk sammen med gåten. 😉
  • Hvorfor redd for syv var fem? Fordi seks syv åtte. –Yoda
  • Six var redd syv fordi syv hadde kalde, døde øyne.

Svar

Retina , 12

Oversettelse av sed-svaret :

6*7(6|89)* 7 

Prøv det online

Kommentarer

Svar

Javascript ES6, 29 byte

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

Kommentarer

  • Flott, og siden 9 er spist, har du bare 2 byte og vinner med dette svaret: P

Svar

Java, 126 81 66 58 byte

Takk til @GamrCorps for at du har gitt lambdaversjonen av denne koden!

Takk til @ user902383 for at du påpekte et autoboxing-triks! ..yup.

Det er faktisk lenger enn jeg forventet – Java erstatter elementer i strenger med replaceAll() en gang per kamp, ikke gjentatte ganger før den slutter å endre seg. Så jeg måtte bruke en fancy for loop.

Lambda-form:

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

Funksjonsform:

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

Testbar ikke-kodet kode:

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

Kommentarer

  • Hvorfor ikke gå med en lambda? Sparer minst 15 byte
  • @GamrCorps Don ‘ vet ikke hvordan man skal uttrykke det – bruk aldri funksjoner.
  • hva ‘ er grensesnittet og ikke klasse?
  • @eis Interface fjerner behovet for å erklære main som offentlig, noe som gir den minste fordel. Se: codegolf.stackexchange.com/a/64713/44713
  • @ user902383 Reduksjonen du ‘ å lage er ved å endre .equals til !=, som ikke gjør det samme. == (eller !=) sammenlignes med objektets sekskantede plassering, ikke etter verdi. Det ‘ har ellers samme lengde. while() er 7 byte, for(;;) er 7 byte.

Svar

GNU Sed, 17

Score inkluderer +1 for -r alternativ.

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

Kommentarer

  • Fungerer ‘ ikke for 67789 skal returnere 77 men i stedet returnerer 677
  • Du kan bruke s/67|7(6|89)/7/ i stedet for s/6?7(6|89)/7/
  • Gee, jeg lurer på hvor Larry kom på ideen om s///g?

Svar

Perl 6 , 19 18 byte

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

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

(Vær oppmerksom på at [6|89] er ikke-captur ing versjon av (6|89) som er stavet som (?:6|89) i Perl 5.<[6|89]> er hvordan du skriver hva som er stavet som [6|89] i Perl 5)

bruk:

 $ 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  

Kommentarer

  • Jeg vet ikke ‘ vet ikke Perl 6, men jeg antar dette er en gjentatt erstatning. Hvis 6* og [6|89]* ikke ‘ t samsvarer med noe , hva hindrer at 7 erstattes av 7 ad infinitum?
  • @DigitalTrauma Det bytter 7 med 7 starter deretter på nytt ved neste posisjon og jobber seg til slutten. :g er forkortelse for :global ikke repeat until it doesn't match anymore.
  • @DigitalTrauma For å få s/67|76|789/7/ til arbeid på Jeg må skrive det som noe med effekten av: while s/67|76|789/7/ {} som selvfølgelig aldri ville stoppet hvis du skrev det som while s/6*7[6|89]*/7/ {} som du forventer. Slutten på forrige kommentar kan også komme til å være middelmådig, det vil si ikke hvordan den ble ment
  • Skal ‘ t [] endres til ()? Du vil ikke ‘ ikke matche rør eller 79999.
  • @jwodder Nei [] er den ikke-fangende versjonen av (), Perl 6, det du tenker på er stavet som <[6|89]> i Perl 6 .

Svar

Pyth, 17 byte

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

Prøv det her.

Leaky Nun har outgolfed dette av en byte i kommentarene.

Kommentarer

Svar

Perl 5 , 17 byte

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

bruk:

 $ 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  

Svar

Mathematica, 52 byte

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

Forklaring:

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

Kommentarer

  • Golfkoden er tydeligere enn forklaringskoden .. 🙂
  • @Rob Haven ‘ t gjorde mange forklaringer før, og gikk for en systematisk tilnærming.
  • Jeg bare ertet, kompis 🙂

Svar

Rust, 96 byte

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

Håpløst lang, som vanlig for 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 }  

Kommentarer

  • Det er i det minste ‘ ikke Java

Svar

Emacs Lisp, 59 byte

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

Det blir litt tydeligere med mellomrom:

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

Svar

Ruby, 27 byte

Denne løsningen er fra kommentarer, kreditt til Brad Gilbert b2gills .

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

Ruby, 37 byte

(gammel løsning)

Denne løsningen bruker det faktum at du aldri trenger å erstatte flere ganger enn tegn i strengen.

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

Kommentarer

  • Du kan bruke chars i stedet for size.times for å spare noen få byte.
  • Har ikke ‘ t Ruby det globale flagget for regex-erstatning, eller vil det ta flere byte å aktivere?
  • @ BradGilbertb2gills , i Ruby er som i Awk: det er separate sub() og gsub() metoder for å erstatte først eller alle. Så global er bare ett tegn lenger.
  • @manatwork Så vil jeg skrive dette slik: ->s{s.gsub /6*7(6|89)*/,'7'}, og la gsub gjør alt loopingsarbeidet.
  • Hvis jeg forstår reglene for kommandolinjeflagg riktig, kan du lagre 16 byte ved å bruke -p kommandolinjeflagget (+1) slik at det blir gsub /6*7(6|89)*/,?7 med bruk ruby -pe "gsub /6*7(6|89)*/,?7" for totalt 20 + 1 byte

Svar

Japt , 15 byte

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

Enkel RegEx-løsning

Prøv det online

Svar

PowerShell, 27 byte

$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 

Bruk av:

  • noen andres regex-mønster
  • slik -replace erstatter en global som standard i PowerShell
  • loop-rulling, hvor den vil bruke -regex operatøren $args ved å bruke den på alle elementene hver for seg, og det er bare ett element her fordi det bare er en skriptparameter, så det fungerer OK, og vi kan unngå å ha til indekselement [0].

Nyhet forrige forsøk før du realiserte en global erstatning ville gjøre det; 74 byte med å bygge en kjede av «-replace -replace -replace» ved å bruke strengmultiplikasjon, så mange ganger som lengden på strengen, og eval () ing den:

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

(Med litt strengerstatning for å forkorte antall erstatninger).

Svar

MATL , 17 byte

jt""789|76"55cYX] 

Eksempel

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

EDIT : Prøv det online!

Forklaring

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 

Dette fungerer ved å bruke en vanlig erstatning for uttrykk for så mange ganger som det er tegn i den opprinnelige strengen . Dette er nok, siden hver erstatning reduserer antall tegn.

Svar

Seriøst, 29 byte

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

Tar input som en dobbel sitert streng, som "6789". Prøv det online (du må sitere inndataene manuelt).

Forklaring:

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

Svar

PHP, 36 byte

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

regex-løsning, tar $ a streng og erstattes via uttrykket.

Kommentarer

  • FÅ parametere er ikke akseptabelt som inndatametode i PHP . Du må enten gjøre dette til en funksjon og sende inngangen som funksjonsparametere, eller få innspill fra $argv eller STDIN.
  • @ Mego Det ser ut til at det ikke er noe konsensus om innlegget du lenket til.
  • @immibis Riktig. Det kreves enighet for å gjøre en I / O-metode akseptabel. Mangelen på en betyr at det ikke er akseptabelt.
  • TL; DR du har alvorlige ulemper hvis du bruker PHP for codegolf.

Svar

Thue , 26 byte

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

inkludert en etterfølgende ny linje.

Inndata legges til programmet før du starter det.
Utdata avleses av programtilstanden når det avsluttes, på samme måte som en Turing-maskin.
(Thue har en utgangsstrøm, men det er vanskelig å bruke riktig, så jeg er ikke sikker på om dette er en akseptabel utgangsmetode)

Kommentarer

  • Jeg tror ikke ‘ det. Hvis du har en måte å STDOUT på, må du. Beklager!
  • Ja, dette er tillatt i henhold til metaposten.

Svar

CJam, 70 64 byte

Takk til @Peter Taylor for å kutte {"789":I}{"76:":I}? til "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

Jeg vet dette kunne sannsynligvis bli golfet mye lenger, og din hjelp ville bli satt stor pris på, men ærlig talt er jeg bare glad for at jeg klarte å få svaret. Dette var mitt første forsøk på å skrive CJam.

Forklaring:

"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 

Kommentarer

  • Jeg har ikke ‘ t prøvd dette spørsmålet meg selv, så jeg ‘ er ikke sikker på om dette er den beste tilnærmingen, men hvis du vil splitte og bli med, ta en titt på / og *. Vær også oppmerksom på at det å tenke i form av stabler når du ‘ er vant til C-lignende språk s litt tilpasning. F.eks. {"789":I}{"76":I}? kan trekke ut oppgaven for å bli "789""76"?:I, som kan videre golfes til 78976`3/?:I .
  • Takk! Jeg kunne ikke ‘ ikke helt forstå hvordan du kan bruke det andre forslaget ditt.
  • Beklager, min feil.78976`3/ gir en matrise ["789" "76"]; i stedet for å bruke ?, må du bruke = for å indeksere; men det ‘ er bak-til-front, så det vil trenge at indeksen blir invertert og mister fordelen.

Svar

R, 35 byte

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

Jeg visste ikke at jeg kunne bruke gsub på denne måten, en stor takk for hvert svar her som fikk meg til å lære noe nytt.

Svar

/// , 19 byte (ikke-konkurrerende)

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

Du kan faktisk ikke gi input på dette språket, så den antatte inndata går til høyre for koden.

Kommentarer

  • Merk at Itflabtijtslwi er skråstrek, men med innspill.
  • @FryAmTheEggman Selv om den ene skriver inn tegn , ikke strenger .
  • Linken din mangler en skråstrek.

Svar

51 tegn i PHP

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

Test case skrevet i lang hånd

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

Dette gjør strengsammenligningen og strengen erstatter begge i mens-tilstanden. Hvis en betingelse er oppfylt, oppdaterer den venstre hånd av sammenligningen med resultatet. Gi meg beskjed om eventuelle forbedringer.

Svar

Jolf , 15 byte

Prøv det her! Må jeg virkelig forklare?

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 

Svar

Clojure, 71 byte

Clojure er mindre enn ideelt for golf på grunn av detaljert natur – men likevel er det en interessant øvelse:

Golfed versjon, ved hjelp av Java interop:

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

Un-golfed version, ved hjelp av Java interop:

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

Un-golfed » pure Clojure » versjon:

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

Svar

Bash, 102 82 67 (+7)? byte

extglob-versjon

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

Dette er ment å legges i en fil og kalles med f.eks. bash -O extglob 789.sh 6567678989689789656. (+7)? byte er for hvis extglob-alternativet teller mot byte.

Takk til @BinaryZebra for å påpeke extglob-funksjoner!


Ikke-extglob-versjon (82 byte)

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

Dette er ment å legges i en fil og kalles med f.eks. ./789.sh 65678989656.

Den bruker parameterutvidelse for å søke og erstatte i en løkke. Jeg involverte en rekke utvidelser for å erstatte siden jeg ikke er klar over en måte å effektivisere kjedeutvidelser på.

Kommentarer

  • Velkommen til PPCG!
  • @BinaryZebra Ah, takk for @() syntaksen. Jeg visste at det måtte være en måte å kombinere disse på. Og @ Mego, takk for velkommen !

Svar

Python 3, 46 byte

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

Svar

Japt v2.0a0, 12 byte

e/6?7(6|89/7 

Prøv det online !

Slik fungerer det

String.e er rekursiv erstatningsfunksjon. Japt 2 har en ny regex-syntaks og automatisk fullføring av parentes inne i regex, som sparer en byte her. (I Japt 1.x måtte vi passere strenger i stedet for regexes, som var ganske klumpete.)

Svar

Dyalog APL , 17 byte

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

"6* et hvilket som helst antall seksere
7 etterfulgt av en syv
()*" etterfulgt av null eller flere sekvenser av…
6|89 en seks eller åtte ni

⎕R R plasser det med

"7" en syv

Svar

05AB1E , 12 byte

Δ67‚7:789¬: 

Prøv det online eller bekreft alle testtilfeller .

Forklaring:

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *