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
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
sollte77
zurückgeben, aber stattdessen677
- Sie können
s/67|7(6|89)/7/
anstelle vons/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, dass7
7
ad infinitum ersetzt wird? - @DigitalTrauma Es tauscht
7
mit7
beginnt dann erneut an der nächsten Position und arbeitet sich bis zum Ende vor.:g
ist die Abkürzung für:global
nichtrepeat 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 oder79999
ü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
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 vonsize.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()
undgsub()
, 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'}
undgsub
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 Verwendungruby -pe "gsub /6*7(6|89)*/,?7"
für insgesamt 20 + 1 Byte
Antwort
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 auf78976`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
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)