Ihre Herausforderung besteht darin, einige Klammern in der Eingabe eines Programms wie folgt zu erweitern:
- Suchen Sie eine Zeichenfolge s zwischen zwei übereinstimmenden Klammern
[
und]
mit einer einzelnen Ziffer n nach der schließenden Klammer. - Entfernen Sie die Halterungen.
- Ersetzen Sie s durch sich selbst n- mal wiederholt . (Wenn n 0 ist, entferne einfach s .)
- Fahren Sie mit Schritt 1 fort, bis die Eingabe keine übereinstimmenden Klammern mehr enthält.
Zusätzliche Regeln und Erläuterungen:
- Sie nehmen Input und geben Output mit allen erlaubten Mitteln.
- Ein Zeilenumbruch in der Ausgabe ist zulässig.
- Sie müssen nur druckbares ASCII in der Eingabe behandeln.
- Sie können davon ausgehen, dass alle Klammern übereinstimmen, dh Sie erhalten niemals die Eingabe
[]]]]
oder[[[[]
. - Sie können davon ausgehen, dass
]
hinter jeder schließenden Klammer eine Ziffer steht.
Testfälle:
Input -> Output
[Foo[Bar]3]2 -> FooBarBarBarFooBarBarBar
[one]1[two]2[three]3 -> onetwotwothreethreethree
[three[two[one]1]2]3 -> threetwoonetwoonethreetwoonetwoonethreetwoonetwoone
[!@#[$%^[&*(]2]2]2 -> !@#$%^&*(&*($%^&*(&*(!@#$%^&*(&*($%^&*(&*(
[[foo bar baz]1]1 -> foo bar baz
[only once]12 -> only once2
[only twice]23456789 -> only twiceonly twice3456789
[remove me!]0 ->
before [in ]2after -> before in in after
Da dies Codegolf ist , gewinnt die kürzeste Antwort in jeder Sprache. Viel Glück!
code-golf
string
compression
decode
MD XF
quelle
quelle
s
niemals andere Klammern enthalten sollte? Der Versuch, eine Lösung[Foo[Bar]3]2
durchFoo[Bar
Foo[BarFoo[BarFoo[Bar]2
[a[b]2c[d]2e]2
? Sie erhalten,abbcddeabbcdde
indem Sie sich ausdehnenb
undd
zuerst, aber,ababcdbcdedbabcdbcdede
indem Sie sich ausdehnena[b
undd]2e
zuerst.Antworten:
Gema , 17 Zeichen
Probelauf:
quelle
Retina ,
242322 BytesProbieren Sie es online! Dies ist praktisch in Retina 1 eingebaut. Bearbeiten: 1 Byte dank @Kobi gespeichert.
4745 Bytes in Retina 0.8.2:Probieren Sie es online!
quelle
Haskell ,
10196 BytesProbieren Sie es online! Anstatt reguläre Ausdrücke wie die meisten anderen Antworten zu verwenden, wird ein rekursiver Parser implementiert.
-5 Bytes dank BMO !
quelle
(%)
sichert Ihnen 1 Byte und['1'..d]
sichert Ihnen weitere 4, siehe hierzu .Perl 5 ,
343329 + 1 (-p
) = 30 BytesProbieren Sie es online!
Reduzieren Sie es mit Hilfe von @Shaggy und @TonHospel.
quelle
]
.perl -pe 's/.([^[]*?)](.)/$1x$2/e&&redo'
undperl -pe 's/.([^][]*)](.)/$1x$2/e&&redo'
Japt v2 ,
212019 Bytes2 Bytes dank @Shaggy gespart
Online testen!
e
ist rekursives Ersetzen, dh es wird jeweils ein Ersatz erstellt, bis keine Übereinstimmungen mehr vorhanden sind. In diesem Fall werden Übereinstimmungen des regulären Ausdrucks/\[([^[]*?)](\d)/g
durch <innerer Text> ersetzt, die <Ziffern> Male wiederholt werden, bis keine Übereinstimmungen mehr vorhanden sind.Nach meinem Plan ( hier ) sollte dieser reguläre Ausdruck mindestens
3 bis2 Byte kürzer sein:quelle
]
eine Ziffer nach hat es sollten Sie in der Lage sein , zu ersetzen“(\d
mit(.
.\[
mit.
JavaScript,
716766 BytesIch hatte eine 54-Byte-Lösung, aber sie wurde durch den zweiten Testfall beschädigt! :(
Testfälle
quelle
Python 3 ,
1109392 BytesProbieren Sie es online!
-17 Bytes dank pizzapants184 -1 Bytes dank Kevin Cruijssen
quelle
in
.(\d)
in(.)
, da wir wissen, dass auf eine Blockklammer]
immer eine Ziffer folgt.Scala , 173 Bytes
Probieren Sie es online!
Erweitert:
Alte Lösung
Scala ,
219215213212199BytesProbieren Sie es online!
Erweitert:
Wobei l die Liste der Zeichenfolgen ist, die wir verarbeiten werden.
Vielen Dank an Kevin Cruijssen für -1 Byte
Ging von 212 bis 199 durch Entfernen eines nicht verwendeten Parameters, achtete nicht darauf.
quelle
(\d)
an(.)
, weil wir eine Block-Halterung wissen]
immer gefolgt von einer Ziffer wird.Gestapelt ,
3938 BytesDank Shaggy 1 Byte gespart, Regex golfen!
Probieren Sie es online!
Ersetzt einfach rekursiv einen regulären Ausdruck
'\[([^[\]]+)](.)'
durch die Wiederholungsregel.quelle
]
.Python 3,
15514810197 BytesProbieren Sie es online
Danke an HyperNeutrino und Mego für -47 Bytes und user202729 für -4 Bytes.
quelle
def f(x):a=x.rfind('[');b=x.find(']',a);return f(x[:a]+x[a+1:b]*int(x[b+1])+x[b+2:])if~a else x
JavaScript -
777572 BytesBearbeiten: Regex mit Shaggys Empfehlung aktualisiert
Snippet:
Code-Snippet anzeigen
quelle
f=
!QuadR mit dem
≡
Argument,3028 BytesProbieren Sie es online!
\[[^[]+?].
Ersetzen Sie "[
non-[
stuff]
character" durch¯2↓⍵M
die letzten beiden Zeichen des Tropfens M atch ( „]
digit‚)1↓
fallen das erste Zeichen (‘[
“)⊂
einschließen als Ganzes behandelt zu werden(
...)⍴
r eshape auf Länge:⌽⍵M
Umkehren der M atch⊃
die erste (die Ziffer) Wählen⍎
auszuwerten∊
ε nlist ( ebnen)≡
Wiederholen, bis keine Änderungen mehr vorgenommen werdenDie äquivalente Dyalog APL-Funktion ist 47 Bytes:
Probieren Sie es online!
quelle
Java 8,
250249241239 Bytes-2 Bytes dank @JonathanFrech (Code enthält jetzt zwei nicht druckbare ASCII-Zeichen, die im TIO-Link unten zu sehen sind).
Seufz ... Java mit Regex ist so verdammt begrenzt. Ich zitiere mich einfach aus einer anderen Antwort hier:
Erläuterung:
Probieren Sie es online aus.
quelle
Wolfram Language (Mathematica) , 86 Byte
Probieren Sie es online!
quelle
C
407368 BytesVielen Dank an Jonathan Frech für das Speichern von Bytes.
golfed (dateiklammer.c):
ungolfed mit programm:
Kompiliert mit gcc 5.4.1,
gcc bracket.c
quelle
malloc
undrealloc
, auchstdlib.h
von sich aus, zu erraten .Rot , 147 Bytes
Ungolfed:
Ich habe erst gestern angefangen, Reds Parse-Dialekt zu lernen, daher bin ich sicher, dass mein Code weiter verbessert werden kann. Parse ist unvergleichlich ausführlicher als Regex, aber es ist sehr klar, flexibel und lesbar und kann frei mit dem Rest der roten Sprache gemischt werden.
Probieren Sie es online!
quelle
Gelee , 30 Bytes
Probieren Sie es online!
Erläuterung.
quelle
C 381 Bytes
Kompakte Version:
Vollversion:
quelle
Python, 80 Bytes
Probieren Sie es online!
s("[Foo[Bar]3]2")
Konvertiert[Foo[Bar]3]2
zu''+('Foo'+('Bar')*3+'')*2+''
und wertet aus.Eingabe mit Anführungszeichen in Klammern schlägt fehl (z. B.
[']3
)quelle