Waarom was 6 bang voor 7?

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

  • Waarom was Vista bang voor 7? Omdat 7 8 10.
  • Nog een testcase 68978966897896 = > 68977
  • @ThomasKwa Oh, ik snap het: Microsoft heeft Windows 9 overgeslagen omdat ze akkoord gingen met het raadsel. 😉
  • Waarom was bang voor zeven vijf? Omdat zes zeven acht. –Yoda
  • Zes waren bang voor zeven omdat zeven koude, dode ogen hadden.

Answer

Retina , 12

Vertaling van het sed-antwoord :

6*7(6|89)* 7 

Probeer het online

Reacties

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 zou 77 moeten retourneren, maar het retourneert in plaats daarvan 677
  • U kunt s/67|7(6|89)/7/ in plaats van s/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 dat 7 wordt vervangen door 7 ad infinitum?
  • @DigitalTrauma Het wisselt 7 met 7 begint dan opnieuw op de volgende positie en werkt zich een weg tot het einde. :g is een afkorting voor :global niet repeat 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 als while 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 of 79999.
  • @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 

Probeer het hier.

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 van size.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() en gsub() 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 laat gsub 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 gebruik ruby -pe "gsub /6*7(6|89)*/,?7" voor een totaal van 20 + 1 bytes

Antwoord

Japt , 15 bytes

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

Eenvoudige RegEx-oplossing

Probeer het online

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

Probeer het online !

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)  

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *