Um einen String zu "verschachteln", müssen Sie:
Behandeln Sie das erste Zeichen als Funktion und die folgenden Zeichen als Argumente für diese Funktion. Wenn die Eingabezeichenfolge beispielsweise lautet
Hello
, lautet der erste Schritt:H(ello)
Wiederholen Sie diesen Schritt dann für jeden Teilstring. So bekommen wir:
H(ello) H(e(llo)) H(e(l(lo))) H(e(l(l(o))))
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die einen String "verschachtelt". Wenn zum Beispiel die Eingabezeichenfolge war Hello world!
, sollten Sie Folgendes ausgeben:
H(e(l(l(o( (w(o(r(l(d(!)))))))))))
Die Eingabe enthält immer nur druckbares ASCII , und Sie können die Eingabe und die Ausgabe in jedem vernünftigen Format vornehmen. Zum Beispiel STDIN / STDOUT, Funktionsargumente und Rückgabewert, Lesen und Schreiben in eine Datei usw.
Der Einfachheit halber können Sie auch davon ausgehen, dass die Eingabe keine Klammern enthält und nicht leer ist.
Input:
Nest a string
Output:
N(e(s(t( (a( (s(t(r(i(n(g))))))))))))
Input:
foobar
Output:
f(o(o(b(a(r)))))
Input:
1234567890
Output:
1(2(3(4(5(6(7(8(9(0)))))))))
Input:
code-golf
Output:
c(o(d(e(-(g(o(l(f))))))))
Input:
a
Output:
a
Input:
42
Output:
4(2)
Wie immer gelten alle unsere Standardregeln und Regelungslücken, und die kürzeste Antwort in Bytes gewinnt!
quelle
You may take the input and the output in any reasonable format.
Eine Liste von Charakteren erscheint mir vollkommen vernünftig.Antworten:
Python,
413934 BytesIdeone es
Ziemlich selbsterklärend.
Es setzt eine Klammer zwischen jedes andere Zeichen und fügt am Ende eine Klammer weniger als die Länge hinzu.
quelle
-
macht die Zahl negativ und~
Bit kippt es. Sie können ein bisschen mehr darüber auf der Seite mit den Tipps lesen .MS-DOS-.com-Datei 30 Byte
Die Zeichenfolge wird über die Befehlszeile an die ausführbare Datei übergeben. (Ein Leerzeichen zwischen dem .COM-Dateinamen und der Zeichenfolge).
Das Ergebnis wird in die Standardausgabe geschrieben.
Die Demontage ist hier:
Hinweis: Sie können eine DOS .COM-Datei (im Gegensatz zu Dateien mit EXE-Headern) mit einer "RET" -Anweisung beenden.
quelle
call 0xfoff
? Das Programm wird unter der angegebenen Adresse in den Speicher geladen0
(oder0x100
unter CP / M-DOS, aber es handelt sich anscheinend um x86-Anweisungen). Warum befindet es sichrecursiveFunction
plötzlich unter0xffof
? Es scheint 9 Bytes nach dem Start des Programms zu beginnen, und die ausführbare Datei enthält keine Virtualisierung oder Metadaten.0x100
aber dieses Programm würde sogar mit JEDER Adresse laufen:e8 f0 ff
ist ein relativer Aufrufbefehl: Es springt zur Adresse des Befehls, der demcall
Befehl minus 0x10 folgt .JavaScript (ES6),
403433 Bytes6 Bytes gespart dank ETHproductions
Eine rekursive Funktion.
Probieren Sie es online!
quelle
1/s
.([c,...s])
du einen Tipp schreibenBrainfuck,
4240 BytesProbieren Sie es online!
Ungolfed:
quelle
05AB1E , 11 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Brainfuck, 44 Bytes
Liest ein Byte nach dem anderen, setzt vor jedes ein Open-Paren, mit Ausnahme des ersten, und setzt am Ende die gleiche Anzahl von Close-Parens.
quelle
+++++[->++++++++<],.,[>.>+<<.,]>+>[-<.>]
ist etwas kürzer.Haskell, 30 Bytes
Anwendungsbeispiel:
f "Nest a string"
->"N(e(s(t( (a( (s(t(r(i(n(g))))))))))))"
.Nehmen Sie das nächste Zeichen, gefolgt von einem
(
, gefolgt von einem rekursiven Aufruf mit allen bis auf das erste Zeichen, gefolgt von einem)
.quelle
f=Data.List.intersperse '$'
! Das gibt unsf "Nest a string"
->"N$e$s$t$ $a$ $s$t$r$i$n$g"
.f[]=[]
abzugeben ) vorgeschlagen hat, es als Basisfall zu verwenden, der von Ihnen installiert wurdef[x]=[x]
. Ich kenne Haskell nicht, also weiß ich nicht, ob es echt ist oder nicht. Ich überlasse es Ihnen zu urteilen.()
hinter dem letzten Buchstaben steht, zBf "abc"
->"a(b(c()))"
.f=(++).intersperse '('<*>drop 1.map(\_->')')
.intersperse
benötigtimport Data.List
weitere 17 Bytes.Gelee ,
98 Bytes-1 Byte dank @Dennis (benutze mold
ṁ
, anstelle von lengthL
, und wiederhole,x
)TryItOnline
Wie?
quelle
³
bewirkt Jelly, dass der aktuelle Rückgabewert gedruckt wird, sodass Sie nie zwei Listen mit Zeichen haben.Netzhaut ,
2217 BytesProbieren Sie es online!
Alternative:
Erläuterung
Ich vergesse immer, dass es möglich ist, Dinge auf dem Weg zu drucken, anstatt alles in das Endergebnis umzuwandeln und es auf einmal auszugeben ...
Hier
\
weist Retina an, das Ergebnis dieser Phase ohne nachfolgenden Zeilenvorschub zu drucken. Das1>
ist eine Grenze , was bedeutet , dass das erste Spiel des regulären Ausdrucks ignoriert werden soll. Die Bühne selbst ersetzt einfach jedes Zeichen (.
) mit Ausnahme des ersten durch(
gefolgt von diesem Zeichen. Mit anderen Worten, es wird(
zwischen jedes Zeichenpaar eingefügt. Bei der Eingabeabc
wandelt sich dies in (und druckt)Jetzt müssen Sie nur noch die schließenden Klammern drucken:
Dies wird mit einer Umschrift durchgeführt , die ersetzt
(
mit)
und löscht alle anderen druckbaren ASCII - Zeichen aus der Zeichenfolge.quelle
> <> ,
1918 BytesProbieren Sie es online!
Erläuterung
Die erste Zeile ist eine Eingabeschleife, die alles bis zum letzten Zeichen der Eingabe (einschließlich aller
(
) druckt und die richtige Menge von)
auf dem Stapel belässt :Sobald wir EOF drücken, landet der Anweisungszeiger in der zweiten Zeile und wir werden einfach
o
in einer Schleife ausgeführt und drucken alles aus)
, bis der Stapel leer ist und das Programm fehlerfrei ist.quelle
C #, 32 Bytes
Dieses Lambda muss eine statische Methode sein. Muss ich für diese Anforderung zusätzliche Bytes zählen? Normalerweise würde ich kein Lambda für die Rekursion in C # verwenden, aber dann denke ich, dass es kürzer wäre, keine Rekursion zu verwenden.
quelle
J, 13 Bytes
J wird von rechts nach links ausgeführt, sodass mit dem Einfügeadverb
/
ein Verb verwendet werden kann, um die Buchstaben der Eingabezeichenfolge zu reduzieren.Verwendungszweck
Sie können die Teilleistungen zwischen den einzelnen Reduzierungen beobachten.
Erläuterung
quelle
R, 61 Bytes
Regex findet und ersetzt Leerzeichen zwischen den Zeichen mit „(“. Dann
cat
undrep
fügen Sie „)“ n-1 mal am Ende.quelle
PowerShell v2 +, 46 Byte
Nimmt die Eingabezeichenfolge,
char
-array ist es,-join
s das Array zusammen mit offenen Parens(
und verkettet dann die entsprechende Anzahl geschlossener Parens)
.quelle
Acc !! 129 Bytes
Nicht schlecht für eine ziemlich wortreiche Turing-Plane ...
(Ja, das ganze Leerzeichen ist obligatorisch.)
Hinweis: Wegen der Eingabebeschränkungen von Acc !! Ist es nicht möglich, eine beliebige Zeichenfolge ohne Endbegrenzer zu lesen? Daher erwartet dieses Programm die Eingabe (in stdin) als Zeichenfolge, gefolgt von einem Tabulatorzeichen.
Acc !! ?
Es ist eine Sprache, die ich erstellt habe und die nur unbrauchbar zu sein scheint . Der einzige Datentyp ist Integer, das einzige Kontrollflusskonstrukt ist die
Count x while y
Schleife und die einzige Möglichkeit, Daten zu speichern, ist ein einzelner Akkumulator_
. Die Ein- und Ausgabe erfolgt zeichenweise unter Verwendung des speziellen WertsN
und derWrite
Anweisung. Trotz dieser Einschränkungen bin ich mir ziemlich sicher, dass Acc !! ist Turing-komplett.Erläuterung
Die Grundstrategie in Acc !! Bei der Programmierung wird der Akkumulator konzeptionell durch Mod-
%
und Integer-Division/
partitioniert, sodass mehrere Werte gleichzeitig gespeichert werden können. In diesem Programm werden drei solcher Abschnitte verwendet: Die sieben Bits (_%128
) niedrigster Ordnung speichern einen ASCII-Code von der Eingabe; das nächste Bit (_/128%2
) speichert einen Flag-Wert; und die verbleibenden Bits (_/256
) zählen die Anzahl der von uns benötigten engen Parens.Eingabe in Acc !! kommt von dem speziellen Wert
N
, der ein einzelnes Zeichen liest und zu seinem ASCII-Code auswertet. Jede Anweisung, die nur aus einem Ausdruck besteht, weist das Ergebnis dieses Ausdrucks dem Akkumulator zu. Also speichern wir zunächst den Code des ersten Zeichens im Akkumulator._%128
speichert das zuletzt gelesene Zeichen. Die erste Schleife läuft also solange_%128-9
, bis das aktuelle Zeichen ein Tabulator ist.Innerhalb der Schleife möchten wir drucken, es
(
sei denn, wir befinden uns in der ersten Iteration. Seit Acc !! Wenn keine if-Anweisung vorhanden ist, müssen Schleifen für Bedingungen verwendet werden. Wir verwenden das 128-Bit des Akkumulators_/128%2
als Flag-Wert. Beim ersten Durchlauf ist das einzige, was sich im Akkumulator befindet, ein ASCII-Wert <128, daher ist das Flag 0 und die Schleife wird übersprungen. Bei jedem weiteren Durchgang stellen wir sicher, dass das Flag 1 ist.Innerhalb der
Count x
Schleife (wenn das Flag 1 ist) schreiben wir einen offenen Paren (ASCII40
) und addieren 128 zum Akkumulator. Dadurch setzen wir das Flag auf 0 und verlassen die Schleife. Dies geschieht auch, um den Wert von_/256
zu erhöhen, den wir als unsere Liste der auszugebenden engen Parens verwenden werden.Unabhängig vom Wert des Flags schreiben wir das neueste Eingabezeichen, was einfach ist
_%128
.Die nächste Anweisung (
_+128-_%128+N
) führt zwei Dinge aus. Durch Hinzufügen von 128 wird zunächst das Flag für den nächsten Durchlauf der Schleife gesetzt. Zweitens wird der_%128
Slot auf Null gesetzt, ein anderes Zeichen gelesen und dort gespeichert. Dann schleifen wir.Wenn die
Count i
Schleife beendet wird, haben wir gerade ein Tabulatorzeichen gelesen und der Akkumulatorwert bricht folgendermaßen zusammen:_%128
:9
(das Tabulatorzeichen)_/128%2
:1
(die Flagge)_/256
: Anzahl der gelesenen Zeichen minus 1(Das Minus 1 liegt daran, dass wir beim ersten Durchlauf durch die Hauptschleife nur einmal 128 zum Akku addieren.) Alles, was wir jetzt brauchen, sind die engen Parens.
Count j while _/256-j
Schleifen Sie die_/256
Zeiten ab und schreiben Sie41
jedes Mal ein enges Paren (ASCII ). Voila!quelle
Java 7,
8179 BytesGespeichert
1
byte.Thanks zu kevin.quelle
l!=a.length
->l<a.length
undb=b+'('+a[l],++l)+')'
->b+="("+a[l],++l)+")"
( -2 Bytes )b+="("+a[l],++l)+")"
gibt Ihnen 144141148))), und BTWb+"("+a[l],++l)+")"
ist richtig. und das war ein sehr dummer Fehler von mir (!=
).b+='('+a[l],++l)+')'
gibt144141148
,b+="("+a[l],++l)+")"
tut es aber nicht. Die Klammern sind von Anführungszeichen anstelle von Anführungszeichen umgeben.APL, 19 Bytes
Erläuterung:
Alternativlösung, auch 19 Bytes:
Erläuterung:
quelle
MATL , 16 Bytes
Probieren Sie es online!
Erläuterung
quelle
Perl, 25 Bytes
Vielen Dank an @Ton Hospel für die Ausgabe von 4 Bytes.
24 Byte Code +
-F
.Bedürfnisse
-F
und-E
Flaggen:Beachten Sie, dass Sie möglicherweise
-a
flag hinzufügen müssen, wenn Sie dies auf einer alten Version von Perl versuchen .Ein weiterer interessanter Weg (allerdings etwas länger: 28 Bytes): Nochmals
vielen Dank an Ton Hospel, der mir geholfen hat, diesen Weg in Ordnung zu bringen.
(Um es zu benutzen, geben Sie den Code in eine Datei ein und rufen Sie ihn mit auf.
echo -n "Hello" | perl nest.pl
)quelle
""
nach dem-F
. Das brauchen Sie auch nicht,-l
wenn Sie verlangen, dass die Eingabezeichenfolge ohne letzte Zeile eingegeben wird:echo -n Hello | program
-F
, danke. (Ich habe mich gefragt, wie ich die Eingabe ohne die letzte Zeile bekommen soll, danke auch dafür)perl -F -E '$"="(";say"@F".")"x$#F'
s/.(?=.)/s%$'%($&)%/reg
, aber es unterstützt natürlich keine Zeichenfolgen mit Regex-Metazeichen\Q
, um Regex-Metazeichen zu unterstützen) :-)Ruby, 27 Bytes
Erläuterung
quelle
Perl,
2423 BytesBeinhaltet +1 für
-p
Geben Sie in STDIN einen String ohne Zeilenumbruch ein (oder fügen Sie
-l
dem Programm eine Option hinzu)nest.pl
:quelle
GNU sed,
373531 Bytes (30 +1 für-r
Argument)Reine Linux-Lösung
:
; dann mit rekursiv aufrufent
\1 ( \2 )
Edit : Danke an @manatwork für die Hilfe beim Entfernen von 4 Zeichen!
Online-Tester
quelle
-e
Weitergabe des Codes an den Dolmetscher ist kostenlos. (Ok,sed
ist auch ohne glücklich.) Also fürsed -re '…'
dich zählt +1.Qualle ,
1918 BytesDas Zeichen
␁
ist das nicht druckbare Steuerzeichen mit Bytewert0x1
. Probieren Sie es online!Erläuterung
Dies ist ein ziemlich komplexes Jellyfish-Programm, da viele Werte an mehreren Stellen verwendet werden.
I
ist eine unformatierte Eingabe, die aus STDIN als Zeichenfolge gelesen wird.'(
ist das buchstäbliche Zeichen(
.{
(linke Identität) nimmt'(
undI
als Eingaben und kehrt zurück'(
. Der Rückgabewert wird nie verwendet.`
ist Faden. Es ändert sich{
, um das Zeichen(
für jedes Zeichen von zurückzugebenI
, was zu einer Zeichenfolge von(
s mit der gleichen Länge wie führtI
.>
ist Schwanz; es nimmt den String von(
s als Eingabe und schneidet das erste Zeichen ab.+
(
Nimmt als Argumente die Zeichenfolge von s und das nicht druckbare Byte und fügt jedem Zeichen den Bytewert (1) hinzu. Dies ergibt eine Zeichenkette gleicher Länge von)
s. Die Verwendung des Zeichens␁
garantiert, dass der Rückgabewert eine Zeichenfolge und keine Liste von Ganzzahlen ist./
Nimmt in der unteren linken Ecke das nicht druckbare Byte und gibt eine Funktion zurück , die zwei Argumente annimmt und das zweite Argument einmal mit dem ersten Argument verbindet (da der Bytewert 1 ist)._
Nimmt diese Funktion, greift die Argumente der niederen{
(die waren'(
undI
) und ruft die Funktion mit ihnen auf. Dies fügt das Zeichen(
zwischen jedes Zeichenpaar in einI
.,
Verkettet diesen String mit dem String von)
s und gibtP
das Ergebnis aus.quelle
05AB1E ,
22211918 BytesProbieren Sie es online!
Erläuterung:
quelle
PHP, 63 Bytes
Vorherige Version 64 Bytes
quelle
<?=
anstelle vonecho
und ein anderes Byte verwenden, wenn Sie statt $ s das Ergebnis desstr_split
Aufrufs$argv[1]
count($s)
strlen($s)
<?=str_pad(join("(",$s=str_split($argv[1])),count($s)*3-2,")");
-wordwrap
würde die Split / Join-Kombination schlagen, scheitert aber leider, wenn die Eingabe Leerzeichen enthält.Vim, 17 Bytes
$qqha(<Esc>A)<Esc>%h@qq@q
Geht von Ende zu Anfang, weil du sonst über die
)
s stolperst, die du schon geschrieben hast. Verwendet,ha
anstatti
zu versagen, wenn es den Anfang erreicht.Normalerweise würden Sie nicht zwei separate Einfügungen wie diese durchführen. Sie würden etwas tun
C()<Esc>P
, um einen Schlaganfall zu retten. Aber die Positionierung funktioniert diesmal nicht so gut.quelle
<End>
Taste im Einfügemodus verwenden, anstatt den Einfügemodus zu verlassen und zu tunA
Brain-Flak
10397 BytesBeinhaltet +3 für -c
Probieren Sie es online!
Erläuterung:
quelle
{({}<><(((((()()){}()){}){}){})>)<>}<>({}<(({})<>())><>)([]){({}[()()]<(<>({})<>)>)}{}{}{({}<>)<>}<>{}
-a
in Brain-Flak überhaupt 3 Bytes ?+3
Bytes sind Standard für spezielle Befehlszeilenflags . Welches ist unglücklich, aber etwas, das ich ertragen kann. Eigentlich habe ich mir überlegt, wie ich das verkürzen könnte, aber ich bin mir noch nicht ganz sicher, wie.-
und eins für die Flagge? Sie könnten ein Flag für die normale Ausführung haben, wie Perl es tut-e
. Auf diese Weise wäre es nur 1 zusätzliches Byte.Dyalog APL , 14 Bytes
⊃{⍺,1⌽')(',⍵}/
Dies ist eine Spitze von
⊃
und{ }/
⊃
(erstes Element holen) wird angewendet nach{ }/
(Reduktion eines Lambda)⍺,1⌽')(',⍵
- das linke Argument (⍺
) verknüpft mit (,
) der Drehung um ein Element nach links (1⌽
) der Zeichenfolge')('
verknüpft mit (,
) dem rechten Argument (⍵
)Reduzierung der APL-Falten von rechts nach links, wie hier erforderlich
quelle
Konvex , 10 Bytes
Probieren Sie es online!
quelle
> <> , 37 Bytes
Reihe für Reihe
Probieren Sie es online!
quelle