Hier sind einige Beispieleingaben, damit ich erklären kann, wo das Problem liegt:
((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))
Stellen Sie sich diese Textzeile als topografische Karte einiger Berge vor. Jede Klammer gibt eine Höheneinheit an.
Wenn wir dies von der Seite "sehen", so dass wir die Berge vertikal sehen, werden wir sehen:
4 5 cherries woohoo
1 2 3 moo lik e
i
Bei einer dieser topografischen Karten geben Sie die Karte aus, jedoch in einem vertikalen Maßstab, wie in der obigen Ausgabe. Trennen Sie die verschiedenen Elemente in der Karte mit der Anzahl der Zeichen zum nächsten Element. Beispielsweise enthält die Ausgabe 4 Leerzeichen zwischen moo
und i
. Ebenso enthält die Eingabe zwischen moo
und 4 Zeichen i
.
Der Code, der dies mit der geringsten Anzahl von Zeichen tut, gewinnt.
code-golf
string
balanced-string
beary605
quelle
quelle
((1 2))))))))))3
ungültig sein, wenn negative Höhen verboten sind.Antworten:
J,
87797270675756 ZeichenÜbernimmt Eingaben von der Tastatur. Beispiel:
Erläuterung:
Diese Erklärung basiert auf der ersten Version meines Programms:
x=.1!:1[1
Eingaben von der Tastatur nehmen undx
für später speichern(('('&([:+/=)-')'&([:+/=))\,.i.@#)
Erstellt eine Liste aller Indices in der Zeichenfolge (i.@#
) und setzt,.
sie zusammen mit dem Ergebnis des(('('&([:+/=)-')'&([:+/=))\
Verbs zusammen ( ) .(('('&([:+/=)-')'&([:+/=))\
Dieses Verb wird auf alle Präfixe der Zeichenfolge angewendet (so bei Eingabehello
wäre es geltenh
,he
,hel
,hell
, undhello
. Es ist eine Gabel , die die Anzahl der offenen Klammern zählt('('&([:+/=)
und subtrahiert dann die Anzahl der Klammer zu')'&([:+/=)
. Das gibt mir die Liste von Indices in die Zeichenfolge und die Ebene, auf der sich das Zeichen an diesem Index in der Ausgabe befinden soll. Bei einfacher Eingabe ergibt sich Folgendes:((' '$~{.@]),[{~{:@])"1
Dies ist ein Verb, das die Liste, die ich gerade erstellt habe, und auch die Ausgabe von aufnimmt('( ) 'charsub x)
(wobei nur ein String ersetzt wird, um alle Klammern durch Leerzeichen in zu ersetzenx
). Es nimmt das Ende jedes Elements der Liste{:@]
und verwendet es als Index in der Zeichenfolge, um das Zeichen abzurufen[{~{:@]
. Dann wird ihm,
die Anzahl der Leerzeichen vorangestellt, die durch den Kopf jedes Elements in der Liste angegeben sind(' '$~{.@])
. Auf dem vorherigen Beispiel gibt mir das:Ich transponiere dann das Array
|:
und kehre es|.
um, um die gewünschte Ausgabe zu erhalten.quelle
GolfScript
69Online Demo hier .
Erläuterung:
quelle
APL (59)
Ich bin davon ausgegangen, dass die "Basis" auch verwendbar sein muss. (dh
(a(b))c(d)
ist gültig). Ist dies nicht erforderlich, können zwei Zeichen gespeichert werden.Erläuterung:
T←⍞
: speichere eine Eingabezeile in T'()'∘=¨T
: Prüfen Sie für jedes Zeichen in T, ob es sich um eine öffnende oder schließende Klammer handelt. Dies gibt eine Liste von Listen von Booleschen Werten.1 ¯1∘ר
: Multiplizieren Sie das zweite Element in jeder dieser Listen mit -1 (eine öffnende Klammer ist also 1, eine schließende -1 und jedes andere Zeichen ist 0).+/¨
: Nimm die Summe jeder inneren Liste. Wir haben jetzt den ∆y-Wert für jedes Zeichen.P←
: Geschäft in P.R←1++\P
: Nimm eine laufende Summe von P und gib die Höhe für jedes Zeichen an. Fügen Sie jedem Zeichen ein Zeichen hinzu, sodass sich Zeichen außerhalb der Klammern in der ersten Zeile befinden.(⍴T)∘⍴¨⍳⌈/R
: Erstellen Sie für jeden möglichen y-Wert eine Liste mit der Länge T, die nur aus diesem Wert besteht. (dh 1111 ..., 2222 .... usw.)R∘=¨
: Prüfen Sie für jedes Element in dieser Liste, ob es gleich R ist. (Für jede Ebene haben wir jetzt eine Liste von Nullen und Einsen, die angeben, ob ein Zeichen auf dieser Ebene erscheinen soll oder nicht.)⍵×P=0
: Setzen Sie für jede dieser Listen den Wert auf Null, wenn P an dieser Stelle nicht Null ist. Dadurch werden die Zeichen mit einem Delta-y ungleich Null entfernt, sodass die Klammern entfernt werden.⊃,/T\¨⍨
: Wählen Sie für jede Tiefe aus T die Zeichen aus, die angezeigt werden sollen.⊖↑
: Erstelle eine Matrix und lege sie mit der rechten Seite nach oben.quelle
Tcl, 50
Art zu betrügen, aber gut ..
Ich verwende ASCII-Escape-Sequenzen, um die
^[[A
Zeilendifferenz zu ermitteln. Das bedeutet, dass der Cursor 1 nach oben und der^[[B
Cursor 1 nach unten verschoben wird.quelle
APL, 41 Zeichen / Byte *
Getestet auf Dyalog, mit
⎕IO←1
und⎕ML←3
Umgebung. Es ist eine Funktion, die die erforderliche Eingabe übernimmt und die Ausgabe zurückgibt. Angesichts der Formulierung der Frage glaube ich, dass sie akzeptabel ist. Falls nicht, hier ist eine Version, die von stdin liest und in stdout schreibt, für 4 Zeichen mehr:Erklärung :
Beispiele:
*: APL kann in einer Vielzahl älterer Einzelbyte-Zeichensätze gespeichert werden, die APL-Symbole den oberen 128 Byte zuordnen. Aus diesem Grund kann ein Programm, das nur ASCII-Zeichen und APL-Symbole verwendet, zum Golfen als Zeichen = Byte gewertet werden.
quelle
⍨
Symbol nicht finden . Es sieht aus wie eine Kombination aus den Zeichen¨
und~
?~
und¨
, obwohl es ein anderes Zeichen als beide ist. Es ist ein Operator namens Commute . In seiner dyadischen Form dreht sie die Argumente der dyadischen Funktion es angewendet:(5-2)=(2-⍨5)
. Als monadischen Operator stellt sich eine dyadische Funktion in monadischen, das richtige Argument zu duplizieren:(2*2)=(*⍨2)
. Es wird meistens verwendet, um einen ununterbrochenen Strom von Funktionen von rechts nach links zu schreiben, ohne große Ausdrücke in Klammern zu setzen und mit den Augen darum herumzuspringen. Beim Golfen ist es nützlich, weil3*⍨1-2
ein Char weniger ist als(1-2)*3
:-)~
in J dann.J, 56 Zeichen
Eine weitere 56-Zeichen - J - Lösung ... I zählen Tiefe durch die Übersetzung
(
in ⁻1,)
in 1 und alle anderen Zeichen in 0, und dann nimmt die laufende Summe dieses:[: +/\ 1 _1 0 {~ '()'&i.
. Der Rest ähnelt weitgehend der @ Gareth-Lösung.quelle
Python, 161 Zeichen
quelle
Python, 130
quelle
Ruby 1,9 (129)
Liest von stdin.
quelle
//
, bei''
dem die Anzahl der Charaktere gleich bleibt und der Fehler im Textmarker vermieden wird.C 132 Zeichen
In der Beschreibung wurde nicht angegeben, wie viele Eingaben die Übermittlung akzeptieren musste, um akzeptiert zu werden. Daher habe ich mich auf die Grenzen festgelegt, die meinen Golferfordernissen am ehesten entsprachen (während ich immer noch mit der angegebenen Beispieleingabe arbeitete). Lassen Sie mich diese Gelegenheit nutzen, um die Leute daran zu erinnern, dass es oft eine gute Idee ist, in Ihren Herausforderungsbeschreibungen Mindestmaxima anzugeben.
Der Code enthält zwei Hauptschleifen. In der ersten Schleife werden alle nicht in Klammern gesetzten Zeichen in die entsprechende Ausgabezeile ausgegeben, und in der zweiten Schleife wird jede Zeile gedruckt.
quelle
C 149 Zeichen
mit angegebenem Argument ausführen, zB "((1 2) (3 (4 5) moo)) (i (lik (kirschen) e (woohoo)))"
quelle
Oktave, 128
Sehr ähnlich zu meiner letzten Antwort ...
Prüfung
Eingang:
"((1 2)(3 (4 5) moo)) (i (lik(cherries)e (woohoo)))"
Ausgabe:
quelle
229 Bytes
Wenn es keine Einschränkung für den vertikalen Abstand zwischen den Zeilen gibt, können Sie diese verwenden (der Übersichtlichkeit halber eingerückt). Sie initialisiert den Cursor
(
vor dem Drucken für jede gefundene Zeile um eine Zeile nach unten und bewegt den Cursor beim Lesen von Klammern nach oben und unten.quelle
PowerShell ,
120 bis119 ByteProbieren Sie es online!
Nebenwirkungen: Zeichnet
&
und'
ändert die Höhe wie(
und)
, wird jedoch angezeigt. Ergebnisse vergleichen für:Weniger golfen:
quelle
VB.net (für S & G)
Nicht der schönste Code.
quelle