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
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
- 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 returnera77
men det returnerar istället677
- Du kan använda
s/67|7(6|89)/7/
istället förs/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 hindrar7
att ersättas med7
ad infinitum? - @DigitalTrauma Det byter ut
7
med7
startar sedan igen vid nästa position och arbetar fram till slutet.:g
är kort för:global
interepeat 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 somwhile 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 eller79999
. - @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
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örsize.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()
ochgsub()
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åtgsub
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ändningruby -pe "gsub /6*7(6|89)*/,?7"
för 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
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 till78976`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
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)
68978966897896
= >68977