Nachdem ich einige Zeit auf dieser Seite verbracht habe, habe ich es genossen, Dinge so kurz wie möglich zu halten. Das mag der Grund sein, warum ich in letzter Zeit von Strings beleidigt bin, die dieselben Zeichen mehr als einmal enthalten. Ihre Aufgabe ist es, eine Funktion oder ein Programm zu schreiben, das einen bestimmten String nach folgenden Regeln komprimiert :
Beginnen Sie mit einer 0-Verdichtung , dh suchen Sie nach dem ersten (am weitesten links stehenden) Paar derselben Zeichen mit 0 anderen Zeichen dazwischen. Wenn ein solches Paar gefunden wird, entfernen Sie eines der beiden Zeichen und starten Sie den Algorithmus neu, indem Sie eine weitere 0-Kondensation durchführen . Wird kein solches Paar gefunden, fahren Sie mit dem nächsten Schritt fort. Beispiele:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
Führen Sie dann eine 1-Verdichtung durch , dh suchen Sie nach dem ersten Zeichenpaar mit 1 weiteren Zeichen dazwischen. Wenn ein solches Paar gefunden wird, entfernen Sie eines von ihnen und alle Zeichen zwischen ihnen und starten Sie mit einer 0-Verdichtung neu . Wird kein solches Paar gefunden, fahren Sie mit dem nächsten Schritt fort. Beispiele:
abacac
-C1->acac
java
-C1->ja
Fahren Sie mit einer 2-Kondensation fort und so weiter bis zu einer n-Kondensation, wobei n die Länge der ursprünglichen Zeichenfolge ist. Bei jedem Neustart nach einer Kondensation werden einige Buchstaben entfernt. Beispiele:
programing
-C2->praming
abcdafg
-C3->afg
Die resultierende Zeichenfolge heißt komprimiert und enthält jedes Zeichen höchstens einmal.
Eingang:
Eine Kleinbuchstabenfolge aus druckbaren ASCII-Zeichen.
Ausgabe:
Die verkürzte Zeichenfolge gemäß den obigen Regeln.
Beispiele:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
Detaillierte Beispiele zur Verdeutlichung der Funktionsweise des Algorithmus:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
Ihr Ansatz muss den Algorithmus nicht von oben implementieren, solange Ihre Lösung und der Algorithmus für alle zulässigen Eingaben dieselbe Ausgabe zurückgeben. Dies ist eine Code-Golf- Herausforderung.
Vielen Dank an @Linus für hilfreiche Sandbox-Kommentare!
Antworten:
JavaScript (ES6), 74 Byte
quelle
Perl,
38313029 BytesDas sollte die nicht-golfenden Sprachen weit hinter sich lassen ...
-1 für
$-[0]
danke an Riley-1 für
@{-}
danke an DadaBeinhaltet +1 für
-p
Geben Sie eine Eingabe für STDIN ein
condense.pl
:Diese 27-Byte-Version sollte funktionieren, funktioniert jedoch nicht, da Perl nicht
@-
in regulären Ausdrücken interpoliert (siehe https://stackoverflow.com/questions/39521060/why-are-etc-not-interpolated-in-strings ).quelle
@{\@-}
Teil? Ich dachte@-
, die Indizes jedes Matches werden festgehalten, also wie wird es bei jeder Iteration "hochgezählt"? Wenn Sie@{\@-}
vor und nach jeder Ersetzung drucken, wird immer nur 1 oder 2 gedruckt././g
Zeichenfolge wird jedes Mal um 1 in der Zeichenfolge fortgeschrieben, außer wenn sich die Zeichenfolge ändert. Sie wird dann auf 0 zurückgesetzt. Wenn Sie@-
nach der Zeichenfolge,/./g
jedoch vor der Zeichenfolge drucken, wird die Zeichenfolge nach oben verschobens///
(verwenden Sie einen Test, bei dem die verbleibende Zeichenfolge groß genug ist).$-[0]
gibt die Zahlen, die ich erwarten würde. Handelt es@{\@-}
sich wie$-[0]
aufgrund des Regex-Kontexts, aber aus irgendeinem Grund nicht beim Drucken?$-[0]
ist ein Byte kürzer als@{\@-}
wenn sie gleich sind."@{\@-}"
ist nicht dasselbe wie@{\@-}
(ohne"
)."@{\@-}"
das gleiche wie"@-"
. Dies sollte auch für einen regulären Austausch gelten, ist es aber nicht. Sollte genauso$-[0]
funktionieren, tut es aber nicht. PS: Sie hatten wahrscheinlich irgendwie skalaren Kontext,@-
als Sie Ihren Druck gemacht haben, so dass Sie immer 1 oder 2CJam , 35 Bytes
Probieren Sie es online!
Sie können die einzelnen Kondensationen durch Einfügen sehen
ed
quelle
Python 2,
117104101 BytesFühren Sie die erforderlichen Ersetzungen rekursiv durch. Ich baue die Regex dynamisch.
Probieren Sie es online aus
quelle
return i>len(t) and t or s!=t and f(t) or f(t,i+1)
einem Netz von -4 Bytes zusammengefasst werdenreturn t if i>len(t)else s!=t and f(t)or f(t,i+1))
e=s==t;return i>len(t)and t or f(t,i*e+e)
und nach können Sie diei=0
in der Funktionsdefinition entfernen , aber Sie müssen mit 0 Start aufrufen.Perl
5352Beinhaltet +1 für -p
Probiere es auf ideone aus .
quelle
Mathematica, 101 Bytes
Es sollte einen Weg geben, dies zu verkürzen ...
quelle
PHP, 90 Bytes
oder 92 Bytes
quelle
+$i
anstelle von$i+=0
(-2). 2)for
Schleife stattwhile
kann zwei Bytes speichern und das Entfernen von Locken (-4) ermöglichen. 3)$i=++$i*!$c
anstelle von$i=$c?0:$i+1
(-1). 4)\\2
ist nicht erforderlich, entfernen Sie die Klammern (-2). 5) Sie können das Tempolimit9
anstelle von1
(+0) zulassen+$i
überlege ... funktioniert nicht in jedem Fall. Versuchen Sie eshammer
. PHP beschwert sich nicht über die leeren Klammern in der Regex; aber es passt nicht wie gewünscht. Übrigens: Ich zähle 91, nicht 90. Aber probieren Sie das neue 1)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
$i+=0
und werde deinen Vorschlag später versuchen. Was heißt mit Hammer?puzzle
oder so ähnlich,(.)//1
aber es ist in Ordnung mit Ihrem Vorschlag oder der$i´=0
Ruby,
756457 Bytes(56 Byte Code +
p
Befehlszeilenoption.)Verwenden der Zeichenfolgeninterpolation in einem regulären Ausdruck, um die Länge der ersetzten Übereinstimmungen zu steuern.
Prüfung:
quelle
Haskell ,
9788 BytesProbieren Sie es online!
Alte 97-Byte-Version:
Probiere es auf ideone aus .
Erläuterung:
Die
(!)
Funktion führt eine n-Kondensation durch, wenn eine Zeichenfolge einmal ganz und einmal mit den ersten n entfernten Zeichen angegeben wird, z. B.abcdbe
undcdbe
für eine 2-Kondensation, indem die beiden führenden Zeichen rekursiv verglichen werden.quelle