Waarom waren 6 bang voor 7? Omdat 7 8 9!
Gegeven een string gelden de volgende transformaties:
- Als er een 6 naast een 7 staat, verwijder dan de 6 (6 is bang van 7)
- Als de reeks “789” verschijnt, verwijder dan de 8 en de 9 (7 at 9).
(Als ik me niet vergis, maakt niet uit in welke volgorde je de transformaties uitvoert)
Blijf deze transformaties toepassen totdat je niet langer kunt.
Voorbeeld:
78966
Eerst zien we “789”, dus de string wordt “766”. Dan zien we “76”, dus we halen de 6 eruit, en de snaar wordt “76”. Dan zien we weer “76”, dus houden we over met “7”.
Testgevallen:
-
987
= >987
(Niet in de juiste volgorde. Doet niets.) -
6 7
=>6 7
(De witruimte fungeert als een buffer tussen 6 en 7. Er gebeurt niets) -
676
=>7
-
7896789
=>77
-
7689
=>7
-
abcd
=>abcd
Reacties
Answer
Antwoord
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])
Reacties
- Geweldig, en aangezien er 9 wordt gegeten, heb je maar 2 bytes en win je met dit antwoord: P
Antwoord
Java, 126 81 66 58 bytes
Met dank aan @GamrCorps voor het verstrekken van de lambda-versie van deze code!
Met dank aan @ user902383 voor het wijzen op een autoboxing-truc!
. ..yup.
Het is eigenlijk langer dan ik verwacht – Java vervangt items in strings door replaceAll()
eenmaal per overeenkomst, niet herhaaldelijk totdat het niet meer verandert. Dus ik moest een fancy for loop gebruiken.
Lambda-formulier:
x->{for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Functieformulier:
String s(String x){for(;x!=(x=x.replaceAll("67|76|789","7")););return x;}
Testbare niet-gegolfde code:
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;} }
Reacties
- Waarom ga je niet met een lambda? Zal minstens 15 bytes besparen.
- @GamrCorps Don ‘ weet niet hoe je dat moet formuleren – gebruik nooit functies.
- wat ‘ s het punt van interface en niet klasse?
- @eis Interface verwijdert de noodzaak om main als openbaar te verklaren, wat het minste voordeel oplevert. Zie: codegolf.stackexchange.com/a/64713/44713
- @ user902383 De reductie die u ‘ opnieuw maken is door
.equals
te veranderen in!=
, wat niet hetzelfde doet.==
(of!=
) vergelijkt op object hex-locatie, niet op waarde. Het ‘ heeft verder dezelfde lengte.while()
is 7 bytes,for(;;)
is 7 bytes.
Antwoord
GNU Sed, 17
Score omvat +1 voor -r
optie.
s/6*7(6|89)*/7/g
Reacties
- Werkt niet ‘ voor
67789
zou77
moeten retourneren, maar het retourneert in plaats daarvan677
- U kunt
s/67|7(6|89)/7/
in plaats vans/6?7(6|89)/7/
- Goh, ik vraag me af waar Larry op het idee kwam van
s///g
?
Antwoord
Perl 6 , 19 18 bytes
{S:g/6*7[6|89]*/7/} # 19 bytes
$ perl6 -pe "s:g/6*7[6|89]*/7/" # 17 + 1 = 18 bytes
(Merk op dat [6|89]
de niet-captur is ing versie van (6|89)
die wordt gespeld als (?:6|89)
in Perl 5.<[6|89]>
is hoe je zou schrijven wat “wordt gespeld als [6|89]
in Perl 5)
gebruik:
$ 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
Reacties
- Ik ‘ ken Perl 6 niet, maar ik neem aan dit is een herhaalde vervanging. Als de
6*
en de[6|89]*
niet ‘ met iets overeenkomen , wat zorgt ervoor dat7
wordt vervangen door7
ad infinitum? - @DigitalTrauma Het wisselt
7
met7
begint dan opnieuw op de volgende positie en werkt zich een weg tot het einde.:g
is een afkorting voor:global
nietrepeat until it doesn't match anymore
. - @DigitalTrauma Om
s/67|76|789/7/
naar werk aan Ik zou het moeten schrijven als iets in de zin van:while s/67|76|789/7/ {}
wat natuurlijk nooit zou stoppen als je het zou schrijven alswhile s/6*7[6|89]*/7/ {}
zoals je zou verwachten. Ook kan het einde van de vorige opmerking overkomen als gemeen pittig, dat wil zeggen niet hoe het was bedoeld - Shouldn ‘ t de
[]
worden gewijzigd in()
? U wilt geen ‘ pijpen of79999
. - @jwodder Nee
[]
is de Perl 6 niet-vastleggende versie van()
, waar je aan denkt wordt in Perl 6 gespeld als<[6|89]>
.
Antwoord
Pyth, 17 bytes
u:G"67|76|789"\7z
Leaky Nun heeft dit met een byte in de commentaren overtroffen.
Opmerkingen
Antwoord
Perl 5 , 17 bytes
perl -pe "s/6*7(6|89)*/7/g" # 16 + 1
gebruik:
$ 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
Antwoord
Mathematica, 52 bytes
StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#&
Uitleg:
& 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.
Opmerkingen
- De golfed-code is duidelijker dan de uitlegcode .. 🙂
- @Rob Haven ‘ t heeft eerder veel uitleg gegeven, waarbij ik voor een systematische aanpak ging.
- Ik plaagde alleen maar, maat 🙂
Antwoord
Rust, 96 bytes
fn f(mut s:String)->String{for _ in 0..s.len(){for r in&["67","76","789"]{s=s.replace(r,"7")}}s}
Hopeloos lang, zoals gewoonlijk voor 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 }
Reacties
- Het is tenminste ‘ geen Java
Antwoord
Emacs Lisp, 59 bytes
(lambda(s)(replace-regexp-in-string"6*7\\(6\\|89\\)*""7"s))
Het wordt een beetje duidelijker met spaties:
(lambda (s) (replace-regexp-in-string "6*7\\(6\\|89\\)*" "7" s))
Antwoord
Ruby, 27 bytes
Deze oplossing is van commentaar, met dank aan Brad Gilbert b2gills .
->s{s.gsub /6*7(6|89)*/,?7}
Ruby, 37 bytes
(oude oplossing)
Deze oplossing gebruikt het feit dat je nooit meer dan karakters in de string hoeft te vervangen.
->s{s.chars{s.sub! /67|76|789/,?7};s}
Opmerkingen
- U kunt
chars
gebruiken in plaats vansize.times
om er een paar op te slaan bytes. - Heeft ‘ t Ruby de globale vlag voor regex-substitutie, of zijn er meer bytes nodig om dit in te schakelen?
- @ BradGilbertb2gills , in Ruby is zoals in Awk: er zijn aparte
sub()
engsub()
methoden om de eerste of alle te vervangen. Dus globaal is maar één teken langer. - @manatwork Dan zou ik dit iets schrijven als:
->s{s.gsub /6*7(6|89)*/,'7'}
, en laatgsub
doe al het loopwerk. - Als ik de regels van opdrachtregelvlaggen correct begrijp, zou je 16 bytes kunnen besparen door de opdrachtregelvlag -p (+1) te gebruiken, waardoor deze
gsub /6*7(6|89)*/,?7
met gebruikruby -pe "gsub /6*7(6|89)*/,?7"
voor een totaal van 20 + 1 bytes
Antwoord
Antwoord
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
Gebruikmakend van:
- het regex-patroon van iemand anders
- de manier waarop
-replace
vervangt standaard globaal in PowerShell - lus uitrollen, waar het de
-regex
operator op de array zal toepassen$args
door het op alle elementen afzonderlijk toe te passen, en er is hier maar één element omdat er maar één scriptparameter is, dus het werkt goed en we kunnen voorkomen dat we om element[0]
te indexeren.
Een eerdere poging tot nieuwheid voordat een globale vervanging werd gerealiseerd, zou voldoende zijn; 74 bytes van het bouwen van een ketting van “-replace -replace -replace” met behulp van stringvermenigvuldiging, zo vaak als de lengte van de string, en vervolgens eval () ingaan:
""$($args)""+("{0}6|6(?=7)"{0}89""-f"-replace"(?<=7)")*$args[0].Length|iex
(Met een beetje stringvervanging om het aantal vervangingen te verkorten).
Answer
MATL , 17 bytes
jt""789|76"55cYX]
Voorbeeld
>> matl > jt""789|76"55cYX] > > 7896789 77
BEWERKEN : Probeer het online!
Uitleg
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
Dit werkt door een normale expressievervanging toe te passen voor zo vaak als er tekens in de originele string staan. Dit is voldoende, aangezien elke vervanging het aantal karakters vermindert.
Antwoord
Serieus, 29 bytes
,;l`"7;;"67"(Æ"76"(Æ"789"(Æ`n
Neemt invoer als een tekenreeks met dubbele aanhalingstekens, zoals "6789"
. Probeer het online (u moet de invoer handmatig citeren).
Uitleg:
,;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"
Antwoord
PHP, 36 bytes
preg_replace("/6*7(6|89)*/","7",$a);
regex-oplossing, neemt $ a string en vervangt deze via de uitdrukking.
Reacties
- GET parameters zijn niet acceptabel als invoermethode in PHP . U moet dit een functie maken en de invoer doorgeven als functieparameters, of u moet invoer krijgen van
$argv
of STDIN. - @Mego Er lijkt geen consensus over het bericht waarnaar u linkt.
- @immibis Correct. Er is een consensus nodig om een I / O-methode acceptabel te maken. Het ontbreken van één betekent dat het niet acceptabel is.
- TL; DR je hebt ernstige nadelen als je PHP gebruikt voor codegolf.
Antwoord
Thue , 26 bytes
67::=7 76::=7 789::=7 ::=
inclusief een volgende nieuwe regel.
Invoer wordt aan het programma toegevoegd voordat het wordt gestart.
Uitvoer wordt uitgelezen van de programmastatus wanneer het eindigt, vergelijkbaar met een Turing-machine.
(Thue heeft een uitvoerstroom, maar het is moeilijk correct te gebruiken, dus ik weet niet zeker of dit een acceptabele uitvoermethode is)
Opmerkingen
- Ik denk het niet ‘. Als je een manier hebt om STDOUT te bereiken, moet je dat doen. Sorry!
- Ja, dit is toegestaan volgens de metapost.
Antwoord
CJam, 70 64 bytes
Met dank aan @Peter Taylor voor het knippen van {"789":I}{"76:":I}?
naar "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
Ik weet dit zou waarschijnlijk nog veel verder gegolfd kunnen worden en uw hulp zou zeer gewaardeerd worden, maar eerlijk gezegd ben ik “gewoon blij dat ik het antwoord heb gekregen. Dit was mijn eerste poging om CJam te schrijven.
Uitleg:
"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
Reacties
- Ik heb ‘ t geprobeerd deze vraag te beantwoorden mezelf, dus ik ‘ m niet zeker of dit de beste benadering is, maar als je wilt splitsen en meedoen, kijk dan eens naar
/
en*
. Merk ook op dat denken in termen van stapels wanneer je ‘ gewend bent aan C-achtige talen s enige aanpassing. Bijv.{"789":I}{"76":I}?
kan de toewijzing ophalen om"789""76"?:I
te worden, die verder kan worden gegolfd naar78976`3/?:I
. - Bedankt! Ik kon ‘ niet helemaal begrijpen hoe ik je tweede suggestie moest gebruiken.
- Sorry, mijn fout.
78976`3/
geeft een array["789" "76"]
; in plaats van?
te gebruiken, zou u=
moeten gebruiken om te indexeren; maar het ‘ staat achterstevoren, dus het zou nodig zijn dat de index wordt omgekeerd, waardoor het voordeel verloren gaat.
Antwoord
R, 35 bytes
cat(gsub("6*7(6|89)*",7,scan(,"")))
Ik wist niet dat ik gsub
op deze manier, hartelijk dank voor elk antwoord hier waardoor ik iets nieuws heb geleerd.
Antwoord
/// , 19 bytes (niet-concurrerend)
/67/7//76/7//789/7/
Je kunt “eigenlijk geen invoer in deze taal geven, dus de veronderstelde invoer gaat rechts van de code.
Reacties
- Merk op dat Itflabtijtslwi is schuine strepen maar met invoer.
- @FryAmTheEggman Hoewel die tekens invoert, niet strings .
- Uw link lijkt één schuine streep te missen.
Antwoord
PHP 51 tekens
while($s!=$r=str_replace([789,67,76],7,$s)){$s=$r;}
Testcase met de hand geschreven
$s = "78966"; while ($s != $r = str_replace([789, 67, 76], 7, $s) ) { $s = $r; } echo $s; // 7;
Dit doet de stringvergelijking en de string vervangen beide in de while-voorwaarde. Als aan de voorwaarde is voldaan, wordt de linkerhand van de vergelijking bijgewerkt met het resultaat. Laat me weten of er verbeteringen zijn.
Answer
Jolf , 15 bytes
Probeer het hier! Moet ik het echt uitleggen?
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
Answer
Clojure, 71 bytes
Clojure is niet ideaal om te golfen vanwege zijn uitgebreide aard – maar het is niettemin een interessante oefening:
Golfversie, met behulp van Java-interoperabiliteit:
(defn f[s](let[x(.replaceAll s "67|76|789" "7")](if(= s x)s(recur x))))
Niet-golfversie, Java-interoperabiliteit gebruiken:
(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x))))
Un-golfed ” pure Clojure ” versie:
(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x))))
Answer
Bash, 102 82 67 (+7)? bytes
extglob-versie
x=$1 while v=${x/@(76|67|789)/7};[ $v != $x ];do x=$v;done echo $v
Dit is bedoeld om in een bestand te worden geplaatst en aangeroepen met bijvoorbeeld bash -O extglob 789.sh 6567678989689789656
. De (+7)? bytes is voor als de extglob-optie meetelt voor bytes.
Met dank aan @BinaryZebra voor het wijzen op extglob-functies!
Niet-extglob-versie (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
Dit is bedoeld om in een bestand te worden geplaatst en aangeroepen met bijv. ./789.sh 65678989656
.
Het maakt gebruik van parameteruitbreiding om te zoeken en vervangen in een lus. Ik heb een reeks uitbreidingen gebruikt om de vervanging te doen, omdat ik “geen manier weet om effectiever kettinguitbreidingen te maken.
Opmerkingen
- Welkom bij PPCG!
- @BinaryZebra Ah, bedankt voor de
@()
syntaxis. Ik wist dat er een manier moest zijn om deze te combineren. En @Mego, bedankt voor het welkom !
Antwoord
Python 3, 46 bytes
import re lambda s:re.sub(r"6*7(6|89)*","7",s)
Antwoord
Japt v2.0a0, 12 bytes
e/6?7(6|89/7
Hoe het werkt
String.e
is een recursieve vervangingsfunctie. Japt 2 heeft een nieuwe regex-syntaxis en automatische aanvulling van haakjes in regex, wat hier één byte bespaart. (In Japt 1.x moesten we strings doorgeven in plaats van regex, wat nogal onhandig was.)
Antwoord
Dyalog APL , 17 bytes
"6*7(6|89)*"⎕R"7"
"6*
een willekeurig aantal zessen
7
gevolgd door een zeven
(
… )*"
gevolgd door nul of meer reeksen van …
6|89
een zes of acht-negen
⎕R
R vervang dat met
"7"
een zeven
Antwoord
05AB1E , 12 bytes
Δ67‚7:789¬:
Probeer het online of verifieer alle testgevallen .
Uitleg:
Δ # 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