กอล์ฟ A อัลกอริทึมการจับคู่วงเล็บ


25

sคุณจะได้รับสตริง มีการรับประกันว่าสตริงมีค่าเท่ากันและอย่างน้อยหนึ่ง[s และ]s มันยังรับประกันได้ว่าวงเล็บมีความสมดุล สตริงสามารถมีอักขระอื่นได้

โดยมีวัตถุประสงค์เพื่อการส่งออก / กลับรายการของ tuples หรือรายการของรายการที่มีดัชนีของแต่ละที่[และ]คู่

หมายเหตุ: สตริงเป็นศูนย์ดัชนี

ตัวอย่าง: !^45sdfd[hello world[[djfut]%%357]sr[jf]s][srtdg][]ควรกลับมา

[(8, 41), (20, 33), (21, 27), (36, 39), (42, 48), (49, 50)]หรือบางสิ่งที่เทียบเท่ากับสิ่งนี้ สิ่งอันดับไม่จำเป็น รายการสามารถใช้

กรณีทดสอบ:

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

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์สำหรับภาษาการเขียนโปรแกรมแต่ละภาษาจะชนะ


1
ลำดับการส่งออกสำคัญหรือไม่?
กำจัด

1
ไม่มันไม่
Windmill Cookies

21
"หมายเหตุ: สตริงถูกทำดัชนีเป็นศูนย์" - เป็นเรื่องธรรมดามากที่จะอนุญาตให้การใช้งานเพื่อเลือกการจัดทำดัชนีที่สอดคล้องในความท้าทายแบบนี้ (แต่แน่นอนว่าขึ้นอยู่กับคุณ)
Jonathan Allan

1
เราสามารถรับอินพุตเป็นอาร์เรย์ของตัวละครได้หรือไม่?
Shaggy

7
ราคาหนึ่งไบต์ ...
dylnan

คำตอบ:




5

JavaScript, 69 62 ไบต์

การเล่นกอล์ฟอย่างรวดเร็วที่บ้านรถไฟ สามารถปรับปรุงได้บน

รับอินพุตเป็นอาเรย์ของอักขระและส่งออกวัตถุด้วยคีย์ที่เป็นดัชนีของ[s และค่าของมันเป็นดัชนีของ]s ที่สอดคล้องกัน

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

ลองออนไลน์


มันทำให้ฉันคิดว่าคุณสามารถเล่นกอล์ฟบนมือถือได้ : P
Oliver

2
@Oliver มันทำให้ฉันคิดว่าฉันสามารถพิมพ์บนหน้าจอทัชสกรีนได้เลย - นำคีย์บอร์ดกลับมา!
Shaggy

4

Haskell , 92 79 ไบต์

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

ลองออนไลน์!

คำอธิบาย

เราสร้างฟังก์ชั่นgซึ่งใช้เวลา 3 ข้อโต้แย้ง

  • aซึ่งเป็นที่ตั้งของ[s ที่ไม่ตรงกันทั้งหมด

  • nซึ่งเป็นจำนวนอักขระที่ประมวลผล

  • x ซึ่งเป็นอักขระที่ยังไม่ได้ประมวลผล

หากตัวละครตัวแรกของเราคือ]เราลบออกuจากด้านหน้าของเราaและกลับมา(u,n)พร้อมสิ่งอื่น ๆ

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

ถ้าตัวอักษรตัวแรกของเราไม่ได้]ว่าเป็นอย่างใดอย่างหนึ่ง[หรือสิ่งอื่นที่เราเพิ่มขึ้นnและเพิ่มไปยังด้านหน้าของ [n|s=='['] จะเป็นถ้าและอย่างอื่นa[n|s=='['][n]s=='['[]

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

หากเราไม่มีตัวอักษรเราจะส่งคืนรายการว่างเปล่า

g[]_[]=[]

1
ว้าวนั่นเป็นฟังก์ชั่นการเรียกซ้ำ ฉันเป็นผู้เริ่มต้นใน Haskell สิ่งนี้ทำให้ฉันประทับใจ :)
Windmill Cookies

@ gnu- ไม่มีใครขอบคุณ! คำตอบนี้อาจไม่เหมาะสมดังนั้นฉันขอแนะนำให้คุณลองและเอาชนะมันหรือรอจนกว่านักกอล์ฟ Haskell จะมาถึง
ข้าวสาลีตัวช่วยสร้าง

ฉันควรจะรอจนกว่านักกอล์ฟ Haskell จะมาถึง
Windmill Cookies

4

Java 10, 95 ไบต์

เป็นโมฆะแลมบ์ดารับสายป้อนเป็นint[]จุดรหัส 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++;}}

ลองใช้ออนไลน์

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

กิตติกรรมประกาศ

  • ขอบคุณ Jonathan Frech สำหรับแนวคิดในการใช้สตริงอินพุตเป็นสแต็ก ( ที่นี่ )

คุณต้องกำหนดrและเป็นส่วนหนึ่งของรหัสที่ไม่เป็นพารามิเตอร์:w s->{int r=0,w=0;...}
Olivier Grégoire

@ OlivierGrégoireชนิดของคลุมเครือ แต่นี้ดูเหมือนว่ามันถูกวัตถุประสงค์เพื่อให้ครอบคลุมปัจจัยการผลิตที่ว่างเปล่าหลาย
Jakob

1
คำตอบที่คุณอ้างอิงตอบคำถามอย่างชัดเจนว่า "เราอนุญาตให้ใช้พารามิเตอร์ที่ว่างเปล่าแทนหรือไม่เราจะไม่ใช้ที่ใดก็ได้ " คุณกำลังใช้อินพุตเหล่านี้ ฉันไม่เห็นความกำกวมเลย
Olivier Grégoire

ส่วนการแก้ไขของคำถามทำให้ไม่มีความชัดเจนเกี่ยวกับตัวแปร "ไม่ใช้"
Olivier Grégoire

ใช่แล้วทำไมคำตอบยอดนิยม (1) ไม่ระบุว่าอินพุตไม่ได้ใช้ (2) ระบุว่าค่าของอินพุตพิเศษคืออะไรและ (3) พูดถึงความเป็นไปได้ของการใช้อินพุตเพิ่มเติมในทางที่ผิด? ไม่ว่าฉันจะย้ายตัวแปรอย่างไร
Jakob

4

เป็นกลุ่ม, 89 ไบต์

: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

ข้อเขียน

: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>คือ 0x16 <C-M>คือ 0x0d <C-X>คือ 0x18

ลองออนไลน์!


4

QBasic (QB64), 137 127 112 ไบต์

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

เราต้องการสี่สองไบต์เพราะความท้าทายนั้นต้องการดัชนี 0 โพสต์ QBasic แรกของฉันข้อเสนอแนะชื่นชม

  • 10 ไบต์ขอบคุณ steenbergh
  • 3 ไบต์ขอบคุณ Erik the Outgolfer
  • 12 ไบต์โดยบันทึกในรูปแบบไฟล์ unix ( \r\n-> \n)

ดูเหมือนว่านี้เมื่อดำเนินการ:

มันมีลักษณะอย่างไร


ทำได้ดีนี่. คู่ของตัวชี้: ใช้?แทนprint(คอมไพเลอร์อัตโนมัตินี้เพื่อขยายprint) คุณไม่จำเป็นต้องมีช่องว่างระหว่างสตริงที่ยกมาและTHENในIFs และคุณสามารถวางหลังi NEXT
steenbergh

@steenbergh Huh ดูเหมือนว่าฉันลืมลบช่องว่าง ... แต่ฉันลบออกระหว่าง0และto? ฉันสับสน ...
กำจัด

1
ไม่แน่ใจเรื่องการ QB64 แต่ฉันคิดว่าif c$="["จะกลายเป็นif"["=c$, elseif c$="]"สามารถกลายเป็นelseif"]"=c$, end ifสามารถกลายเป็นendifและมีการเปลี่ยนแปลงเล็กน้อยในการส่งออก?b(n),iจะกลายเป็น?b(n)i(QBasic 1.1 คือสิ่งที่ผมใช้กรณีของคุณอาจจะแตกต่างกัน)
Erik the Outgolfer

@EriktheOutgolfer ทั้งหมด แต่?b(n)iทำงาน
wastl

3

Pyth, 26 ไบต์

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

ลองที่นี่

คำอธิบาย

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.

ดี! วิธีการไร้เดียงสาของฉันคือ 36 ไบต์, C,x"[" MQ #.e*qb\[t+lhfSI/LT"[]"._>Q. แก้ไข: ฉันประสบความสำเร็จในการเล่นกอล์ฟของฉันค่อนข้างน้อยเช่นกันตอนนี้ฉันอายุต่ำกว่า 30
Mr. Xcoder

3

R , 141 133 115 112 108 ไบต์

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

ลองออนไลน์!

ไม่มีอะไรพิเศษ. ดัชนี 1 เพราะฉันพูดอย่างนั้น R ไม่ได้จริงๆมีกองดังนั้นฉัน แต่เดิมใช้c, headและtailเพื่อให้ได้ผลตามตัวอักษรเดียวกัน รุ่นเดิม Ungolfed (การปรับปรุงใช้utf8ToIntในการลบไบต์บางโดยใช้จุดเริ่มต้นของเวกเตอร์เป็นด้านบนของสแต็คและเหยียดหยามTและFbuiltins เพื่อหลีกเลี่ยงการเริ่มต้นกอง.)

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) seq_along(x)วิธีแก้ปัญหาที่ดีมาก btw :)
JayCe

ฉันสงสัยว่าgregexprเป็นวิธีที่จะไป
ngm

ตอนแรกฉันพยายามใช้ประโยชน์จากแนวทางนี้แต่ฉันไม่แน่ใจว่านี่เป็นวิธีที่ถูกต้องหรือไม่
JayCe

วิธีการแก้ปัญหาของ JayCe นั้นมีข้อบกพร่อง (ตรวจสอบผลที่ได้มันกลับมา22 28 22แทน22 28 21) การใช้ (ab) ของ T / F นั้นไม่ปลอดภัยจริงๆ: D สิ่งนี้สั้นลงและใช้งานได้ -> ลองออนไลน์!
digEmAll

2

Forth (gforth) , 75 ไบต์

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

ลองออนไลน์!

ละเมิดกองซ้อนจุดลอยตัว แต่อนุญาตให้ใช้do loopเนื่องจากรหัสไม่ได้ (ด้วยตนเอง) แตะที่กองซ้อนคืน

คำอธิบาย

  1. วนซ้ำอักขระในสายอักขระ
  2. ตรวจสอบตัวละครแต่ละตัว
    1. หากเท่ากับให้[วางสแต็กจุดลอยตัว
    2. หากเท่ากับ]ป๊อปจากสแต็กจุดลอยตัวและเอาต์พุตที่มีตำแหน่งปัจจุบัน

รหัสคำอธิบาย

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

เรติน่า 36 ไบต์

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

ลองออนไลน์! คำอธิบาย:

L

สร้างรายการจากผลลัพธ์การแข่งขัน

$

ใช้การทดแทนต่อไปนี้เพื่อสร้างรายการแทนการแข่งขัน

v`

อนุญาตให้แข่งขันทับซ้อนกัน

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

นี่เป็นแอปพลิเคชั่นของ. การ[จับคู่ตัวอักษรแล้วตัวละครให้มากที่สุดเท่าที่จะทำได้ เมื่อ[มีการจับคู่ตามลำดับแต่ละครั้งการจับคู่จะถูกเพิ่มใน$2สแต็ก หากสแต็กนั้นไม่ว่างเปล่าเราสามารถจับคู่ a ]และนำการแข่งขันออกจากสแต็ก มิฉะนั้นเราสามารถจับคู่สิ่งที่ไม่ใช่]( [ก่อนหน้านี้ถูกจับคู่แล้ว) การแข่งขันหยุดลงเมื่อตรงกับการจับคู่]สำหรับ[เนื่องจาก$2สแต็กว่างเปล่า (ตอนนี้) ที่จุดนั้น

$.`,$.>`

substiution ประกอบด้วยสองตัวแปรคั่นด้วยเครื่องหมายจุลภาค .บ่งชี้ว่าความยาวของตัวแปรมากกว่าความคุ้มค่าที่จะนำมาใช้ >บ่งชี้ว่าตัวแปรที่ควรได้รับการประเมินในแง่ของการแยกขวามือมากกว่าการแข่งขัน $`ตัวแปรหมายถึงคำนำหน้าของการแข่งขันซึ่งหมายถึงการ$.`ให้ตำแหน่งของ[; >alters ปรับปรุงนี้เพื่อคำนำหน้าแยกขวาแข่งขันฯ ]ซึ่งจะช่วยให้ตำแหน่งที่ตรงกัน


2

เยลลี่ ,  22 21 20  19 ไบต์

ไม่ต้องสงสัยเลยว่าเจลลี่นั้นมีความเป็นไปได้ในครึ่งนี้: p ...

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

ลิงก์ monadic ยอมรับรายการของอักขระซึ่งส่งคืนรายการของรายการจำนวนเต็ม
เป็นโปรแกรมแบบเต็มมันยอมรับสตริงและพิมพ์การแสดงรายการดังกล่าว

ลองออนไลน์!

อย่างไร?

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

ฉันพยายามใช้œ¿และเป็นญาติ แต่หาทางแก้ไขไม่ได้ นี่คือที่ใกล้เคียงที่สุดที่ฉันได้รับ
dylnan

ใช่มันสามารถสั้นกว่านี้ได้ แต่ฉันจัดการเพียงหนึ่งไบต์ที่เลวร้ายไม่ได้ครึ่งไบต์ มันยังคงรู้สึกยาวเกินไป :(
Erik the Outgolfer

@EriktheOutgolfer มีการบันทึก 1 ไบต์ที่ง่ายเกินไปที่นี่
Jonathan Allan

2

SWI-Prolog 254 ไบต์

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

ตัวอย่าง:

?- 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 ไบต์

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

ลองออนไลน์!

คำอธิบาย

ในการติดตามดัชนีสตริงวงเล็บเปิดสตริงอินพุตจะถูกเขียนทับและใช้เป็นสแต็ก

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

ลองออนไลน์!


1

เยลลี่ , 20 ไบต์

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

ลองออนไลน์!

มันมีผลข้างเคียงกับการลงทะเบียนหวังว่ามันจะได้รับอนุญาตให้ทำหน้าที่


มันใช้ซ้ำได้ดังนั้นฉันคิดว่ามันใช้ได้ คำตอบของ BF มักจะไม่เว้นว่างไว้ในเทป
dylnan

1

Japt v1.4.5, 23 ไบต์

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

ลองออนไลน์!

เอาออกแล้วมันทำงานอย่างไร

;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

[closing index, opening index]เอาท์พุทเป็นอาร์เรย์บี้ หากไม่ต้องการลำดับย้อนกลับการเพิ่มwที่ส่วนท้ายของงาน (+1 ไบต์)


1

เสียงกระเพื่อมสามัญ 95 ไบต์

(lambda(u &aux s)(dotimes(p(length u))(case(elt u p)(#\[(push p s))(#\](print`(,(pop s),p))))))
รุ่นยาว
(defun par (string &aux stack)
  (dotimes (pos (length string))
    (case (char string pos)
      (#\[ (push pos stack))
      (#\] (print (list (pop stack) pos))))))
การทดสอบ
((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][] ")

พิมพ์:

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

1

K (ngn / k) , 38 37 ไบต์

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

ลองออนไลน์!

{ } ฟังก์ชั่นที่มีข้อโต้แย้ง x

"[]"=\:xรายการบูลีนสองรายการสำหรับการเกิดขึ้นของ"["และ"]"

a: มอบหมายให้ a

|/ บูลีน "หรือ" ของทั้งสองรายการ

& วงเล็บอยู่ที่ไหน (ที่ไหนดัชนี)

b: มอบหมายให้ b

-/รายการที่มี 1 สำหรับ"["-1 สำหรับ"]"และ 0 ทุกที่อื่น

+\ ผลรวมบางส่วน

|': pairwise maxima (แต่ละองค์ประกอบสูงสุดด้วยหนึ่งก่อนหน้านี้องค์ประกอบเริ่มต้นยังคงเหมือนเดิม)

สิ่งนี้แสดงถึงความลึกของวงเล็บสำหรับแต่ละอักขระ เราจัดทำดัชนีด้วยb(การวางเคียงกันคือการจัดทำดัชนี) และรับความลึกของวงเล็บสำหรับวงเล็บเท่านั้น

= "group by" - ความลึกการแม็พพจนานุกรมกับดัชนีที่เกิดขึ้น

,/ เชื่อมต่อค่าในพจนานุกรมโดยไม่สนใจคีย์

0N 2# เปลี่ยนรูปร่างเป็นเมทริกซ์ 2 คอลัมน์ (รายการของรายการ)

b@ดัชนีbกับแต่ละองค์ประกอบของเมทริกซ์


1

เยลลี่ , 20 18 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @ user202729 แจ้งฉันว่านั่นµ€คือ)

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

ลองออนไลน์!

หลังจากการต่อสู้กับสิ่งนี้เป็นเวลาหลายชั่วโมงเพื่อให้มันทำงานได้ ... ฉันประหลาดใจจริง ๆ ว่ามันสั้น :-)

คำอธิบาย

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

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

การแข่งขันที่น่าแปลกใจ - แพ้เฉพาะ Japt และ Jelly [ แก้ไข : และ Charcoal and Stax :(]

ลองออนไลน์!

คำอธิบาย

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

Pyth ,  28  26 ไบต์

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

ชุดทดสอบ

ในขณะที่มันยาวกว่าวิธีการที่ช่วยในการจำของแต่ฉันรู้สึกเหมือนฉันสามารถกอล์ฟนี้น้อยลงและนี้โชคดีที่ยังไม่ได้ใช้โครงสร้าง VPythonically-ความจำเป็นเช่น รุ่นเริ่มต้นคือ 36 ไบต์และยังมีข้อบกพร่องมากมาย

มันทำงานอย่างไร

{I # .e, t + lhfSI / LT`Y + ._> Qk \] - โปรแกรมเต็มรูปแบบ รับสตริงที่ยกมา Q จาก STDIN
   .e - แผนที่ที่แจกแจง k = ดัชนีการวนซ้ำ b = องค์ประกอบปัจจุบัน
                     > Qk - รับองค์ประกอบของ Q เป็นดัชนีที่มากกว่า k
                   ._ - สร้างคำนำหน้าทั้งหมดของสิ่งนี้
                  + \] - และต่อท้าย "]" (สำหรับการจัดการเคสขอบ)
          f - กรองรายการนี้ด้วย T = องค์ประกอบปัจจุบัน
              L `Y - สำหรับอักขระแต่ละตัวใน str ([])," [] "...
             / T - ... นับการเกิดขึ้นของมันใน T
           SI - และตรวจสอบว่าค่าเรียงลำดับมากขึ้นหรือไม่
         h - หัวหน้า ดึงองค์ประกอบแรก
       + l - รับความยาวของ + k นี้
      t - ลดลง (โดย 1)
     - และจับคู่ค่านี้กับ k ส่งคืน [i, k] โดยที่ฉันอยู่
                             ดัชนีของที่สอดคล้องกัน] และ k เป็นของ [
  # - กรองรายการนี้โดย:
{I - คู่นั้นคงที่มากกว่าการขจัดข้อมูลซ้ำซ้อน

{I#.e,t+lhfSI/LT`Y._>Q aaalmostทำงานสำหรับ 22 ไบต์ ...
นาย Xcoder

0

Perl 5, 53 ไบต์

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

perl -nE '<above code snippet>'ทำงานเป็น รับอินพุตผ่าน stdin

ตามปกติการแก้ไขปัญหา Perl ที่ดีที่สุดคือการแสดงออกปกติ เราพยายามจับคู่วงเล็บใด ๆ ที่ไม่มีคู่อยู่ภายในโดยใช้คลาสตัวละครที่ดูค่อนข้างโง่ ( s/\[[^][]*\]/.../) หากการแข่งขันประสบความสำเร็จเราจะแทนที่ข้อความที่ตรงกันด้วยตัวเลข1ซ้ำแล้วซ้ำอีกเพื่อให้เราไม่จับคู่วงเล็บเหล่านั้นอีกครั้งโดยไม่ตั้งใจและเราจะพิมพ์ดัชนีของการแข่งขัน ล้างและทำซ้ำ


0

Stax , 13 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

จะใช้อินพุทสแต็คเพื่อติดตามคู่รั้งเปิด นี่คือโปรแกรมที่คลายบีบอัดไม่โหลดและแสดงความคิดเห็น

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

เรียกใช้อันนี้


0

ถ่าน 20 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

FLθ

วนรอบช่วงโดยนัยของความยาวของสตริงป้อนเข้า

≡§θι

เปิดใช้ตัวอักษรปัจจุบัน

[⊞υι

ถ้าเป็น[แล้วให้กดดัชนีปัจจุบันไปที่ตัวแปรอาร์เรย์ที่กำหนดไว้ล่วงหน้า

]«I⊟υ,Iι⸿

ถ้ามันเป็น]ดัชนีป๊อปอัพล่าสุดจากตัวแปรอาร์เรย์และพิมพ์และดัชนีปัจจุบันคั่นด้วยเครื่องหมายจุลภาคและเริ่มบรรทัดใหม่ รูปแบบเอาต์พุตอื่นหากเป็นที่ยอมรับจะบันทึกบางไบต์: ]I⟦⊟υιωบันทึก 2 ไบต์ แต่พิมพ์ดัชนีแต่ละรายการในบรรทัดแยกกันโดยเว้นระยะคู่ของดัชนี ]I⟦⊟υιเพียงพิมพ์ดัชนีบนบรรทัดแยกทำให้ยากที่จะแยกแยะพวกเขา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.