Varför var 6 rädda för 7?

Varför var 6 rädda för 7? Eftersom 7 8 9!

Givet en sträng tillämpa följande omvandlingar:

  • Om det finns en 6 bredvid en 7 ta bort 6 (6 är rädd av 7)
  • Om sekvensen ”789” dyker upp tar du bort 8 och 9 (7 ate 9)

(Om jag inte tar fel så gör det inte oavsett vilken ordning du gör omvandlingarna i)

Fortsätt att använda dessa omvandlingar tills du inte längre kan.

Exempel:

78966

Först ser vi ”789”, så strängen blir ”766”. Sedan ser vi ”76”, så vi tar ut 6, och strängen blir ”76”. Sedan ser vi ”76” igen, så vi sitter kvar med ”7”.

Testfall:

  • 987 = > 987 (Inte i rätt ordning. Gör ingenting.)
  • 6 7 => 6 7 (det vita utrymmet fungerar som en buffert mellan 6 och 7. Ingenting händer)
  • 676 => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd => abcd

Kommentarer

  • Varför var Vista rädd för 7? Eftersom 7 8 10.
  • Ett annat testfall 68978966897896 = > 68977
  • @ThomasKwa Åh, jag förstår det: Microsoft hoppade över Windows 9 för att de skulle gå med gåten. 😉
  • Varför rädd för sju var fem? För sex sju åtta. –Yoda
  • Six var rädd för sju eftersom sju hade kalla, döda ögon.

Svar

Retina , 12

Översättning av sed-svaret :

6*7(6|89)* 7 

Prova 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

  • Bra, och eftersom 9 är ätit har du bara 2 byte och vinner med det här svaret: P

Svar

Java, 126 81 66 58 byte

Tack till @GamrCorps för att tillhandahålla lambda-versionen av den här koden! ..yup.

Det är faktiskt längre än jag förväntat – Java ersätter objekt i strängar med replaceAll() en gång per match, inte upprepade gånger förrän den slutar ändras. Så jag var tvungen att använda en fancy för 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 icke-golfad kod:

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

  • Varför inte gå med en lambda? Sparar minst 15 byte
  • @GamrCorps Don ’ vet inte hur man fraserar det – använd aldrig funktioner.
  • vad ’ är gränssnittets punkt och inte klass?
  • @eis Interface tar bort behovet av att deklarera main som offentligt, vilket ger minsta fördel. Se: codegolf.stackexchange.com/a/64713/44713
  • @ user902383 Minskningen du ’ att göra är genom att ändra .equals till !=, vilket inte gör samma sak. == (eller !=) jämförs med objektets hex-plats, inte efter värde. Det ’ är annars lika långt. while() är 7 byte, for(;;) är 7 byte.

Svar

GNU Sed, 17

Poäng inkluderar +1 för -r alternativ.

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

Kommentarer

  • Fungerar ’ inte för 67789 ska returnera 77 men det returnerar istället 677
  • Du kan använda s/67|7(6|89)/7/ istället för s/6?7(6|89)/7/
  • Gee, jag undrar var Larry kom på idén att 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  

(Observera att [6|89] är icke-kapten ing version av (6|89) som stavas som (?:6|89) i Perl 5.<[6|89]> är hur du skulle skriva vad som stavas som [6|89] i Perl 5)

användning:

 $ 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

  • Jag känner inte ’ känner inte till Perl 6, men jag antar detta är en upprepad ersättning. Om 6* och [6|89]* don ’ t matchar något , vad hindrar 7 att ersättas med 7 ad infinitum?
  • @DigitalTrauma Det byter ut 7 med 7 startar sedan igen vid nästa position och arbetar fram till slutet. :g är kort för :global inte repeat until it doesn't match anymore.
  • @DigitalTrauma Att få s/67|76|789/7/ till arbeta med Jag måste skriva det som något som påverkar: while s/67|76|789/7/ {} vilket naturligtvis aldrig skulle sluta om du skrev det som while s/6*7[6|89]*/7/ {} som du förväntar dig. Slutet på den föregående kommentaren kan också komma att betecknas som elak, det vill säga inte hur den var avsedd
  • Bör ’ t [] ändras till ()? Du vill ’ inte matcha rör eller 79999.
  • @jwodder Nej [] är Perl 6-versionen som inte fångar av (), det du tänker på stavas som <[6|89]> i Perl 6 .

Svar

Pyth, 17 byte

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

Prova det här.

Läckande nunna har outgolfat detta av en byte i kommentarerna.

Kommentarer

Svar

Perl 5 , 17 byte

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

användning:

 $ 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~#& 

Förklaring:

 & 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 är tydligare än förklaringskoden .. 🙂
  • @Rob Haven ’ t gjorde många förklaringar tidigare och gick för ett systematiskt tillvägagångssätt.
  • Jag retade bara, kompis 🙂

Svara

Rost, 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}  

Hopplöst långt, som vanligt för 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 är åtminstone ’ inte Java

Svar

Emacs Lisp, 59 byte

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

Det blir lite tydligare med mellanslag:

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

Svar

Ruby, 27 byte

Denna lösning är från kommentarer, kredit till Brad Gilbert b2gills .

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

Ruby, 37 byte

(gammal lösning)

Denna lösning använder det faktum att du aldrig behöver byta ut fler gånger än tecken i strängen.

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

Kommentarer

  • Du kan använda chars istället för size.times för att spara några byte.
  • Har inte ’ t Ruby den globala flaggan för regexersättning, eller skulle det krävas fler byte för att aktivera?
  • @ BradGilbertb2gills , i Ruby är som i Awk: det finns separata sub() och gsub() metoder för att ersätta först eller alla. Så global är bara en karaktär längre.
  • @manatwork Då skulle jag skriva detta så här: ->s{s.gsub /6*7(6|89)*/,'7'}, och låt gsub gör allt loopningsarbete.
  • Om jag förstår reglerna för kommandoradsflaggor korrekt kan du spara 16 byte med kommandoradsflaggan (+1) så att den blir gsub /6*7(6|89)*/,?7 med användning ruby -pe "gsub /6*7(6|89)*/,?7" för totalt 20 + 1 byte

Svar

Japt , 15 byte

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

Enkel RegEx-lösning

Prova 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 

Användning av:

  • någon annans regexmönster
  • som -replace ersätter en global som standard i PowerShell
  • looprullning, där den kommer att tillämpa -regex operatören $args genom att använda det på alla element individuellt, och det finns bara ett element här eftersom det bara finns en skriptparameter, så det fungerar OK och vi kan undvika att ha till indexelement [0].

Nyhet tidigare försök innan man inser en global ersättare skulle göra det; 74 byte för att bygga en kedja av ”-replace -replace -replace” med hjälp av strängmultiplikation, så många gånger som strängens längd, eval () ing den:

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

(Med lite strängbyte för att förkorta antalet ersättare).

Svar

MATL , 17 byte

jt""789|76"55cYX] 

Exempel

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

EDIT : Prova online!

Förklaring

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 

Detta fungerar genom att tillämpa en vanlig ersättning för uttryck för så många gånger som det finns tecken i originalsträngen . Detta räcker, eftersom varje substitution minskar antalet tecken.

Svar

Allvarligt, 29 byte

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

Tar inmatning som en dubbelciterad sträng, som "6789". Testa det online (du måste citera ingången manuellt).

Förklaring:

,;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-sträng och ersätts via uttrycket.

Kommentarer

  • GET parametrar är inte acceptabla som inmatningsmetod i PHP . Du måste antingen göra detta till en funktion och skicka inmatningen som funktionsparametrar eller få inmatning från $argv eller STDIN.
  • @ Mego Det verkar inte finnas någon samförstånd om inlägget du länkade till.
  • @immibis Rätt. Enighet krävs för att göra en I / O-metod acceptabel. Bristen på en betyder att det inte är acceptabelt.
  • TL; DR du har allvarliga nackdelar om du använder PHP för codegolf.

Svar

Thue , 26 byte

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

inklusive en efterföljande ny rad.

Ingången läggs till programmet innan du startar det.
Utdata avläses av programtillståndet när det avslutas, på samma sätt som en Turing-maskin.
(Thue har en utgångsström, men det är svårt att använda korrekt, så jag är inte säker på om detta är en acceptabel utgångsmetod)

Kommentarer

  • Jag tycker inte ’. Om du har ett sätt att STDOUT, måste du. Tyvärr!
  • Ja, detta är tillåtet enligt meta-inlägget.

Svar

CJam, 70 64 byte

Tack till @Peter Taylor för att klippa {"789":I}{"76:":I}? till "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

Jag vet det här kunde antagligen spelas mycket längre och din hjälp skulle uppskattas mycket, men uppriktigt sagt är jag bara glad att jag lyckades få svaret. Detta var mitt första försök att skriva CJam.

Förklaring:

"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

  • Jag har inte ’ t försökt denna fråga jag själv, så jag ’ är inte säker på om detta är det bästa tillvägagångssättet, men om du vill dela och gå med, ta en titt på / och *. Observera också att tänka i termer av staplar när du ’ är van vid C-liknande språk tar s lite anpassning. T.ex. {"789":I}{"76":I}? kan dra ut uppdraget för att bli "789""76"?:I, vilket kan spelas vidare till 78976`3/?:I .
  • Tack! Jag kunde inte ’ inte riktigt förstå hur jag använder ditt andra förslag.
  • Ledsen, mitt misstag.78976`3/ ger en matris ["789" "76"]; istället för att använda ? måste du använda = för att indexera; men det ’ är bakåt framåt, så det skulle behöva indexet inverteras och förlora fördelen.

Svara

R, 35 byte

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

Jag visste inte att jag kunde använda gsub på det här sättet, ett stort tack för varje svar här som fick mig att lära mig något nytt.

Svar

/// , 19 byte (icke-konkurrerande)

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

Du kan inte ge inmatning på det här språket, så den antagna inmatningen går till höger om koden.

Kommentarer

  • Observera att Itflabtijtslwi är snedstreck men med inmatning.
  • @FryAmTheEggman Även om den matar in tecken , inte strängar .
  • Din länk verkar sakna ett snedstreck.

Svar

51 tecken i PHP

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

Testfall skrivet i lång hand

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

Detta gör strängjämförelsen och strängen ersätter båda i while-tillståndet. Om medan villkoret är uppfyllt, uppdaterar det vänstra sidan av jämförelsen med resultatet. Låt mig veta om alla förbättringar.

Svar

Jolf , 15 byte

Prova här! Måste jag verkligen förklara?

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 är mindre än perfekt för golf på grund av dess detaljerad natur – men ändå är det en intressant övning:

Golfversion, med Java-interop:

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

Un-golfed version, med 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)? byte

extglob version

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

Detta är tänkt att läggas i en fil och kallas med t.ex. bash -O extglob 789.sh 6567678989689789656. (+7)? byte är för om extglob-alternativet räknas mot byte.

Tack till @BinaryZebra för att peka på extglob-funktioner!


Version som inte är extglob (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  

Detta är tänkt att läggas i en fil och kallas med t.ex. ./789.sh 65678989656.

Det använder sig av parameterutvidgning för att söka och ersätta i en slinga. Jag involverade en serie utvidgningar för att ersätta dem eftersom jag inte är medveten om ett sätt att effektivisera kedjeutvidgningar.

Kommentarer

  • Välkommen till PPCG!
  • @BinaryZebra Ah, tack för @() syntax. Jag visste att det måste finnas ett sätt att kombinera dessa. Och @Mego, tack för välkommen !

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 

Prova online !

Hur det fungerar

String.e är rekursiv ersättningsfunktion. Japt 2 har en ny regex-syntax och automatisk komplettering inom parentes inuti regex, vilket sparar en byte här. (I Japt 1.x var vi tvungna att lämna strängar i stället för regexes, vilket var ganska klumpigt.)

Svar

Dyalog APL , 17 byte

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

"6* valfritt antal sexar
7 följt av sju
()*" följt av noll eller fler sekvenser av …
6|89 sex eller åtta nio

⎕R R placera det med

"7" en sju

Svar

05AB1E , 12 byte

Δ67‚7:789¬: 

Prova online eller verifiera alla testfall .

Förklaring:

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *