Golf A Dấu ngoặc phù hợp với thuật toán


25

Bạn sẽ được cung cấp một chuỗi s. Nó được đảm bảo rằng chuỗi có bằng nhau và ít nhất một [s và ]s. Nó cũng được đảm bảo rằng các dấu ngoặc được cân bằng. Chuỗi cũng có thể có các ký tự khác.

Mục tiêu là xuất / trả về một danh sách các bộ dữ liệu hoặc một danh sách các danh sách chứa các chỉ số của từng []cặp.

lưu ý: Chuỗi không có chỉ mục.

Ví dụ: !^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]nên trả lại

[(8, 41), (20, 33), (21, 27), (36, 39), (42, 48), (49, 50)]hoặc một cái gì đó tương đương với điều này. Tuples là không cần thiết. Danh sách cũng có thể được sử dụng.

Các trường hợp thử nghiệm:

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

Đây là , vì vậy mã ngắn nhất tính theo byte cho mỗi ngôn ngữ lập trình sẽ thắng.


1
Liệu thứ tự đầu ra có vấn đề?
lãng phí

1
không nó không.
Bánh quy cối xay gió

21
"lưu ý: Chuỗi không có chỉ mục." - Rất phổ biến khi cho phép các triển khai chọn một chỉ mục nhất quán trong các loại thách thức này (nhưng tất nhiên, tùy thuộc vào bạn)
Jonathan Allan

1
Chúng ta có thể lấy đầu vào như một mảng các ký tự không?
Xù xì

7
Chi phí một byte ...
dylnan

Câu trả lời:


13

Brain-Flak Classic , 108 byte

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

Hãy thử trực tuyến!

Lưu trữ mỗi lần mở [trong ngăn xếp bên phải và xuất ra bất cứ khi nào chúng tôi nhấn a ].



5

JavaScript, 69 62 byte

Một chút nhanh chóng của golf trên tàu về nhà. Có lẽ có thể được cải thiện trên.

Lấy đầu vào dưới dạng một mảng các ký tự và xuất ra một đối tượng với các khóa là các chỉ số của [s và các giá trị của chúng là các chỉ số của ]s tương ứng .

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

Dùng thử trực tuyến


Nó thổi vào tâm trí của tôi rằng bạn có thể chơi gôn trên thiết bị di động. : P
Oliver

2
@Oliver, nó thổi tâm trí của tôi mà tôi có thể (chỉ là về) loại trên màn hình cảm ứng ở tất cả - mang lại bàn phím!
Xù xì

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

Hãy thử trực tuyến!

Giải trình

Chúng ta tạo một hàm gtrong đó có 3 đối số.

  • a, đó là vị trí của tất cả các [s chưa từng có .

  • n, đó là số lượng ký tự được xử lý

  • x đó là các ký tự chưa được xử lý.

Nếu nhân vật đầu tiên của chúng tôi là ]chúng tôi loại bỏ utừ phía trước của chúng tôi avà trở lại (u,n)cộng với bất cứ điều gì khác vẫn còn.

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

Nếu ký tự đầu tiên của chúng ta không có ], đó là một trong hai [thứ khác, chúng ta sẽ tăng nvà thêm [n|s=='[']vào phía trước a. [n|s=='[']sẽ là [n]nếu s=='['[]nếu không.

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

Nếu chúng ta hết ký tự, chúng ta sẽ trả về danh sách trống.

g[]_[]=[]

1
wow, đó là một số tốt đẹp của chức năng đệ quy. Tôi là người mới bắt đầu trên Haskell, điều này đã gây ấn tượng với tôi :)
Bánh quy cối xay gió

@ gnu-không ai Cảm ơn! Câu trả lời này có lẽ không tối ưu, vì vậy tôi sẽ khuyến khích bạn thử và đánh bại nó, hoặc đợi cho đến khi những người chơi golf Haskell nghiêm túc đến.
Thuật sĩ lúa mì

Tôi nên chờ đợi cho đến khi những người chơi golf Haskell nghiêm túc đến
Bánh quy cối xay gió

4

Java 10, 95 byte

Một lambda void lấy chuỗi đầu vào làm int[]điểm mã 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++;}}

Dùng thử trực tuyến

Bị đánh cắp

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

Lời cảm ơn

  • cảm ơn Jonathan Frech cho ý tưởng sử dụng chuỗi đầu vào như một ngăn xếp ( ở đây )

Bạn phải xác định rwlà một phần của mã, không phải là tham số : s->{int r=0,w=0;...}.
Olivier Grégoire

@ OlivierGrégoire Loại mơ hồ, nhưng này trông giống như nó được dự định để trang trải nhiều đầu vào trống.
Jakob

1
Câu trả lời bạn trích dẫn trả lời rõ ràng câu hỏi "Chúng tôi có được phép lấy tham số trống thay vì chúng tôi sẽ không sử dụng ở bất cứ đâu không?". Bạn đang sử dụng những đầu vào này. Tôi thấy không có sự mơ hồ ở tất cả ở đây.
Olivier Grégoire

Phần chỉnh sửa của câu hỏi làm cho nó hoàn toàn không rõ ràng về biến "không sử dụng".
Olivier Grégoire

Đúng, nhưng tại sao câu trả lời hàng đầu (1) không nói rằng đầu vào không được sử dụng, (2) chỉ định giá trị của đầu vào bổ sung là gì và (3) đề cập đến khả năng lạm dụng đầu vào thêm? Bất kể, tôi sẽ di chuyển các biến.
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

Chú thích

: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>là 0x16. <C-M>là 0x0đ. <C-X>là 0x18.

Hãy thử trực tuyến!


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

Chúng tôi cần bốn hai byte bởi vì thách thức đòi hỏi phải lập chỉ mục 0. Bài đăng QBasic đầu tiên của tôi, phản hồi được đánh giá cao.

  • 10 byte nhờ steenbergh
  • 3 byte nhờ Erik the Outgolfer
  • 12 byte bằng cách lưu ở định dạng tệp unix ( \r\n-> \n)

Trông như thế này khi được thực thi:

Trông nó thế nào


Đẹp một. Vài con trỏ: sử dụng ?thay vì print(trình biên dịch tự động mở rộng điều này thành print), bạn không cần khoảng trắng giữa các chuỗi được trích dẫn và THENtrong IFs, và bạn có thể thả isau NEXT.
steenbergh

@steenbergh Huh, có vẻ như tôi đã quên xóa khoảng trắng ... nhưng tôi đã xóa cái giữa 0to? Tôi đang bối rối ...
lãng phí

1
Không chắc chắn về QB64, nhưng tôi nghĩ if c$="["có thể trở thành if"["=c$, elseif c$="]"có thể trở thành elseif"]"=c$, end ifcó thể trở thành endifvà với một chút thay đổi trong đầu ra, ?b(n),icó thể trở thành ?b(n)i(QBasic 1.1 là những gì tôi sử dụng, trường hợp của bạn có thể khác).
Erik the Outgolfer

@EriktheOutgolfer tất cả nhưng ?b(n)iđã hoạt động
lãng phí

3

Bình thường, 26 byte

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

Hãy thử nó ở đây

Giải trình

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.

Tốt đẹp! Cách tiếp cận ngây thơ của tôi là 36 byte , C,x"[" MQ #.e*qb\[t+lhfSI/LT"[]"._>Q. Chỉnh sửa: Tôi cũng đã chơi golf khá thành công, tôi hiện ở dưới 30.
Ông Xcoder

3

R , 141 133 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]}

Hãy thử trực tuyến!

Không có gì đặc biệt. 1 chỉ số, bởi vì tôi đã nói như vậy. R không thực sự có ngăn xếp, vì vậy tôi ban đầu được sử dụng c, headtailđể có được những hiệu ứng đen tương tự. Phiên bản gốc đã được chỉnh sửa (cập nhật bằng cách sử dụng utf8ToIntđể loại bỏ một số byte, sử dụng bắt đầu của vectơ làm đỉnh của ngăn xếp, và lạm dụng Tvà dựng Fsẵn để tránh khởi tạo ngăn xếp.):

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


1:nchar(y)ngắn hơn seq_along(x). Giải pháp rất hay btw :)
JayCe

Tôi tự hỏi nếu gregexprlà con đường để đi.
ngm

Ban đầu tôi đã cố gắng tận dụng cách tiếp cận này nhưng tôi không chắc liệu đây có phải là cách đúng đắn ở đây không.
JayCe

Giải pháp JayCe còn thiếu sót (kiểm tra kết quả, nó trả về 22 28 22thay vì 22 28 21) có lẽ (ab) việc sử dụng T / F không thực sự an toàn: D. Điều này ngắn hơn và dường như hoạt động -> Hãy thử trực tuyến!
digEmAll

2

Forth (gforth) , 75 byte

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

Hãy thử trực tuyến!

Lạm dụng ngăn xếp dấu phẩy động, nhưng cho phép sử dụng do loopvì mã không (thủ công) chạm vào ngăn xếp trả về.

Giải trình

  1. Lặp qua các ký tự trong chuỗi
  2. Kiểm tra từng nhân vật
    1. Nếu bằng [, đặt vào ngăn xếp dấu phẩy động
    2. nếu bằng ]pop từ ngăn xếp dấu phẩy động và đầu ra với vị trí hiện tại

Giải thích mã

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

2

Võng mạc , 36 byte

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

Hãy thử trực tuyến! Giải trình:

L

Tạo một danh sách từ các kết quả trận đấu.

$

Sử dụng thay thế sau đây để tạo danh sách thay vì khớp.

v`

Cho phép các trận đấu trùng nhau.

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

Đây là một ứng dụng của các nhóm cân bằng của .NET. Các [là lần xuất hiện theo nghĩa đen, sau đó là nhiều nhân vật càng tốt được tiêu thụ. Khi mỗi lần tiếp theo [được khớp, trận đấu sẽ được thêm vào $2ngăn xếp. Nếu ngăn xếp đó không trống, thì chúng ta có thể khớp a ], xóa khớp khỏi ngăn xếp. Mặt khác, chúng ta có thể khớp bất cứ thứ gì không phải là ](cái [đã được khớp trước đó). Trận đấu dừng lại khi nó đáp ứng khớp ]cho [, vì $2ngăn xếp (bây giờ) trống tại điểm đó.

$.`,$.>`

Sự thay thế bao gồm hai biến được phân tách bằng dấu phẩy. Chỉ .ra rằng độ dài của biến, thay vì giá trị của nó, được sử dụng. Chỉ >ra rằng biến cần được đánh giá theo dấu phân cách bên phải thay vì khớp. Các $`biến dùng để chỉ tiền tố của trận đấu, trong đó có nghĩa là $.`cung cấp cho các vị trí của [; công cụ >sửa đổi thay đổi điều này thành tiền tố của dấu phân cách bên phải của kết quả khớp, điều này cho biết vị trí của kết quả khớp ].


2

Thạch ,  22 21 20  19 byte

Không còn nghi ngờ gì nữa, có thể trong Jelly với một nửa số byte này: p ...

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

Một liên kết đơn âm chấp nhận danh sách các ký tự trả về danh sách các số nguyên.
Là một chương trình đầy đủ, nó chấp nhận một chuỗi và in một đại diện của danh sách đã nói.

Hãy thử trực tuyến!

Làm sao?

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

Tôi đã cố gắng sử dụng œ¿và đó là người thân nhưng không thể tìm ra giải pháp. Đây là gần nhất tôi có.
dylnan

Vâng, nó có thể ngắn hơn, nhưng tôi chỉ quản lý một byte sởi chứ không phải một nửa byte. Nó vẫn cảm thấy quá dài. :(
Erik the Outgolfer

@EriktheOutgolfer cũng có một tiết kiệm 1 byte dễ dàng ở đây
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).

Thí dụ:

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

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

Hãy thử trực tuyến!

Giải trình

Để theo dõi các chỉ số chuỗi của khung mở, chuỗi đầu vào được ghi đè và được sử dụng như một ngăn xếp.

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

Hãy thử trực tuyến!



1

Japt v1.4.5, 23 byte

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

Hãy thử trực tuyến!

Giải nén & Cách thức hoạt động

;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

Đầu ra là một mảng phẳng của [closing index, opening index]. Nếu thứ tự đảo ngược không mong muốn, việc thêm wvào cuối sẽ thực hiện công việc (+1 byte).


1

Lisp thông thường, 95 byte

(lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
Phiên bản dài
(defun par (string &aux stack)
  (dotimes (pos (length string))
    (case (char string pos)
      (#\[ (push pos stack))
      (#\] (print (list (pop stack) pos))))))
Xét nghiệm
((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][] ")

in:

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

1

K (ngn / k) , 38 37 byte

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

Hãy thử trực tuyến!

{ } chức năng với đối số x

"[]"=\:xhai danh sách boolean cho sự xuất hiện của "[""]"

a: giao cho a

|/ boolean "hoặc" của hai danh sách

& trong đó (tại chỉ số nào) là dấu ngoặc?

b: giao cho b

-/một danh sách có 1 cho "[", -1 cho "]"và 0 ở mọi nơi khác

+\ tổng một phần

|': cặp cực đại (mỗi phần tử được tối đa hóa với phần tử trước, phần tử ban đầu vẫn giữ nguyên)

Điều này thể hiện độ sâu khung cho mỗi ký tự. Chúng tôi lập chỉ mục cho nó với b(juxtap vị trí là lập chỉ mục) và chỉ nhận được độ sâu khung cho các dấu ngoặc.

= "nhóm theo" - một ánh xạ từ điển sâu đến các chỉ số mà tại đó chúng xảy ra

,/ nối các giá trị trong từ điển, bỏ qua các phím

0N 2# định hình lại ma trận 2 cột (danh sách các danh sách)

b@chỉ mục bvới từng yếu tố của ma trận


1

Thạch , 20 18 byte

Đã lưu 1 byte nhờ @ user202729 thông báo cho tôi rằng đó µ€)

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

Hãy thử trực tuyến!

Sau khi vật lộn với điều này trong vài giờ chỉ để nó hoạt động ... Tôi thực sự ngạc nhiên rằng nó đã bị rút ngắn :-)

Giải trình

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

1

CJam , 25 byte

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

Đáng ngạc nhiên cạnh tranh - chỉ thua Japt và Jelly [ Chỉnh sửa : và Than và Stax :(]

Hãy thử trực tuyến!

Giải trình

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.


0

Bình thường ,  28  26 byte

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

Bộ thử nghiệm.

Hiện tại nó dài hơn cách tiếp cận của Mnemonic , nhưng tôi cảm thấy mình có thể đánh golf xuống một chút và may mắn thay, nó cũng không sử dụng các cấu trúc bắt buộc như Python V. Phiên bản ban đầu là 36 byte và cũng có nhiều lỗi.

Làm thế nào nó hoạt động

{I # .e, t + lhfSI / LT`Y + ._> Qk \] - Chương trình đầy đủ. Lấy một chuỗi trích dẫn Q từ STDIN.
   .e - Bản đồ liệt kê. k = chỉ số lặp, b = phần tử hiện tại.
                     > Qk - Lấy các phần tử của Q tại các chỉ số lớn hơn k.
                   ._ - Tạo tất cả các tiền tố của điều này.
                  + \] - Và nối thêm "]" (để xử lý một số trường hợp cạnh).
          f - Lọc qua danh sách này, với T = phần tử hiện tại.
              L `Y - Với mỗi ký tự trong str ([])," [] "...
             / T - ... Đếm số lần xuất hiện của nó trong T.
           SI - Và kiểm tra xem các giá trị được sắp xếp ngày càng nhiều.
         h - Đầu. Lấy phần tử đầu tiên.
       + l - Lấy độ dài này + k.
      t - Giảm (bằng 1).
     , - Và ghép giá trị này với k. Trả về [i, k] nơi tôi đang
                             chỉ số của tương ứng] và k là của [.
  # - Lọc danh sách này bằng cách:
{I - Cặp này bất biến trên sự lặp lại.

{I#.e,t+lhfSI/LT`Y._>Q aaalest hoạt động với 22 byte ...
Ông Xcoder

0

Perl 5, 53 byte

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

Chạy như perl -nE '<above code snippet>'. Đưa đầu vào thông qua stdin.

Như thường lệ, giải pháp Perl tối ưu cho vấn đề là một biểu thức chính quy. Chúng tôi cố gắng khớp bất kỳ cặp ngoặc nào không chứa bất kỳ cặp nào trong đó bằng cách sử dụng lớp ký tự trông khá ngớ ngẩn ( s/\[[^][]*\]/.../). Nếu trận đấu thành công, chúng tôi sẽ thay thế văn bản trùng khớp bằng chữ số 1lặp đi lặp lại để chúng tôi không vô tình khớp các dấu ngoặc đó một lần nữa và chúng tôi in ra các chỉ số của trận đấu. Rửa sạch và lặp lại.


0

Stax , 13 byte

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

Chạy và gỡ lỗi nó

Nó sử dụng ngăn xếp đầu vào để theo dõi các cặp nẹp mở. Đây là chương trình giải nén, không ghi chú và nhận xét.

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

Chạy cái này


0

Than , 20 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

FLθ

Lặp lại phạm vi ngầm định về độ dài của chuỗi đầu vào.

≡§θι

Bật nhân vật hiện tại.

[⊞υι

Nếu đó là [sau đó đẩy chỉ mục hiện tại đến biến mảng được xác định trước.

]«I⊟υ,Iι⸿

Nếu đó là một ]chỉ mục mới nhất từ ​​biến mảng và in nó và chỉ mục hiện tại được phân tách bằng dấu phẩy và bắt đầu một dòng mới. Các định dạng đầu ra thay thế, nếu được chấp nhận, sẽ lưu một số byte: ]I⟦⊟υιωlưu 2 byte nhưng in mỗi chỉ mục trên một dòng riêng biệt, cách đôi các cặp chỉ mục; ]I⟦⊟υιchỉ đơn giản là in các chỉ mục trên các dòng riêng biệt, làm cho khó phân biệt chúng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.