Matching-Algorithmus in Klammern für Golf A

25

Sie erhalten eine Zeichenfolge s. Es ist garantiert, dass die Zeichenfolge gleich ist und mindestens ein [s und ]s hat. Es ist auch garantiert, dass die Klammern ausgeglichen sind. Die Zeichenfolge kann auch andere Zeichen enthalten.

Das Ziel ist die Ausgabe / Rückgabe einer Liste von Tupeln oder einer Liste von Listen, die Indizes für jedes [und jedes ]Paar enthalten.

Hinweis: Die Zeichenfolge ist nullindexiert.

Beispiel: !^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]sollte zurückkehren

[(8, 41), (20, 33), (21, 27), (36, 39), (42, 48), (49, 50)]oder so ähnlich. Tupel sind nicht erforderlich. Listen können ebenfalls verwendet werden.

Testfälle:

input:[[asdf][][td([)ty54g% ]hg[[f]u][f[[jhg][gfd]sdf]sdfs]ghd]fr43f]
output:[(0, 62),(1, 6), (7, 8), (9, 56), (13, 22), (25, 30), (26, 28), (31, 52), (33, 47), (34, 38), (39, 43)]
input:[[][][][]][[][][][[[[(]]]]]))
output:[(0, 9), (1, 2), (3, 4), (5, 6), (7, 8), (10,26),(11, 12), (13, 14), (15, 16), (17, 25), (18, 24), (19, 23), (20, 22)]
input:[][][[]]
output:[(0, 1), (2, 3), (4, 7), (5, 6)]
input:[[[[[asd]as]sd]df]fgf][][]
output:[(0, 21), (1, 17), (2, 14), (3, 11), (4, 8), (22, 23), (24, 25)]
input:[]
output:[(0,1)]
input:[[(])]
output:[(0, 5), (1, 3)]

Das ist , also gewinnt der kürzeste Code in Bytes für jede Programmiersprache.

Windmühle Cookies
quelle
1
Ist die Ausgabereihenfolge wichtig?
Wastl
1
Nein, tut es nicht.
Windmill Cookies
21
msgstr "Hinweis: Die Zeichenfolge ist nullindexiert." - Es ist sehr üblich, Implementierungen zu erlauben, eine konsistente Indizierung für diese Art von Herausforderungen zu wählen (aber es liegt natürlich an Ihnen)
Jonathan Allan
1
Können wir Eingaben als Array von Zeichen annehmen?
Shaggy
7
Kostet

Antworten:

13

Brain-Flak Classic , 108 Bytes

{((((((([][][]){}){}){}()){}){}{}[])()()){{}<>{}(<>)}{}((){[](<{}>)}{}){{}<>[({}<[{}]>)](<>)}{}<>(({}()))<>}

Probieren Sie es online!

Speichert jede Öffnung [im richtigen Stapel und gibt sie aus, wenn wir a drücken ].

Nitrodon
quelle
5

JavaScript, 69 62 Bytes

Ein kurzes Stück Golf im Zug nach Hause. Kann wohl noch verbessert werden.

Nimmt Eingaben als ein Array von Zeichen und gibt ein Objekt aus, wobei die Schlüssel die Indizes der [s sind und deren Werte die Indizes der entsprechenden ]s sind.

a=>a.map((x,y)=>x==`]`?o[a.pop()]=y:x==`[`&&a.push(y),o={})&&o

Probieren Sie es online aus

Zottelig
quelle
Ich kann es kaum fassen, dass Sie mobil Golf spielen können. : P
Oliver
2
@Oliver, bläst es meiner Meinung nach, dass ich (fast) Typ auf Touchscreens überhaupt - Tastaturen bringen!
Shaggy
4

Haskell , 92 79 Bytes

g(u:a)n(']':x)=(u,n):g a(n+1)x
g a n(s:x)=g([n|s=='[']++a)(n+1)x
g[]_[]=[]
g[]0

Probieren Sie es online!

Erläuterung

Wir erstellen eine Funktion, gdie 3 Argumente akzeptiert.

  • a, das sind die Standorte aller unerreichten [s.

  • nDies ist die Anzahl der verarbeiteten Zeichen

  • x Das ist die Charaktere unverarbeitet.

Wenn unser erster Charakter ist ], entfernen wir uvon der Vorderseite unseren aund kehren (u,n)plus zurück, was sonst noch übrig bleibt.

g(u:a)n(']':x)=(u,n):g a(n+1)x

Wenn unser erstes Zeichen nicht ist ], das ist entweder [oder etwas anderes, erhöhen wir nund fügen [n|s=='[']der Vorderseite hinzu a. [n|s=='[']wird sein, [n]ob s=='['und []sonst.

g a n(s:x)=g([n|s=='[']++a)(n+1)x

Wenn wir keine Zeichen mehr haben, geben wir die leere Liste zurück.

g[]_[]=[]
Weizen-Assistent
quelle
1
wow, das sind ein paar nette rekursive Funktionen. Ich bin ein Anfänger auf Haskell, das hat mich beeindruckt :)
Windmill Cookies
@ gnu-nobody Danke! Diese Antwort ist wahrscheinlich nicht optimal, daher würde ich Sie ermutigen, es zu versuchen oder zu warten, bis die ernsthaften Haskell-Golfer eintreffen.
Wheat Wizard
Ich warte lieber, bis die ernsthaften Haskell-Golfer eintreffen
Windmill Cookies
4

Java 10, 95 Bytes

Ein ungültiges Lambda, das die Eingabezeichenfolge als int[]Unicode-Codepunkt verwendet.

s->{int r=0,w=0;for(var c:s){if(c==91)s[w++]=r;if(c==93)System.out.println(s[--w]+","+r);r++;}}

Probieren Sie es online

Ungolfed

s -> {
    int r = 0, w = 0;
    for (var c : s) {
        if (c == 91)
            s[w++] = r;
        if (c == 93)
            System.out.println(s[--w] + "," + r);
        r++;
    }
}

Danksagung

  • Danke an Jonathan Frech für die Idee, den Input-String als Stack zu verwenden ( hier )
Jakob
quelle
Sie müssen definieren rund wals Teil des Codes, nicht als Parameter: s->{int r=0,w=0;...}.
Olivier Grégoire
@ OlivierGrégoire Ein bisschen mehrdeutig, aber es sieht so aus, als ob es mehrere leere Eingänge abdecken sollte.
Jakob
1
Die Antwort, die Sie zitieren, beantwortet explizit die Frage "Dürfen wir stattdessen einen leeren Parameter verwenden, den wir nirgendwo verwenden ?". Sie verwenden diese Eingänge. Ich sehe hier überhaupt keine Mehrdeutigkeit.
Olivier Grégoire
Der Bearbeitungsteil der Frage macht es absolut eindeutig, dass die Variable "nicht verwendet" wird.
Olivier Grégoire
Richtig, aber warum wird in der oberen Antwort (1) nicht angegeben, dass Eingänge nicht verwendet werden, (2) wie hoch die Werte für zusätzliche Eingänge sind und (3) die Möglichkeit des Missbrauchs zusätzlicher Eingänge angegeben? Egal, ich werde die Variablen verschieben.
Jakob
4

Vim, 89 Bytes

:s/\(.\)/\1<C-V><C-M>/g|g/^\[/ :norm %mm%:pu! =line('.').','.line(\"'m\")<C-V><C-M><C-X>$<C-X>J
:v/\[/d|%s/\[//g

Kommentiert

:s/\(.\)/\1<C-V><C-M>/g            " one character per line
|g/^\[/                            " for each opening square bracket:
  :norm %mm%                       "   mark the line with the matching bracket
  :pu! =line('.').','.line(\"'m\") "   write the line numbers to preceeding line
  <C-V><C-M><C-X>$<C-X>J           "   convert to 0-based counting and join lines
:v/\[/d                            " remove all non-opening bracket lines
|%s/\[//g                          " remove brackets

<C-V>ist 0x16. <C-M>ist 0x0d. <C-X>ist 0x18.

Probieren Sie es online!

Strahl
quelle
4

QBasic (QB64), 137 127 112 Bytes

INPUT a$
for i=0to len(a$)
c$=mid$(a$,i+1,1)
if"["=c$then
b(n)=i
n=n+1
elseif"]"=c$then
n=n-1
?b(n),i
endif
next

Wir benötigen vier zwei Bytes, da die Herausforderung eine 0-Indizierung erfordert. Mein erster QBasic-Beitrag, Feedback ist erwünscht.

  • 10 bytes dank steenbergh
  • 3 Bytes dank Erik dem Outgolfer
  • 12 Bytes durch Speichern im Unix-Dateiformat ( \r\n-> \n)

Sieht bei der Ausführung so aus:

Wie es aussieht

wastl
quelle
Schön. Paar Hinweise: Verwendung ?statt print(der Compiler automatisch erweitert dies print), brauchen Sie nicht die Räume zwischen den Strings in Anführungszeichen und THENin den IFs, und Sie können die Drop inach NEXT.
Steenbergh
@steenbergh Huh, scheinbar habe ich vergessen, Leerzeichen zu entfernen ... aber ich habe das zwischen 0und entfernt to? Ich bin verwirrt ...
Wastl
1
Nicht sicher QB64, aber ich denke if c$="["werden kann if"["=c$, elseif c$="]"werden kann elseif"]"=c$, end ifkann sich endif, und mit einer leichten Änderung des Ausgangs, ?b(n),ikann sich ?b(n)i(QBasic 1.1 ist , was ich verwenden, Ihren Fall könnte anders sein).
Erik der Outgolfer
@EriktheOutgolfer alles andere als ?b(n)ifunktioniert
wastl
3

Pyth, 26 Bytes

VQIqN\[=+YZ)IqN\],.)YZ)=hZ

Probieren Sie es hier aus

Erläuterung

VQIqN\[=+YZ)IqN\],.)YZ)=hZ
VQ                     =hZ   For each character in the input (indexed by Z)...
  IqN\[=+YZ)                 ... if the character is [, add the index to Y...
            IqN\],.)YZ)      ... if the character is ], output the previous index
                             and current index.

quelle
Nett! Mein naiver Ansatz war 36 Bytes C,x"[" MQ #.e*qb\[t+lhfSI/LT"[]"._>Q. Edit: Mir ist es auch ein bisschen gelungen Golf zu spielen, ich bin jetzt unter 30.
Mr. Xcoder
3

R , 141 133 115 112 108 Bytes

function(y,x=utf8ToInt(y)){for(i in seq(x)){if(x[i]==91)F=c(i,F);if(x[i]==93){T=c(T,F[1],i);F=F[-1]}};T[-1]}

Probieren Sie es online!

Nichts Besonderes. 1-indiziert, weil ich es gesagt habe. R nicht wirklich Stapel, so dass ich ursprünglich verwendet c, headund tailden gleichen wörtlichen Effekt zu erhalten. Ungolfed original version (Aktualisierungen mit utf8ToInt, um einige Bytes zu entfernen, wobei der Anfang des Vektors als oberster Punkt des Stapels verwendet wird, und Missbrauch Tund integrierte FFunktionen, um die Initialisierung der Stapel zu vermeiden.):

f <- function(y, x=el(strsplit(y,""))) {
  p <- l <- NULL
  for(i in seq_along(x)) {
    if(x[[i]]=='[') {
      p <- c(p, i)
    }
    if(x[[i]]==']') {
      l <- c(l, tail(p, 1), i)
      p <- head(p, -1)
    }
  }
  l # Because I said so. Change to l-1 if you want to check the test cases.
}
ngm
quelle
und 1:nchar(y)ist kürzer als seq_along(x). Sehr schöne Lösung übrigens :)
JayCe
Ich frage mich, ob gregexprdas der richtige Weg ist.
ngm
Ich hatte ursprünglich versucht, diesen Ansatz zu nutzen , bin mir aber nicht sicher, ob dies der richtige Weg ist.
JayCe
JayCe-Lösung ist fehlerhaft (überprüfen Sie das Ergebnis, es gibt 22 28 22stattdessen zurück 22 28 21), wahrscheinlich ist die (ab) Verwendung von T / F nicht wirklich sicher: D. Das ist kürzer und scheint zu funktionieren -> Online ausprobieren!
digEmAll
2

Viertens (gviertens) , 75 Bytes

: f 0 do dup i + c@ dup 91 = if i s>f then 93 = if f>s . i . cr then loop ;

Probieren Sie es online!

Missbraucht den Gleitkommastapel, erlaubt aber die Verwendung von a do loop da der Code den Rückgabestapel nicht (manuell) berührt.

Erläuterung

  1. Zeichen in einer Zeichenkette durchlaufen
  2. Überprüfen Sie jedes Zeichen
    1. Wenn gleich [ , setzen Sie auf Gleitkommastapel
    2. Wenn gleich, wird ]vom Gleitkommastapel abgerufen und mit der aktuellen Position ausgegeben

Code-Erklärung

0 do                 \ start a loop from 0 to string-length
  dup                \ duplicate the starting address to avoid losing it
  i + c@             \ get the address of the current position and retrieve the character
  dup                \ duplicate the character, to allow checking twice
  91 = if            \ if char = [
    i s>f            \ store the current address on the floating point stack
  then               \ end the if-statement
  93 = if            \ if char = ]
    f>s .            \ pop the starting position from the float-stack and print
    i .              \ print the current position
    cr               \ output a newline
  then               \ end the if-statement
loop                 \ end the loop
reffu
quelle
2

Netzhaut , 36 Bytes

L$v`\[((\[)|(?<-2>])|[^]])*
$.`,$.>`

Probieren Sie es online! Erläuterung:

L

Erstellen Sie eine Liste aus den Übereinstimmungsergebnissen.

$

Verwenden Sie die folgende Ersetzung, um die Liste anstelle der Übereinstimmungen zu generieren.

v`

Übereinstimmungen zulassen.

\[((\[)|(?<-2>])|[^]])*

Dies ist eine Anwendung der .NET-Bilanzkreise. Das [stimmt wörtlich überein, dann werden so viele Zeichen wie möglich verbraucht. Wenn alle nachfolgenden [übereinstimmen, wird die Übereinstimmung zum $2Stapel hinzugefügt . Wenn dieser Stapel nicht leer ist, können wir eine Übereinstimmung finden ], indem wir die Übereinstimmung vom Stapel entfernen. Andernfalls können wir alles abgleichen, was nicht a ist ](das [wurde bereits früher abgeglichen). Das Match stoppt, wenn es dem Matching ]für das entspricht [, da der $2Stack zu diesem Zeitpunkt (jetzt) ​​leer ist.

$.`,$.>`

Die Substitution besteht aus zwei durch Komma getrennten Variablen. Der .gibt an, dass die Länge der Variablen anstelle ihres Werts verwendet werden soll. Das >bedeutet, dass die Variable im Hinblick auf das rechte Trennzeichen und nicht auf die Übereinstimmung ausgewertet werden soll. Die $`Variable bezieht sich auf das Präfix der Übereinstimmung, was bedeutet, dass $.`die Position des [; Der >Modifikator ändert dies auf das Präfix des rechten Trennzeichens der Übereinstimmung, das die Position der Übereinstimmung angibt ].

Neil
quelle
2

Jelly ,  22 21 20  19 Bytes

Zweifellos ist es in Jelly möglich, die Hälfte dieser Byteanzahl ...

n€Ø[ḅ-µMịÄÐƤi€0ĖƊ’Ä

Ein monadischer Link, der eine Liste von Zeichen akzeptiert und eine Liste von Ganzzahlen zurückgibt.
Als vollständiges Programm akzeptiert es einen String und gibt eine Darstellung dieser Liste aus.

Probieren Sie es online!

Wie?

n€Ø[ḅ-µMịÄÐƤi€0ĖƊ’Ä - Link: list of characters    e.g. "[f[o]o!]"
  Ø[                - list of characters = ['[', ']']
n€                  - not equal? for €ach              [[0,1],[1,1],[0,1],[1,1],[1,0],[1,1],[1,1],[1,0]]
                    -     ...relating to the characters:  [     f     [     o     ]     o     !     ]
    ḅ-              - convert from base -1             [1,0,1,0,-1,0,0,-1]
                    -     ...i.e.: 1 where '['; -1 where ']'; and 0 elsewhere
      µ             - start a new monadic chain with that as the argument, say V
                Ɗ   - last 3 links as a monad (function of V):
          ÐƤ        -   for post-fixes:
         Ä          -     cumulative sum               [[1,1,2,2,1,1,1,0],[0,1,1,0,0,0,-1],[1,1,0,0,0,-1],[0,-1,-1,-1,-2],[-1,-1,-1,-2],[0,0,-1],[0,-1],-1]
            i€0     -   1st index of 0 in €ach (or 0)  [8,1,3,1,0,1,1,0]
               Ė    -   enumerate                      [[1,8],[2,1],[3,3],[4,1],[5,0],[6,1],[7,1],[8,0]]
       M            - maximal indices of V             [1,3]
        ị           - index into                       [[1,8],[3,3]]
                 ’  - decrement                        [[0,7],[2,2]]
                  Ä - cumulative sum (vectorises)      [[0,7],[2,4]]
Jonathan Allan
quelle
Ich habe versucht, es œ¿und seine Verwandten zu verwenden, konnte aber keine Lösung finden. Dies war am nächsten ich bekam.
Dylnan
Ja, es kann kürzer sein, aber ich habe nur ein dürftiges Byte geschafft , nicht die Hälfte der Bytes. Es fühlt sich immer noch zu lang an. :(
Erik der Outgolfer
@EriktheOutgolfer es gab eine einfache 1-Byte-Speicherung auch hier
Jonathan Allan
2

SWI-Prolog 254 Bytes

d([']'|T],I,[S|Z],M,R):-J is I+1,d(T,J,Z,[',','(',S,',',I,')'|M],R).
d(['['|T],I,S,M,R):-J is I+1,d(T,J,[I|S],M,R).
d([_|T],I,S,M,R):-J is I+1,d(T,J,S,M,R).
d(_,_,_,R,R).
m(X):-atom_chars(X,A),d(A,0,[],[']'],[_|R]),atomic_list_concat(['['|R],S),print(S).

Beispiel:

?- m('!^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]').
'[(49,50),(42,48),(8,41),(36,39),(20,33),(21,27)]'
true 
Jan Drozen
quelle
1

C (gcc) 87 Bytes

f(char*Z){for(char*z=Z,*q=z;*z;*z++-93||printf("%d,%d;",*--q,z-1-Z))*z-91||(*q++=z-Z);}

Probieren Sie es online!

Erläuterung

Um die Zeichenfolgenindizes der öffnenden Klammer zu verfolgen, wird die Eingabezeichenfolge überschrieben und als Stapel verwendet.

f(char*Z){          // take mutable input string
 for(char*z=Z,*q=z; // copy pointer to current string index, current stack index
 *z;                // loop through the entire string
 *z++-93||          // if z == ']'
   printf("%d,%d;", // decrement stack pointer,
    *--q,z-1-Z))    //  write bracket pair position
  *z-91||           // if z == '['
   (*q++=z-Z);}     // write bracket position onto stack, increment stack pointer

Probieren Sie es online!

Jonathan Frech
quelle
1

Gelee , 20 Bytes

=©ⱮØ[_/aÄ$+®ŻĠḊẎ_2s2

Probieren Sie es online!

Es hat eine Nebenwirkung auf das Register, ich hoffe, es darf eine Funktion sein.

Erik der Outgolfer
quelle
Es ist wiederverwendbar, also denke ich, dass es in Ordnung ist. BF-Antworten lassen das Band normalerweise nicht leer
dylnan
1

Japt v1.4.5, 23 Bytes

;Ë¥']?ApENo):D¥'[©NpE
A

Probieren Sie es online!

Ausgepackt und wie es funktioniert

;UmDE{D==']?ApENo):D=='[&&NpE
A

;                              Use alternative set of initial variables
                               A = [] is used here
 UmDE{                         Map over each char of input string...
      D==']?                     If the char is closing bracket...
            ApENo)                 Push the current index and N.pop() to A
                  :D=='[&&       Otherwise, if the char is opening bracket...
                          NpE      Push the current index to N

A     Output A

Die Ausgabe ist ein abgeflachtes Array von [closing index, opening index]. Wenn die umgekehrte Reihenfolge nicht gewünscht ist, werledigt das Hinzufügen am Ende den Job (+1 Byte).

Bubbler
quelle
1

Common Lisp, 95 Bytes

(lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
Lange Version
(defun par (string &aux stack)
  (dotimes (pos (length string))
    (case (char string pos)
      (#\[ (push pos stack))
      (#\] (print (list (pop stack) pos))))))
Tests
((lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
 "!^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][] ")

druckt:

(21 27) 
(20 33) 
(36 39) 
(8 41) 
(42 48) 
(49 50)
Core-Dump
quelle
1

K (ngn / k) , 38 37 Bytes

{b@0N 2#,/=(|':+\-/a)b:&|/a:"[]"=\:x}

Probieren Sie es online!

{ } Funktion mit Argument x

"[]"=\:xzwei boolesche Listen für die Vorkommen von "["und"]"

a: zuweisen a

|/ Boolesches "oder" der beiden Listen

& Wo (bei welchen Indizes) stehen die Klammern?

b: zuweisen b

-/eine Liste mit 1 für "[", -1 für "]"und 0 überall sonst

+\ Teilsummen

|': paarweise Maxima (jedes Element wird mit dem vorherigen maximal, das ursprüngliche Element bleibt gleich)

Dies repräsentiert die Klammertiefe für jedes Zeichen. Wir indizieren es mitb (Nebeneinander indizieren) und erhalten die Klammertiefe nur für die Klammern.

= "group by" - Ein Wörterbuch, das die Tiefen der Indizes abbildet, bei denen sie auftreten

,/ Verketten Sie die Werte im Wörterbuch, ohne die Schlüssel zu beachten

0N 2# Umwandlung in eine zweispaltige Matrix (Liste der Listen)

b@Index bmit jedem Element der Matrix

ngn
quelle
1

Jelly , 20 bis 18 Bytes

1 Byte dank @ user202729 gespeichert, der mich informiert, dass µ€ist)

ẹⱮØ[µ³ḣċþØ[_/Ụị)Z’

Probieren Sie es online!

Nachdem ich einige Stunden damit gerungen habe, um es zum Laufen zu bringen ... bin ich ehrlich überrascht, dass es so kurz geworden ist :-)

Erläuterung

ẹⱮØ[µ³ḣċþØ[_/Ụị)Z’   Main link. Argument: s (string)  '[a[b]c[]][d]'
  Ø[                 Shortcut for the string "[]".
 Ɱ                   For each char in the "[]":
ẹ                      Find the indices of each occurrence in the input.
                     For our example, this gives the array [[1, 3, 7, 10], [5, 8, 9, 12]].

    µ                Begin a new monadic chain, with said array as its argument.
               )     For each of the two sub-arrays q within the array:
                         [[1, 3, 7, 10], [5, 8, 9, 12]]
     ³ḣ                For each item n in q, take the first n chars of the input.
                         [['[',     '[a[',      '[a[b]c[',   '[a[b]c[]]['],
                          ['[a[b]', '[a[b]c[]', '[a[b]c[]]', '[a[b]c[]][d]']]
        þØ[            For each string s in this, and each char c in "[]":
       ċ                 Count the occurrences of c in s.
                         [[[1, 0],  [2, 0],     [3, 1],      [4, 3]],
                          [[2, 1],  [3, 2],     [3, 3],      [4, 4]]]
           _/          Reduce each pair by subtraction. This is the number of open brackets
                         at each position.
                         [[1, 2, 2, 1], [1, 1, 0, 0]]
             U         Sort the indices by their values, using position as a tiebreaker.
                         [[1, 4, 2, 3], [3, 4, 1, 2]]
              ị        Index these values back into q.
                         [[1, 10, 3, 7], [9, 12, 5, 8]]

               )     Start a new monadic chain with the result as its argument.
                Z    Zip; transpose rows and columns.
                         [[1, 9], [10, 12], [3, 5], [7, 8]]
                 ’   Decrement; switch to 0-indexing.
                         [[0, 8], [9, 11], [2, 4], [6, 7]]
ETHproductions
quelle
1

CJam , 25 Bytes

0q{"[]"#"_ \p_p "S/=~)}/;

Überraschend wettbewerbsfähig - verliert nur gegen Japt und Jelly [ Edit : und Charcoal und Stax :(]

Probieren Sie es online!

Erläuterung

0                          Push 0.
 q                         Push the input.
  {                   }/   For each character in the input:
   "[]"#                     Find index of this character in the string "[]" (or -1 if not found).
                   =         Use this index to choose
        "       "S/            one of the following snippets
                    ~          and execute it:
         _                       If it was 0 ('['), duplicate the number on the stack.
           \p_p                  If it was 1 (']'), print the current number and the one under it.
                                 If it was -1, do nothing.
                     )       Increment the number on top of the stack.
                        ;  Delete the number.
Esolanging Fruit
quelle
0

Pyth ,  28  26 Bytes

{I#.e,t+lhfSI/LT`Y+._>Qk\]

Testsuite.

Im Moment ist es länger als der Ansatz von Mnemonic , aber ich habe das Gefühl, dass ich ein bisschen Golf spielen kann und glücklicherweise werden auch keine pythonisch-imperativen Strukturen wie diese verwendetV . Die ursprüngliche Version war 36 Bytes und hatte auch zahlreiche Fehler.

Wie es funktioniert

{I # .e, t + lhfSI / LT`Y + ._> Qk \] - Volles Programm. Nimmt einen String Q in Anführungszeichen aus STDIN.
   .e - Aufgezählte Karte. k = Iterationsindex, b = aktuelles Element.
                     > Qk - Ermittelt die Elemente von Q bei Indizes größer als k.
                   ._ - Erzeugt alle Präfixe davon.
                  + \] - Und füge ein "]" an (für die Behandlung einiger Randfälle).
          f - Filtern Sie über diese Liste mit T = aktuelles Element.
              L `Y - Für jedes Zeichen in str ([])," [] "...
             / T - ... Zähle die Vorkommen in T.
           SI - Und prüfen Sie, ob die Werte zunehmend sortiert sind.
         h - Kopf. Rufen Sie das erste Element ab.
       + l - Liefert die Länge dieses + k.
      t - Dekrement (um 1).
     , - Und diesen Wert mit k koppeln. Gibt [i, k] zurück, wo i ist
                             der Index des entsprechenden] und k ist der von [.
  # - Diese Liste filtern nach:
{I - Das Paar ist über die Deduplizierung unveränderlich.
Mr. Xcoder
quelle
{I#.e,t+lhfSI/LT`Y._>Q Fast funktioniert für 22 Bytes ...
Mr. Xcoder
0

Perl 5, 53 Bytes

say"$-[0] ".($+[0]-1)while s/\[[^][]*\]/1x length$&/e

Führen Sie so perl -nE '<above code snippet>'. Übernimmt die Eingabe über stdin.

Wie üblich ist die optimale Perl-Lösung für das Problem ein regulärer Ausdruck. Wir versuchen, jedes Klammerpaar, das keine Paare enthält, mit einer ziemlich albern aussehenden Zeichenklasse ( s/\[[^][]*\]/.../) abzugleichen . Wenn die Übereinstimmung erfolgreich ist, ersetzen wir den übereinstimmenden Text 1immer und immer wieder durch die Ziffer, damit wir diese Klammern nicht versehentlich erneut zuordnen, und drucken die Indexe der Übereinstimmung aus. Spülen und wiederholen.

Silvio Mayolo
quelle
0

Stax , 13 Bytes

é√p(l▓1½\á²ë(

Führen Sie es aus und debuggen Sie es

Es verwendet den Eingabestapel, um offene Klammerpaare zu verfolgen. Hier ist das Programm entpackt, ungolfed und kommentiert.

F       iterate over input characters
 .][I   get the index of the character in the string "[]", or -1
 ^|cv   skip the rest of this iteration if index was -1
 i~     push the current iteration index to the input stack
 C      skip the rest of this iteration if index was 0
 \      form a pair with the top two items from the input stack
 JP     join with space, and print

Führen Sie dieses aus

rekursiv
quelle
0

Holzkohle , 20 Bytes

FLθ≡§θι[⊞υι]«I⊟υ,Iι⸿

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

FLθ

Durchlaufen Sie den impliziten Bereich der Länge der Eingabezeichenfolge.

≡§θι

Schalte den aktuellen Charakter ein.

[⊞υι

In diesem [Fall verschieben Sie den aktuellen Index in die vordefinierte Array-Variable.

]«I⊟υ,Iι⸿

Wenn es eine ist ] Fall ist, lassen Sie den neuesten Index aus der Array-Variablen ausgeben und drucken Sie ihn und den aktuellen Index, getrennt durch ein Komma, und beginnen Sie eine neue Zeile. Alternative Ausgabeformate würden, falls akzeptabel, einige Bytes sparen: ]I⟦⊟υιωSpeichert 2 Bytes, druckt jedoch jeden Index in einer separaten Zeile, wobei die Indexpaare doppelt beabstandet werden. ]I⟦⊟υιDie Indizes werden einfach in separaten Zeilen gedruckt, wodurch es schwierig ist, sie zu unterscheiden.

Neil
quelle