Hvorfor var 6 bange for 7?

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

  • Hvorfor var Vista bange for 7? Fordi 7 8 10.
  • En anden testtilfælde 68978966897896 = > 68977
  • @ThomasKwa Åh, jeg forstår det: Microsoft sprang Windows 9 over, fordi de fulgte med gåden. 😉
  • Hvorfor bange for syv var fem? Fordi seks syv otte. –Yoda
  • Six var bange syv, fordi syv havde kolde, døde øjne.

Svar

Retina , 12

Oversættelse af det sed svar :

6*7(6|89)* 7 

Prøv det online

Kommentarer

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 returnere 77 men i stedet returnerer 677
  • Du kan bruge s/67|7(6|89)/7/ i stedet for s/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 forhindrer 7 i stedet for 7 ad infinitum?
  • @DigitalTrauma Det bytter 7 med 7 starter derefter igen ved næste position og arbejder sig indtil slutningen. :g er forkortelse for :global ikke repeat 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 som while 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 eller 79999.
  • @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 

Prøv det her.

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 for size.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() og gsub() -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 lad gsub 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 brug ruby -pe "gsub /6*7(6|89)*/,?7" i alt 20 + 1 byte

Svar

Japt , 15 byte

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

Enkel RegEx-løsning

Prøv det online

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

Prøv det online !

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)  

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *