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
Svar
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 returnere77
men i stedet returnerer677
- Du kan bruke
s/67|7(6|89)/7/
i stedet fors/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 at7
erstattes av7
ad infinitum? - @DigitalTrauma Det bytter
7
med7
starter deretter på nytt ved neste posisjon og jobber seg til slutten.:g
er forkortelse for:global
ikkerepeat 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 somwhile 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 eller79999
. - @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
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 forsize.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()
oggsub()
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 lagsub
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 brukruby -pe "gsub /6*7(6|89)*/,?7"
for totalt 20 + 1 byte
Svar
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 til78976`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
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)
68978966897896
= >68977