Algoritma Pencocokan Golf A Parentheses

25

Anda akan diberikan string s. Dijamin bahwa string memiliki sama dan setidaknya satu [s dan ]s. Juga dijamin bahwa tanda kurung seimbang. String juga dapat memiliki karakter lain.

Tujuannya adalah untuk menampilkan / mengembalikan daftar tupel atau daftar daftar yang berisi indeks masing-masing [dan ]pasangan.

Catatan: String diindeks nol.

Contoh: !^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]harus kembali

[(8, 41), (20, 33), (21, 27), (36, 39), (42, 48), (49, 50)]atau sesuatu yang setara dengan ini. Tuple tidak perlu. Daftar juga dapat digunakan.

Kasus uji:

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)]

Ini adalah , jadi kode terpendek dalam byte untuk setiap bahasa pemrograman menang.

Cookie Kincir Angin
sumber
1
Apakah urutan output penting?
wastl
1
tidak.
Windmill Cookies
21
"note: String diindeks nol." - Sangat umum untuk memungkinkan implementasi untuk memilih pengindeksan yang konsisten dalam tantangan semacam ini (tetapi tentu saja, terserah Anda)
Jonathan Allan
1
Bisakah kita mengambil input sebagai array karakter?
Shaggy
7
Biaya satu byte ...
dylnan

Jawaban:

13

Brain-Flak Classic , 108 byte

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

Cobalah online!

Menyimpan setiap pembukaan [di tumpukan yang tepat, dan menghasilkan setiap kali kita menekan a ].

Nitrodon
sumber
12

Python 2 , 74 byte

s=[];i=0
for c in input():
 if'['==c:s+=i,
 if']'==c:print s.pop(),i
 i+=1

Cobalah online!

tongkat
sumber
5

JavaScript, 69 62 byte

Sedikit golf cepat di kereta pulang. Mungkin bisa ditingkatkan.

Mengambil input sebagai array karakter dan menampilkan objek dengan tombol menjadi indeks [s dan nilainya menjadi indeks ]s yang sesuai .

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

Cobalah online

Shaggy
sumber
Saya terpikir bahwa Anda dapat bermain golf di ponsel. : P
Oliver
2
@Oliver, itu mengejutkan saya bahwa saya dapat (hampir) mengetik di layar sentuh sama sekali - bawa kembali keyboard!
Shaggy
4

Haskell , 92 79 byte

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

Cobalah online!

Penjelasan

Kami membuat fungsi gyang membutuhkan 3 argumen.

  • a, yang merupakan lokasi dari semua [s yang tidak cocok.

  • n, yang merupakan jumlah karakter yang diproses

  • x yang merupakan karakter yang belum diproses.

Jika karakter pertama ]kita adalah kita hapus udari depan kita adan kembali (u,n)ditambah apa pun yang tersisa.

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

Jika karakter pertama kita tidak ], itu salah satu [atau yang lain, kita menambah ndan menambahkan [n|s=='[']ke depan a. [n|s=='[']akan [n]jika s=='['dan []sebaliknya.

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

Jika kita kehabisan karakter, kita mengembalikan daftar kosong.

g[]_[]=[]
Wisaya Gandum
sumber
1
wow, itu beberapa fungsi rekursif yang bagus. Saya seorang pemula di Haskell, ini mengesankan saya :)
Windmill Cookies
@ gnu-tidak ada Terima kasih! Jawaban ini mungkin tidak optimal, jadi saya akan mendorong Anda untuk mencoba dan mengalahkannya, atau menunggu sampai pegolf Haskell yang serius tiba.
Wheat Wizard
Saya lebih baik menunggu sampai pegolf Haskell yang serius tiba
Windmill Cookies
4

Java 10, 95 byte

Void lambda mengambil string input sebagai int[]titik kode Unicode.

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++;}}

Cobalah secara Online

Tidak disatukan

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++;
    }
}

Ucapan Terima Kasih

  • terima kasih kepada Jonathan Frech untuk gagasan menggunakan string input sebagai tumpukan (di sini )
Jakob
sumber
Anda harus menentukan rdan wsebagai bagian dari kode, bukan sebagai parameter: s->{int r=0,w=0;...}.
Olivier Grégoire
@ OlivierGrégoire Jenis ambigu, tapi ini terlihat seperti itu dimaksudkan untuk menutupi beberapa input kosong.
Jakob
1
Jawaban yang Anda kutip secara eksplisit menjawab pertanyaan "Apakah kita diizinkan mengambil parameter kosong dan bukannya kita tidak akan menggunakan mana pun ?". Anda menggunakan input ini. Saya tidak melihat ambiguitas sama sekali di sini.
Olivier Grégoire
Bagian edit dari pertanyaan membuatnya sangat ambigu tentang variabel "tidak digunakan".
Olivier Grégoire
Benar, tetapi mengapa mengapa jawaban atas (1) tidak menyatakan bahwa input tidak digunakan, (2) menentukan nilai input tambahan apa, dan (3) menyebutkan kemungkinan menyalahgunakan input tambahan? Apapun, saya akan memindahkan variabel.
Jakob
4

vim, 89 byte

: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

Beranotasi

: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>adalah 0x16. <C-M>adalah 0x0d. <C-X>adalah 0x18.

Cobalah online!

sinar
sumber
4

QBasic (QB64), 137 127 112 byte

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

Kami membutuhkan empat dua byte karena tantangannya memerlukan pengindeksan 0. Posting QBasic pertama saya, umpan balik dihargai.

  • 10 byte berkat steenbergh
  • 3 byte berkat Erik the Outgolfer
  • 12 byte dengan menyimpan dalam format file unix ( \r\n-> \n)

Sepertinya ini ketika dieksekusi:

Bagaimana tampilannya

wastl
sumber
Bagus Beberapa petunjuk: gunakan ?alih-alih print(kompilator secara otomatis memperluas ini ke print), Anda tidak perlu spasi di antara string yang dikutip dan THENdi IFs, dan Anda dapat menghapus isetelahnya NEXT.
steenbergh
@steenbergh Huh, sepertinya saya lupa menghapus spasi ... tapi saya menghapus satu di antara 0dan to? Saya bingung ...
wastl
1
Tidak yakin tentang QB64, tapi saya pikir if c$="["bisa menjadi if"["=c$, elseif c$="]"bisa menjadi elseif"]"=c$, end ifbisa menjadi endif, dan, dengan sedikit perubahan dalam output, ?b(n),ibisa menjadi ?b(n)i(QBasic 1.1 adalah apa yang saya gunakan, kasing Anda mungkin berbeda).
Erik the Outgolfer
@EriktheOutgolfer semuanya ?b(n)ibekerja
wastl
3

Pyth, 26 byte

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

Coba di sini

Penjelasan

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.

sumber
Bagus! Pendekatan naif saya adalah 36 byte C,x"[" MQ #.e*qb\[t+lhfSI/LT"[]"._>Q,. Sunting: Saya berhasil bermain golf juga sedikit, saya sekarang di bawah 30.
Tn. Xcoder
3

R , 141 133 115 115 112 108 byte

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]}

Cobalah online!

Tidak ada yang spesial. 1-diindeks, karena saya bilang begitu. R tidak benar-benar memiliki tumpukan, jadi saya awalnya digunakan c, headdan tailuntuk mendapatkan efek literal yang sama. Versi asli yang tidak dikelompokkan (pembaruan digunakan utf8ToIntuntuk menghapus beberapa byte, menggunakan awal vektor sebagai bagian atas tumpukan, dan menyalahgunakan Tdan Fbawaan untuk menghindari menginisialisasi tumpukan.):

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
sumber
dan 1:nchar(y)lebih pendek dari seq_along(x). Solusi yang sangat bagus btw :)
JayCe
Saya bertanya-tanya apakah gregexprcara untuk pergi.
ngm
Saya awalnya mencoba memanfaatkan pendekatan ini, tetapi saya tidak yakin apakah ini jalan yang benar di sini.
JayCe
Solusi JayCe cacat (periksa hasilnya, ia mengembalikan 22 28 22bukan 22 28 21) mungkin (ab) penggunaan T / F tidak benar-benar aman: D. Ini lebih pendek dan sepertinya berfungsi -> Cobalah online!
digEmAll
2

Keempat (gforth) , 75 byte

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

Cobalah online!

Menyalahgunakan tumpukan floating-point, tetapi memungkinkan menggunakan do loopkarena kode tidak (secara manual) menyentuh tumpukan kembali.

Penjelasan

  1. Ulangi karakter dalam string
  2. Periksa setiap karakter
    1. Jika sama dengan [, pasang stack floating point
    2. jika sama dengan ]pop dari floating point stack dan output dengan posisi saat ini

Penjelasan Kode

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
sumber
2

Retina , 36 byte

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

Cobalah online! Penjelasan:

L

Buat daftar dari hasil pertandingan.

$

Gunakan subtitusi berikut untuk menghasilkan daftar alih-alih yang cocok.

v`

Izinkan kecocokan tumpang tindih.

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

Ini adalah aplikasi dari kelompok penyeimbang .NET. Ini [dicocokkan secara harfiah, maka karakter sebanyak mungkin dikonsumsi. Karena setiap [pencocokan berikutnya , kecocokan ditambahkan ke $2tumpukan. Jika tumpukan itu tidak kosong, kami dapat mencocokkan ], menghapus kecocokan dari tumpukan. Kalau tidak, kami dapat mencocokkan apa pun yang bukan ]( [sudah cocok sebelumnya). Kecocokan berhenti ketika memenuhi pencocokan ]untuk [, karena $2tumpukan (sekarang) kosong pada saat itu.

$.`,$.>`

Substitusi terdiri dari dua variabel yang dipisahkan oleh koma. The .menunjukkan bahwa panjang variabel, daripada nilainya, digunakan. The >menunjukkan bahwa variabel harus dievaluasi dalam hal pemisah kanan daripada pertandingan. The $`variabel mengacu pada awalan pertandingan, yang berarti $.`memberikan posisi [; yang >alter pengubah ini untuk awalan pemisah hak pertandingan, yang memberikan posisi yang cocok ].

Neil
sumber
2

Jelly ,  22 21 20  19 byte

Tidak diragukan lagi dimungkinkan dalam Jelly dalam setengah jumlah byte ini: ...

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

Tautan monadik yang menerima daftar karakter yang mengembalikan daftar daftar bilangan bulat.
Sebagai program lengkap, ia menerima string dan mencetak representasi dari daftar tersebut.

Cobalah online!

Bagaimana?

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
sumber
Saya mencoba untuk menggunakan œ¿dan itu adalah kerabat tetapi tidak dapat menemukan solusi. Ini yang paling dekat yang saya dapatkan.
dylnan
Ya, ini bisa lebih pendek, tapi saya hanya berhasil satu byte sangat sedikit , bukan setengah byte. Masih terasa terlalu lama. :(
Erik the Outgolfer
@EriktheOutgolfer ada juga simpanan 1 byte yang mudah di sini
Jonathan Allan
2

SWI-Prolog 254 byte

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).

Contoh:

?- 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
sumber
1

C (gcc) , 87 byte

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

Cobalah online!

Penjelasan

Untuk melacak indeks string braket pembuka, string input ditimpa dan digunakan sebagai tumpukan.

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

Cobalah online!

Jonathan Frech
sumber
1

Jelly , 20 byte

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

Cobalah online!

Ini memiliki efek samping pada register, berharap itu bisa berfungsi.

Erik the Outgolfer
sumber
Dapat digunakan kembali, jadi saya pikir tidak apa-apa. Jawaban BF biasanya tidak membiarkan kaset kosong
dylnan
1

Japt v1.4.5, 23 byte

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

Cobalah online!

Dibongkar & Cara kerjanya

;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

Outputnya adalah array yang diratakan dari [closing index, opening index]. Jika urutan terbalik tidak diinginkan, menambahkan wpada akhirnya berhasil (+1 byte).

Bubbler
sumber
1

Gangguan Umum, 95 byte

(lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
Versi panjang
(defun par (string &aux stack)
  (dotimes (pos (length string))
    (case (char string pos)
      (#\[ (push pos stack))
      (#\] (print (list (pop stack) pos))))))
Tes
((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][] ")

cetakan:

(21 27) 
(20 33) 
(36 39) 
(8 41) 
(42 48) 
(49 50)
coredump
sumber
1

K (ngn / k) , 38 37 byte

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

Cobalah online!

{ } berfungsi dengan argumen x

"[]"=\:xdua daftar boolean untuk kejadian "["dan"]"

a: ditugaskan kepada a

|/ boolean "atau" dari dua daftar

& di mana (di mana indeks) adalah tanda kurung?

b: ditugaskan kepada b

-/daftar dengan 1 untuk "[", -1 untuk "]", dan 0 di tempat lain

+\ jumlah parsial

|': maxima berpasangan (masing-masing elemen max'ed dengan yang sebelumnya, elemen awal tetap sama)

Ini mewakili kedalaman braket untuk setiap karakter. Kami mengindeksnya dengan b(penjajaran adalah pengindeksan) dan mendapatkan kedalaman braket hanya untuk kurung.

= "group by" - kamus pemetaan kedalaman ke indeks di mana mereka muncul

,/ merangkai nilai-nilai dalam kamus, mengabaikan kunci

0N 2# membentuk kembali ke matriks 2-kolom (daftar daftar)

b@indeks bdengan setiap elemen dari matriks

ngn
sumber
1

Jelly , 20 18 byte

Disimpan 1 byte berkat @ user202729 memberitahu saya bahwa µ€adalah)

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

Cobalah online!

Setelah bergulat dengan ini selama beberapa jam hanya untuk membuatnya bekerja ... Saya benar-benar terkejut bahwa ini singkat :-)

Penjelasan

ẹⱮØ[µ³ḣċþØ[_/Ụị)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]]
Produksi ETH
sumber
1

CJam , 25 byte

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

Mengejutkan bersaing - hanya kalah dari Japt dan Jelly [ Sunting : dan Arang dan Stax :(]

Cobalah online!

Penjelasan

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.
Buah Esolanging
sumber
0

Pyth ,  28  26 byte

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

Suite uji.

Pada saat ini lebih panjang dari pendekatan Mnemonic , tapi saya merasa seperti saya bisa mengurangi ini sedikit dan ini untungnya juga tidak menggunakan struktur imperatif seperti Pythonically seperti V. Versi awal adalah 36 byte dan juga memiliki banyak bug.

Bagaimana itu bekerja

{I # .e, t + lhfSI / LT`Y + ._> Qk \] - Program lengkap. Mengambil string Q yang dikutip dari STDIN.
   .e - Peta yang dihitung. k = indeks iterasi, b = elemen saat ini.
                     > Qk - Dapatkan elemen Q pada indeks lebih besar dari k.
                   ._ - Menghasilkan semua awalan ini.
                  + \] - Dan menambahkan "]" (untuk menangani beberapa kasus tepi).
          f - Saring di daftar ini, dengan T = elemen saat ini.
              L `Y - Untuk setiap karakter di str ([])," [] "...
             / T - ... Hitung kejadian itu di T.
           SI - Dan periksa apakah nilainya diurutkan semakin.
         h - Kepala. Ambil elemen pertama.
       + l - Dapatkan panjang + k ini.
      t - Decrement (berdasarkan 1).
     , - Dan pasangkan nilai ini dengan k. Mengembalikan [i, k] di mana aku berada
                             indeks yang sesuai] dan k adalah dari [.
  # - Saring daftar ini dengan:
{I - Pasangan ini lebih dari deduplicating.
Tuan Xcoder
sumber
{I#.e,t+lhfSI/LT`Y._>Q aaalmost berfungsi untuk 22 byte ...
Mr. Xcoder
0

Perl 5, 53 byte

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

Jalankan sebagai perl -nE '<above code snippet>'. Mengambil input melalui stdin.

Seperti biasa, solusi Perl optimal untuk masalah ini adalah ekspresi reguler. Kami berusaha mencocokkan pasangan kurung yang tidak mengandung pasangan apa pun di dalamnya menggunakan kelas karakter yang tampak konyol ( s/\[[^][]*\]/.../). Jika kecocokan berhasil, kami mengganti teks yang cocok dengan angka 1berulang-ulang sehingga kami tidak sengaja mencocokkan tanda kurung itu lagi, dan kami mencetak indeks kecocokan. Bilas dan ulangi.

Silvio Mayolo
sumber
0

Stax , 13 byte

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

Jalankan dan debug itu

Ia menggunakan tumpukan input untuk melacak pasangan kurung terbuka. Inilah programnya membongkar, tidak berkhasiat, dan berkomentar.

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

Jalankan yang ini

rekursif
sumber
0

Arang , 20 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

FLθ

Lingkarkan rentang implisit dari panjang string input.

≡§θι

Aktifkan karakter saat ini.

[⊞υι

Jika a [maka dorong indeks saat ini ke variabel array yang telah ditetapkan.

]«I⊟υ,Iι⸿

Jika a ]maka pop indeks terbaru dari variabel array dan cetak dan indeks saat ini dipisahkan oleh koma dan mulai baris baru. Format output alternatif, jika dapat diterima, akan menghemat beberapa byte: ]I⟦⊟υιωmenghemat 2 byte tetapi mencetak setiap indeks pada baris yang terpisah, dengan spasi ganda pada pasangan indeks; ]I⟦⊟υιcukup cetak indeks pada baris yang berbeda, sehingga sulit untuk membedakannya.

Neil
sumber