Warum hatte 6 Angst vor 7?

Warum hatten 6 Angst vor 7? Weil 7 8 9!

Bei einer gegebenen Zeichenfolge die folgenden Transformationen anwenden:

  • Wenn neben einer 7 eine 6 steht, entfernen Sie die 6 (6 hat Angst von 7)
  • Wenn die Sequenz „789“ erscheint, entfernen Sie die 8 und die 9 (7 aßen 9)

(Wenn ich mich nicht irre, tut es das nicht Egal in welcher Reihenfolge Sie die Transformationen durchführen)

Wenden Sie diese Transformationen so lange an, bis Sie sie nicht mehr können.

Beispiel:

78966

Zuerst sehen wir „789“, sodass die Zeichenfolge zu „766“ wird. Dann sehen wir „76“, also nehmen wir die 6 heraus und die Zeichenfolge wird zu „76“. Dann sehen wir wieder „76“, so dass wir „7“ haben.

Testfälle:

  • 987 = > 987 (Nicht in der richtigen Reihenfolge. Tut nichts.)
  • 6 7> => 6 7 (Das Leerzeichen fungiert als Puffer zwischen 6 und 7. Es passiert nichts)
  • 676> => 7
  • 7896789 => 77
  • 7689 => 7
  • abcd> => abcd

Kommentare

  • Warum hatte Vista Angst vor 7? Weil 7 8 10.
  • Ein weiterer Testfall 68978966897896 = > 68977
  • @ThomasKwa Oh, ich verstehe: Microsoft hat Windows 9 übersprungen, weil sie dem Rätsel gefolgt sind. 😉
  • Warum war die Angst vor sieben fünf? Weil sechs sieben acht. – Yoda
  • Sechs hatten Angst vor sieben, weil sieben kalte, tote Augen hatten.

Antwort

Retina , 12

Übersetzung der sed-Antwort :

6*7(6|89)* 7 

Probieren Sie es online aus

Kommentare

Answer

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]) 

Kommentare

  • Großartig, und da 9 gegessen wird, haben Sie nur 2 Bytes und gewinnen mit dieser Antwort: P

Antwort

Java, 126 81 66 58 Bytes

Vielen Dank an @GamrCorps für die Bereitstellung der Lambda-Version dieses Codes!

Vielen Dank an @ user902383 für den Hinweis auf einen Autoboxing-Trick!

. ..yup.

Es ist tatsächlich länger als ich erwartet – Java ersetzt Elemente in Zeichenfolgen durch replaceAll() einmal pro Übereinstimmung, nicht wiederholt, bis die Änderung aufhört. Also musste ich eine ausgefallene for-Schleife verwenden.

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;}

Testbarer ungolfed 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;} }

Kommentare

  • Warum nicht mit einem Lambda gehen? Speichert mindestens 15 Bytes.
  • @GamrCorps ‚ weiß nicht, wie man das ausdrückt – verwenden Sie niemals Funktionen.
  • what ‚ ist der Punkt der Schnittstelle und nicht der Klasse?
  • @eis Schnittstelle beseitigt die Notwendigkeit, main als öffentlich zu deklarieren, was den geringsten Vorteil bietet. Siehe: codegolf.stackexchange.com/a/64713/44713
  • @ user902383 Die Reduzierung, die Sie ‚ wird erstellt, indem .equals in != geändert wird, wodurch nicht dasselbe getan wird. == (oder !=) vergleicht nach Hex-Position des Objekts, nicht nach Wert. ‚ ist ansonsten gleich lang. while() ist 7 Byte, for(;;) ist 7 Byte.

Antwort

GNU Sed, 17

Die Punktzahl enthält +1 für die Option -r.

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

Kommentare

  • ‚ funktioniert nicht für 67789 sollte 77 zurückgeben, aber stattdessen 677
  • Sie können s/67|7(6|89)/7/ anstelle von s/6?7(6|89)/7/
  • Ich frage mich, wo Larry auf die Idee von s///g?

Antwort

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  

(Beachten Sie, dass [6|89] der Nicht-Captur ist Version von (6|89), die in Perl 5 als (?:6|89) geschrieben ist.<[6|89]> ist, wie Sie schreiben würden, was in Perl 5 als [6|89] geschrieben ist.

Verwendung:

 $ 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  

Kommentare

  • Ich kenne Perl 6 nicht ‚, aber ich nehme an Dies ist eine wiederholte Ersetzung. Wenn die 6* und die [6|89]* ‚ nicht übereinstimmen , was verhindert, dass 7 7 ad infinitum ersetzt wird?
  • @DigitalTrauma Es tauscht 7 mit 7 beginnt dann erneut an der nächsten Position und arbeitet sich bis zum Ende vor. :g ist die Abkürzung für :global nicht repeat until it doesn't match anymore.
  • @DigitalTrauma Um s/67|76|789/7/ zu erhalten Arbeit an Ich müsste es wie folgt schreiben: while s/67|76|789/7/ {} was natürlich niemals aufhören würde, wenn Sie es als wie erwartet. Außerdem kann das Ende des vorherigen Kommentars als gemein temperamentvoll erscheinen, dh nicht , wie es beabsichtigt war
  • Sollte ‚ Wird die [] in () geändert? Sie möchten ‚ nicht mit Pipes oder 79999 übereinstimmen.
  • @jwodder No [] ist die nicht erfassende Perl 6-Version von (). Was Sie denken, wird in Perl 6 als <[6|89]> geschrieben .

Antwort

Pyth, 17 Bytes

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

Probieren Sie es hier aus.

Leaky Nun hat dies in den Kommentaren um ein Byte übertroffen.

Kommentare

Antwort

Perl 5 , 17 Bytes

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

Verwendung:

 $ 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  

Antwort

Mathematica, 52 Byte

StringReplace[#,"67"|"76"|"789"->"7"]&~FixedPoint~#& 

Erläuterung:

 & 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. 

Kommentare

  • Der Golfcode ist klarer als der Erklärungscode. 🙂
  • @Rob Haven ‚ Ich habe vorher nicht viele Erklärungen abgegeben und mich für einen systematischen Ansatz entschieden.
  • Ich habe nur geärgert, Kumpel 🙂

Antwort

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}  

Hoffnungslos lang, wie für Rust üblich …

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 }  

Kommentare

  • Zumindest ‚ ist nicht Java

Antwort

Emacs Lisp, 59 Byte

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

Mit Leerzeichen wird es etwas klarer:

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

Antwort

Ruby, 27 Bytes

Diese Lösung stammt aus Kommentaren und wird Brad Gilbert b2gills gutgeschrieben.

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

Ruby, 37 Byte

(alte Lösung)

Diese Lösung nutzt die Tatsache, dass Sie nie mehr als Zeichen in der Zeichenfolge ersetzen müssen.

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

Kommentare

  • Sie können chars anstelle von size.times verwenden, um einige zu speichern Bytes.
  • Verfügt ‚ t Ruby nicht über das globale Flag für die Regex-Substitution, oder würde die Aktivierung mehr Bytes erfordern?
  • @ BradGilbertb2gills , in Ruby ist wie in Awk: Es gibt separate Methoden sub() und gsub(), die zuerst oder alle ersetzt werden müssen. Global ist also nur ein Zeichen länger.
  • @manatwork Dann würde ich Folgendes schreiben: ->s{s.gsub /6*7(6|89)*/,'7'} und gsub erledige die ganze Schleifenarbeit.
  • Wenn ich die Regeln für Befehlszeilenflags richtig verstehe, können Sie 16 Bytes sparen, indem Sie das Befehlszeilenflag -p (+1) verwenden, um gsub /6*7(6|89)*/,?7 mit zu machen Verwendung ruby -pe "gsub /6*7(6|89)*/,?7" für insgesamt 20 + 1 Byte

Antwort

Japt , 15 Byte

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

Einfache RegEx-Lösung

Probieren Sie es online aus

Antwort

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 

Verwenden Sie:

  • das Regex-Muster eines anderen
  • den Weg -replace führt beim Entrollen der PowerShell
  • -Schleife standardmäßig eine globale Ersetzung durch, wobei der Operator -regex auf das Array angewendet wird $args indem Sie es auf alle Elemente einzeln anwenden. Hier gibt es nur ein Element, da es nur einen Skriptparameter gibt. Es funktioniert also in Ordnung und wir können es vermeiden um das Element [0] zu indizieren.

Ein neuer Versuch, bevor ein globaler Ersatz realisiert wurde, würde dies tun. 74 Bytes Erstellen einer Kette von „-replace -replace -replace“ unter Verwendung der Zeichenfolgenmultiplikation, so oft wie die Länge der Zeichenfolge, und dann Auswertung ():

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

(Mit ein wenig String-Ersetzung, um die Anzahl der Ersetzungen zu verkürzen).

Antwort

MATL , 17 Bytes

jt""789|76"55cYX] 

Beispiel

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

BEARBEITEN : Probieren Sie es online aus!

Erläuterung

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 

Dies funktioniert, indem für ein regulärer Ausdrucksersatz angewendet wird, so oft Zeichen in der ursprünglichen Zeichenfolge enthalten sind. Dies ist ausreichend, da jede Ersetzung die Anzahl der Zeichen verringert.

Antwort

Im Ernst, 29 Bytes

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

Nimmt die Eingabe als Zeichenfolge in doppelten Anführungszeichen wie "6789". Probieren Sie es online aus (Sie müssen die Eingabe manuell zitieren).

Erläuterung:

,;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" 

Antwort

PHP, 36 Byte

preg_replace("/6*7(6|89)*/","7",$a); 

Regex-Lösung, nimmt $ eine Zeichenfolge und ersetzt sie über den Ausdruck.

Kommentare

  • GET Parameter sind als Eingabemethode in PHP nicht akzeptabel. Sie müssen dies entweder zu einer Funktion machen und die Eingabe als Funktionsparameter übergeben oder eine Eingabe von $argv oder STDIN erhalten.
  • @Mego Es scheint keine zu geben Konsens über den Beitrag, auf den Sie verlinkt haben.
  • @immibis Richtig. Ein Konsens ist erforderlich, um eine E / A-Methode akzeptabel zu machen. Das Fehlen eines bedeutet, dass dies nicht akzeptabel ist.
  • TL; DR Sie haben schwerwiegende Nachteile, wenn Sie PHP für Codegolf verwenden.

Antwort

Thue , 26 Byte

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

einschließlich einer nachgestellten Zeilenumbruch.

Die Eingabe wird vor dem Start an das Programm angehängt.
Die Ausgabe wird beim Beenden aus dem Programmstatus ausgelesen, ähnlich wie bei einer Turing-Maschine.
(Thue hat einen Ausgabestream, aber es ist schwierig, ihn korrekt zu verwenden, daher bin ich mir nicht sicher, ob dies eine akzeptable Ausgabemethode ist.)

Kommentare

  • Ich glaube nicht, dass ‚ dies der Fall ist. Wenn Sie einen Weg zu STDOUT haben, müssen Sie. Entschuldigung!
  • Ja, dies ist laut Meta-Post zulässig.

Antwort

CJam, 70 64 Byte

Vielen Dank an @Peter Taylor für das Schneiden von {"789":I}{"76:":I}? auf "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

Ich weiß das könnte wahrscheinlich viel weiter Golf gespielt werden und Ihre Hilfe wäre sehr dankbar, aber ehrlich gesagt bin ich nur froh, dass ich die Antwort bekommen habe. Dies war mein erster Versuch, CJam zu schreiben.

Erläuterung:

"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 

Kommentare

  • Ich habe ‚ diese Frage nicht versucht Ich selbst, also bin ich ‚ nicht sicher, ob dies der beste Ansatz ist, aber wenn Sie teilen und verbinden möchten, schauen Sie sich / und *. Beachten Sie auch, dass Sie in Stapeln denken müssen, wenn Sie ‚ an C-ähnliche Sprachen gewöhnt sind s einige Anpassung. Z.B. {"789":I}{"76":I}? kann die Zuweisung zu "789""76"?:I herausziehen, was weiter auf 78976`3/?:I golfen kann
  • Danke! Ich konnte ‚ jedoch nicht ganz verstehen, wie ich Ihren zweiten Vorschlag verwenden soll.
  • Entschuldigung, mein Fehler.78976`3/ gibt ein Array an ["789" "76"]; Anstatt ? zu verwenden, müssten Sie = verwenden, um zu indizieren. ‚ ist jedoch von hinten nach vorne, sodass der Index invertiert werden muss, wodurch der Vorteil verloren geht.

Antwort

R, 35 Byte

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

Ich wusste nicht, dass ich gsub auf diese Weise ein großes Dankeschön für jede Antwort hier, die mich dazu gebracht hat, etwas Neues zu lernen.

Antwort

/// , 19 Bytes (nicht konkurrierend)

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

Sie können „keine Eingabe in dieser Sprache bereitstellen, daher wird die angebliche Eingabe rechts neben dem Code angezeigt.

Kommentare

  • Beachten Sie, dass Itflabtijtslwi ist ein Schrägstrich, aber mit Eingabe.
  • @FryAmTheEggman Obwohl dieser Zeichen eingibt, nicht Zeichenfolgen .
  • In Ihrem Link scheint ein Schrägstrich zu fehlen.

Antwort

PHP 51 Zeichen

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

Testfall in langer Hand geschrieben

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

Hiermit werden sowohl der Zeichenfolgenvergleich als auch die Zeichenfolge in der while-Bedingung ersetzt. Wenn die Bedingung erfüllt ist, wird die linke Hand des Vergleichs mit dem Ergebnis aktualisiert. Lassen Sie mich über Verbesserungen wissen.

Antwort

Jolf , 15 Bytes

Probieren Sie es hier aus! Muss ich das wirklich erklären?

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 

Antwort

Clojure, 71 Bytes

Clojure ist aufgrund seiner Tatsache weniger als ideal für das Golfen Ausführliche Natur – aber dennoch ist es eine interessante Übung:

Golfversion mit Java-Interop:

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

Version ohne Golf, Verwenden von Java Interop:

(defn six-fears-seven [s] (let [x (.replaceAll s "67|76|789" "7")] (if (= s x) s (recur x)))) 

Nicht golfen “ pure Clojure “ version:

(defn six-fears-seven [s] (let [x (clojure.string/replace s #"67|76|789" "7")] (if (= s x) s (recur x)))) 

Antwort

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  

Dies soll in eine Datei eingefügt und mit zB bash -O extglob 789.sh 6567678989689789656. Die (+7)? Bytes ist für den Fall vorgesehen, dass die Extglob-Option für Bytes zählt.

Vielen Dank an @BinaryZebra für den Hinweis auf Extglob-Funktionen!


Nicht-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  

Dies soll in eine Datei eingefügt und mit z ./789.sh 65678989656.

Die Parametererweiterung wird zum Suchen und Ersetzen in einer Schleife verwendet. Ich habe eine Reihe von Erweiterungen durchgeführt, um das Ersetzen durchzuführen, da mir kein Weg bekannt ist, Erweiterungen effektiver zu verketten.

Kommentare

  • Willkommen bei PPCG!
  • @BinaryZebra Ah, danke für die @() -Syntax. Ich wusste, dass es eine Möglichkeit geben musste, diese zu kombinieren. Und @Mego, danke für die Begrüßung !

Antwort

Python 3, 46 Byte

 import re lambda s:re.sub(r"6*7(6|89)*","7",s)  

Antwort

Japt v2.0a0, 12 Byte

e/6?7(6|89/7 

Probieren Sie es online aus !

Funktionsweise

String.e ist eine rekursive Ersetzungsfunktion. Japt 2 verfügt über eine neue Regex-Syntax und eine automatische Vervollständigung von Klammern innerhalb von Regex, wodurch hier ein Byte gespeichert wird. (In Japt 1.x mussten wir Zeichenfolgen anstelle von Regexes übergeben, was etwas klobig war.)

Antwort

Dyalog APL , 17 Byte

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

"6* beliebig viele Sechser
7 gefolgt von einer Sieben
()*" gefolgt von null oder mehr Sequenzen von…
6|89 a sechs oder acht neun

⎕R R Ersetzen Sie dies durch

"7" a sieben

Antwort

05AB1E , 12 Bytes

Δ67‚7:789¬: 

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.