Hvorfor var 6 bange for 7? Fordi 7 8 9!
Givet en streng, anvend følgende transformationer:
- Hvis der er en 6 ud for en 7, skal du fjerne 6 (6 er bange af 7)
- Hvis sekvensen “789” vises fjern 8 og 9 (7 ate 9)
(Hvis jeg ikke tager fejl, gør det ikke ligegyldigt hvilken rækkefølge du foretager transformationerne i)
Fortsæt med at anvende disse transformationer, indtil du ikke længere kan.
Eksempel:
78966
Først ser vi “789”, så strengen bliver “766”. Så ser vi “76”, så vi tager 6 ud, og strengen bliver “76”. Så ser vi “76” igen, så vi står tilbage med “7”.
Test Cases:
-
987
= >987
(Ikke i den rigtige rækkefølge. Gør intet.) -
6 7
=>6 7
(det hvide rum fungerer som en buffer mellem 6 og 7. Intet sker) -
676
=>7
-
7896789
=>77
-
7689
=>7
-
abcd
=>abcd
Kommentarer
Svar
Svar
Javascript ES6, 29 bytes
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
- Fantastisk, og da 9 er spist, har du kun 2 byte og vinder med dette svar: P
Svar
Java, 126 81 66 58 byte
Tak til @GamrCorps for at levere lambda-versionen af denne kode!
Tak til @ user902383 for at påpege et autoboxing-trick!
. ..yup.
Det er faktisk længere end jeg forventet – Java erstatter elementer i strenge med replaceAll()
en gang pr. kamp, ikke gentagne gange, før det holder op med at ændre. Så jeg var nødt til at bruge en fancy til loop.
Lambda-form:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Funktionsform:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Testbar ikke-golfet 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? Gemmer mindst 15 byte
- @GamrCorps Don ‘ ved ikke hvordan man sætter ord på det – brug aldrig funktioner.
- hvad ‘ er grænsefladen og ikke klasse?
- @eis Interface fjerner behovet for at erklære main som offentligt, hvilket giver den mindste fordel. Se: codegolf.stackexchange.com/a/64713/44713
- @ user902383 Reduktionen du ‘ genoprettelse sker ved at ændre
.equals
til!=
, hvilket gør ikke det samme.==
(eller!=
) sammenlignes med objektets hex-placering, ikke efter værdi. Det ‘ har ellers samme længde.while()
er 7 byte,for(;;)
er 7 byte.
Svar
GNU Sed, 17
Score inkluderer +1 for -r
mulighed.
s/6*7(6|89)*/7/g
Kommentarer
- Fungerer ‘ ikke til
67789
skal returnere77
men i stedet returnerer677
- Du kan bruge
s/67|7(6|89)/7/
i stedet fors/6?7(6|89)/7/
- Gee, jeg undrer mig over, 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
(Bemærk at [6|89]
er non-captur ing version af (6|89)
, som staves som (?:6|89)
i Perl 5.<[6|89]>
er, hvordan du ville skrive, hvad der staves som [6|89]
i Perl 5)
brug:
$ 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 kender ‘ kender ikke Perl 6, men jeg antager dette er en gentagen erstatning. Hvis
6*
og[6|89]*
ikke matcher ‘ noget , hvad forhindrer7
i stedet for7
ad infinitum? - @DigitalTrauma Det bytter
7
med7
starter derefter igen ved næste position og arbejder sig indtil slutningen.:g
er forkortelse for:global
ikkerepeat until it doesn't match anymore
. - @DigitalTrauma For at få
s/67|76|789/7/
til arbejde på Jeg bliver nødt til at skrive det som noget med virkningen af:while s/67|76|789/7/ {}
hvilket naturligvis aldrig ville stoppe, hvis du skrev det somwhile s/6*7[6|89]*/7/ {}
som du kunne forvente. Enden på den foregående kommentar kan også komme til at være uklar, dvs. ikke , hvordan den blev bestemt - Skal ‘ t
[]
ændres til()
? Du vil ikke ‘ ikke matche rør eller79999
. - @jwodder Nej
[]
er Perl 6-versionen, der ikke er fanget af()
, hvad du tænker på staves som<[6|89]>
i Perl 6 .
Svar
Pyth, 17 byte
u:G"67|76|789"\7z
Leaky Nun har overgolfet dette af en byte i kommentarerne.
Kommentarer
Svar
Perl 5 , 17 byte
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
brug:
$ 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 bytes
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 klarere end forklaringskoden .. 🙂
- @Rob Haven ‘ t lavede mange forklaringer før og gik efter en systematisk tilgang.
- Jeg driller bare, kammerat 🙂
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åbløst lang som normalt 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
- I det mindste er ‘ ikke Java
Svar
Emacs Lisp, 59 byte
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
Det bliver lidt klarere med mellemrum:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Svar
Ruby, 27 bytes
Denne løsning er fra kommentarer, tak til Brad Gilbert b2gills .
->s{s.gsub /6*7(6|89)*/,?7}
Ruby, 37 bytes
(gammel løsning)
Denne løsning bruger det faktum, at du aldrig behøver at erstatte flere gange end tegn i strengen.
->s{s.chars{s.sub! /67|76|789/,?7};s}
Kommentarer
- Du kan bruge
chars
i stedet forsize.times
for at gemme et par bytes. - Har ikke ‘ t Ruby det globale flag til regex-erstatning, eller ville det tage flere bytes at aktivere?
- @ BradGilbertb2gills , i Ruby er som i Awk: der er separate
sub()
oggsub()
-metoder, der først skal erstattes. Så global er kun et tegn længere. - @manatwork Så ville jeg skrive dette sådan:
->s{s.gsub /6*7(6|89)*/,'7'}
, og ladgsub
gør alt loopingsarbejdet. - Hvis jeg forstår reglerne for kommandolinjeflag korrekt, kan du gemme 16 byte ved at bruge -p kommandolinjeflagget (+1), hvilket gør det til
gsub /6*7(6|89)*/,?7
med brugruby -pe "gsub /6*7(6|89)*/,?7"
i alt 20 + 1 byte
Svar
Svar
PowerShell, 27 bytes
$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
Brug af:
- en andens regex-mønster
- som
-replace
erstatter en global som standard i PowerShell - loop-rulling, hvor den anvender
-regex
-operatøren til arrayet$args
ved at anvende det på alle elementerne individuelt, og der er kun et element her, fordi der kun er én scriptparameter, så det fungerer OK, og vi kan undgå at have til indekselement[0]
.
Nyhed, tidligere forsøg inden realisering af en global erstatning ville gøre det; 74 bytes ved at opbygge en kæde af “-placering -placering -placering” ved hjælp af strengmultiplikation, så mange gange som længden af strengen, evaluer () ing den:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(Med en smule strengerstatning for at forkorte antallet af erstatninger).
Svar
MATL , 17 byte
jt""789|76"55cYX]
Eksempel
>> matl > jt""789|76"55cYX] > > 7896789 77
REDIGER : 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 at anvende en regelmæssig erstatningsudskiftning for så mange gange som der er tegn i den originale streng . Dette er nok, da hver udskiftning reducerer antallet af tegn.
Svar
Seriøst, 29 byte
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
Tager input som en dobbeltciteret streng som "6789"
. Prøv det online (du skal citere input 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, tager $ a streng og erstattes via udtrykket.
Kommentarer
- FÅ parametre kan ikke accepteres som en inputmetode i PHP . Du skal enten gøre dette til en funktion og videregive input som funktionsparametre eller få input fra
$argv
eller STDIN. - @ Mego Der ser ud til at være ingen konsensus om det indlæg, du linkede til.
- @immibis Korrekt. Der kræves enighed for at gøre en I / O-metode acceptabel. Manglen på en betyder, at det ikke er acceptabelt.
- TL; DR, du har alvorlige ulemper, hvis du bruger PHP til codegolf.
Svar
Thue , 26 byte
67::=7 76::=7 789::=7 ::=
inklusive en efterfølgende ny linje.
Input tilføjes til programmet, før det startes.
Output læses af programtilstanden, når det afsluttes på samme måde som en Turing-maskine.
(Thue har en outputstrøm, men det er svært at bruge korrekt, så jeg er ikke sikker på, om dette er en acceptabel outputmetode)
Kommentarer
- Jeg tror ikke ‘ det tror jeg ikke. Hvis du har en måde at STDOUT på, skal du. Undskyld!
- Ja, dette er tilladt ifølge meta-indlægget.
Svar
CJam, 70 64 byte
Tak til @Peter Taylor for at skære {"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 ved dette kunne sandsynligvis golfes meget længere, og din hjælp ville blive meget værdsat, men ærligt talt er jeg bare glad for, at jeg formåede at få svaret. Dette var mit første forsøg på at 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 forsøgte dette spørgsmål mig selv, så jeg ‘ er ikke sikker på, om dette er den bedste tilgang, men hvis du vil splitte og deltage, så kig på
/
og*
. Bemærk også, at tænkning i form af stakke, når du ‘ er vant til C-lignende sprog tager s nogle tilpasning. For eksempel.{"789":I}{"76":I}?
kan trække opgaven ud til at blive"789""76"?:I
, som yderligere kan golfes til78976`3/?:I
. - Tak! Jeg kunne ikke ‘ ikke helt forstå, hvordan du bruger dit andet forslag dog.
- Undskyld, min fejltagelse.
78976`3/
giver en matrix["789" "76"]
; i stedet for at bruge?
skal du bruge=
til at indeksere; men det ‘ er bag-til-front, så det ville have brug for at indekset skulle vendes og miste fordelen.
Svar
R, 35 byte
cat(gsub("6*7(6|89)*",7,scan(,"")))
Jeg vidste ikke, at jeg kunne bruge gsub
denne måde, en stor tak for hvert svar her, der fik mig til at lære noget nyt.
Svar
/// , 19 bytes (ikke-konkurrerende)
/67/7//76/7//789/7/
Du kan faktisk ikke levere input på dette sprog, så den formodede input går til højre for koden.
Kommentarer
- Bemærk at Itflabtijtslwi er skråstreg, men med input.
- @FryAmTheEggman Selvom den ene indtaster tegn , ikke strenge .
- Dit link synes at mangle et skråstreg.
Svar
PHP 51 tegn
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
Test sag skrevet i lang hånd
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
Dette gør strengesammenligningen, og strengen erstatter begge i mens-tilstanden. Hvis en betingelse er opfyldt, opdateres den venstre hånd af sammenligningen med resultatet. Lad mig vide om eventuelle forbedringer.
Svar
Jolf , 15 byte
Prøv det her! Skal 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 end ideel til golf på grund af sin detaljeret natur – men ikke desto mindre er det en interessant øvelse:
Golfversion, ved hjælp af Java-interop:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
Ikke-golfversion, ved hjælp af Java-interop:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
Un-golfed ” ren Clojure ” version:
(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)? bytes
extglob version
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
Dette er beregnet til at blive sat i en fil og kaldes med f.eks. bash -O extglob 789.sh 6567678989689789656
. Den (+7)? bytes er til, hvis indstillingen extglob tæller med byte.
Tak til @BinaryZebra for at påpege extglob-funktioner!
Ikke-extglob-version (82 bytes)
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 beregnet til at blive sat i en fil og kaldes med f.eks. ./789.sh 65678989656
.
Det gør brug af parameterudvidelse til at søge og erstatte i en sløjfe. Jeg involverede en række udvidelser for at udskifte dem, da jeg ikke er opmærksom på en måde til mere effektiv kædeudvidelser.
Kommentarer
- Velkommen til PPCG!
- @BinaryZebra Ah, tak for
@()
syntaksen. Jeg vidste, at der måtte være en måde at kombinere dem på. Og @Mego, tak 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
Sådan fungerer det
String.e
er rekursiv udskiftningsfunktion. Japt 2 har en ny regex-syntaks og automatisk færdiggørelse af parenteser inde i regex, hvilket gemmer en byte her. (I Japt 1.x var vi nødt til at sende strenge i stedet for regexes, hvilket var lidt klodset.)
Svar
Dyalog APL , 17 byte
"6*7(6|89)*"⎕R"7"
"6*
et hvilket som helst antal seksere
7
efterfulgt af en syv
(
… )*"
efterfulgt af nul eller flere sekvenser af…
6|89
en seks eller otte-ni
⎕R
R placer det med
"7"
en syv
Svar
05AB1E , 12 byte
Δ67‚7:789¬:
Prøv det online eller verificer alle testsager .
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