สร้างเกร็ดเล็กเกร็ดน้อย Brain-Flak ทั้งหมด


14

คำถามนี้เป็นความท้าทายครั้งที่สองของ Brain-Flak Birthday ที่ออกแบบมาเพื่อฉลองวันเกิดครั้งแรกของ Brain-Flak! คุณสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับวันเกิดของ Brain-Flak ได้ที่นี่

ท้าทาย

สำหรับความท้าทายนี้คุณจะสร้างสตริงที่จับคู่ทั้งหมดจากรายการของวงเล็บ ในการขอยืมคำจำกัดความของ DJMcMayhem สำหรับสตริงที่ตรงกันอย่างสมบูรณ์:

  • สำหรับวัตถุประสงค์ของการท้าทายนี้เป็น "วงเล็บ" ใด ๆ ()[]{}<>ของตัวละครเหล่านี้:

  • เครื่องหมายวงเล็บคู่หนึ่งถือว่าเป็น "จับคู่" หากวงเล็บเปิดและปิดอยู่ในลำดับที่ถูกต้องและไม่มีอักขระอยู่ภายในเช่น

    ()
    []{}
    

    หรือถ้าทุกองค์ประกอบย่อยภายในนั้นถูกจับคู่ด้วย

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

    องค์ประกอบย่อยยังสามารถซ้อนกันหลายชั้นลึก

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • สตริงถือว่าเป็น "จับคู่อย่างสมบูรณ์" ถ้าเฉพาะในวงเล็บแต่ละคู่มีวงเล็บเปิดและปิดที่ถูกต้องในลำดับที่ถูกต้อง


อินพุต

โปรแกรมหรือฟังก์ชั่นของคุณจะบันทึกรายการหมายเลขสี่ตัวที่ไม่เป็นลบในรูปแบบที่สะดวกและสอดคล้องกัน ซึ่งรวมถึง (แต่ไม่ จำกัด เฉพาะ) รายการของจำนวนเต็มสตริงที่คั่นด้วยตัวเลขที่ไม่ใช่ตัวเลขหรืออาร์กิวเมนต์ที่แยกต่างหาก ตัวเลขสี่ตัวนี้แสดงถึงจำนวนคู่ที่ตรงกันของวงเล็บแต่ละประเภท ตัวอย่างเช่น[1,2,3,4]จะเป็นตัวแทนของ:

  • 1 คู่ของ ()

  • 2 คู่ของ {}

  • 3 คู่[]และ

  • 4 คู่ <>

คุณสามารถเลือกวงเล็บคู่ใดที่แต่ละอินพุทสอดคล้องกับตราบเท่าที่มันสอดคล้องกัน

เอาท์พุต

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

อัลกอริทึมของคุณต้องใช้งานได้กับอินพุตใด ๆ แต่คุณไม่จำเป็นต้องกังวลเกี่ยวกับการ จำกัด หน่วยความจำเวลาหรือจำนวนเต็ม (เช่นถ้าคำตอบของคุณอยู่ใน C คุณจะไม่ได้รับ 2 33เป็นอินพุต)

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่างอินพุตและเอาต์พุต

สำหรับตัวอย่างเหล่านี้ฉันจะใช้ลำดับอินพุตเดียวกันกับข้างบน

สำหรับแต่ละตัวอย่างบรรทัดแรกจะเป็นอินพุตและบรรทัดต่อไปนี้จะเป็นเอาต์พุต

Example 0:
[0,0,0,0]


Example 1:
[1,0,0,0]
()

Example 2:
[0,2,0,0]
{}{}
{{}}

Example 3:
[0,0,1,1]
[]<>
[<>]
<[]>
<>[]

Example 4:
[0,1,2,0]
{}[][]  {}[[]]  {[]}[]  {[][]}  {[[]]} 
[{}][]  [{}[]]  [{[]}]  []{}[]  []{[]} 
[][{}]  [][]{}  [[{}]]  [[]{}]  [[]]{}

Example 5:
[1,0,0,3]
()<><><>  ()<><<>>  ()<<>><>  ()<<><>>  ()<<<>>>  (<>)<><>  (<>)<<>>
(<><>)<>  (<><><>)  (<><<>>)  (<<>>)<>  (<<>><>)  (<<><>>)  (<<<>>>)
<()><><>  <()><<>>  <()<>><>  <()<><>>  <()<<>>>  <(<>)><>  <(<>)<>>
<(<><>)>  <(<<>>)>  <>()<><>  <>()<<>>  <>(<>)<>  <>(<><>)  <>(<<>>)
<><()><>  <><()<>>  <><(<>)>  <><>()<>  <><>(<>)  <><><()>  <><><>()
<><<()>>  <><<>()>  <><<>>()  <<()>><>  <<()><>>  <<()<>>>  <<(<>)>>
<<>()><>  <<>()<>>  <<>(<>)>  <<>>()<>  <<>>(<>)  <<>><()>  <<>><>()
<<><()>>  <<><>()>  <<><>>()  <<<()>>>  <<<>()>>  <<<>>()>  <<<>>>()

Example 6:
[1,1,1,1]

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

คำตอบ:


6

Haskell , 128 ไบต์

fเป็นหน้าที่หลักก็จะใช้เวลารายการIntและส่งกลับรายการของStrings

f=g.($zip"({[<"")}]>").zipWith replicate
g=max[""].(#g)
l#c=[b:s|x@(b,e):r<-l,s<-(r:filter(/=x:r)l)?(map(e:).c)]
l?c=c l++l#(?c)

ลองออนไลน์!

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

  • fแปลงรายการอินพุตเป็นรายการของสิ่งอันดับแต่ละ tuple มีคู่วงเล็บปีกกาแต่ละชนิดมีวงเล็บในรายการย่อยของตนเอง เช่นจะกลายเป็น[1,2,0,0] [[('{','}')],[('[',']'),('[',']')]]จากนั้นจะโทรgด้วยรายการที่ถูกแปลง
  • ฟังก์ชั่นที่เหลือใช้รูปแบบการส่งต่อความต่อเนื่องบางส่วนซึ่งผสมผสานกับการจัดการรายการ แต่ละฟังก์ชั่นความต่อเนื่องcใช้รายการlของรายการtuple วงเล็บที่เหลือและส่งกลับรายการของสตริงที่เป็นไปได้ที่จะต่อท้ายกับสิ่งที่สร้างขึ้น
  • g lสร้างรายการของสตริงจับคู่อย่างเต็มที่ formable lโดยใช้วงเล็บทั้งหมดใน
    • มันทำได้โดยการโทรl#gเพื่อสร้างสตริงที่เริ่มต้นด้วยวงเล็บบางส่วน gพารามิเตอร์แบบเรียกซ้ำตัวเองใช้เป็นความต่อเนื่อง#ในการสร้างสิ่งที่เกิดขึ้นหลังจากองค์ประกอบย่อยวงเล็บแรก
    • ในกรณีที่ไม่มีสตริงดังกล่าว (เพราะlไม่มีวงเล็บอยู่ภายใน)gจะส่งกลับแทน[""]รายการที่มีเพียงสตริงว่าง ตั้งแต่[""]เปรียบเทียบขนาดเล็กที่จะว่างทุกรายการ produceable โดยเราสามารถทำเช่นนี้โดยการใช้#max
  • l#cสร้างสตริงจากlจุดเริ่มต้นด้วยองค์ประกอบย่อยที่ถูกยึดอย่างน้อยหนึ่งรายการออกไปยังความต่อเนื่องcเพื่อกำหนดว่าอะไรต่อไปนี้องค์ประกอบ
    • bและeเป็นคู่ของวงเล็บที่เลือกใน tuple xและrเป็นรายการของ tuples ที่เหลืออยู่ของประเภท bracket
    • r:filter(/=x:r)l คือ lกับ tuple xลบออกเล็กน้อยที่จัดใหม่
    • ?เรียกว่าการสร้างองค์ประกอบย่อยที่เป็นไปได้ระหว่างและb eมันได้รับความต่อเนื่องของตัวเองmap(e:).cซึ่งนำหน้าแต่ละสายต่อท้ายที่สร้างขึ้นโดยec
    • #ตัวเองbจะเริ่มต้นกับสตริงทั้งหมดที่สร้างขึ้นโดย?cและ
  • l?cสร้างสตริงที่จับคู่อย่างสมบูรณ์ซึ่งสามารถจัดรูปแบบได้โดยใช้คู่ของวงเล็บศูนย์หรือมากกว่าจากlนั้นปล่อยให้มันดำเนินการต่อcเพื่อจัดการกับสิ่งที่เหลืออยู่ c lส่วนไปโดยตรงไปcโดยไม่ต้องเพิ่มองค์ประกอบย่อยที่ใด ๆ ในขณะที่l#(?c)ใช้#ในการสร้างหนึ่ง subelement แล้วโทร(?c)ซ้ำสำหรับคนต่อไปได้

4

เจลลี่ , 50 40 34 ไบต์

-6 ไบต์ขอบคุณ Leaky Nun (การลดการทำงานที่ฉันทำไม่ได้)

“()“{}“[]“<>”©ẋ"FŒ!QµW;®œṣF¥/µÐLÐḟ

ธรรมดาและไม่มีประสิทธิภาพ

ลองออนไลน์!(หมดเวลาที่ TIO สำหรับ [1,1,1,1] - ใช่ไม่มีประสิทธิภาพ)

อย่างไร?

ลบคู่ของวงเล็บที่ตรงกันซึ่งอยู่ติดกันซ้ำ ๆ จนกว่าจะไม่มีการลบออกอีกต่อไปสำหรับสตริงที่เป็นไปได้ทุกอันที่อาจเกิดขึ้นทำให้สตริงนั้นลดน้อยลงไป (ไม่มีเนื้อหาที่ตรงกันทั้งหมด)

“()“{}“[]“<>”©ẋ"FŒ!QµW;®œṣF¥/µÐLÐḟ - Main link: list: [n(), n{}, n[], n<>]
“()“{}“[]“<>”                      - literal ["()", "{}", "[]", "<>"]
             ©                     - copy to register
               "                   - zip with:
              ẋ                    -   repeat list
                F                  - flatten
                 Œ!                - all permutations (yeah, it's inefficient!)
                   Q               - de-duplicate
                    µ              - monadic chain separation
                                Ðḟ - filter discard if (non empty is truthy):
                             µÐL   -   loop until no change:
                       ®           -     recall value from register
                     W             -     wrap loop variable in a list
                      ;            -     concatenate
                           ¥/      -     reduce with last two links as a dyad:
                        œṣ         -       split left on occurrences of sublist on the right
                          F        -       flatten the result

1
ไม่จำเป็นต้องใช้เทคนิค eval ... ใช้ลดแทน 35 bytes
Leun Nun

1
การย้ายบรรทัดแรกเป็นวินาที ... 34 bytes
Leun Nun

@LeakyNun ขอบคุณ! ฉันพยายาม แต่ไม่สามารถลดการทำงานได้
Jonathan Allan

ดีผมใช้วิธีการเดียวกันของœṣ- F- µÐLในปัญหาที่เกี่ยวข้องบ้าง
Zacharý

3

Pyth - 83 74 71 63 ไบต์

K("\[]""{}""\(\)""<>")Fd{.psm*:@Kd*\\2k@QdU4JdVldFHK=:JHk))I!Jd

ลองมัน

1 : Kc "[] {} () <>") Fd {.ps * VR \ KQJdVldFHK =: JHk)) I! Jd

นอกจากนี้รุ่น 53 ไบต์ต้องขอบคุณ Leaky Nun

Kc"\[] \{} \(\) <>")Fd{.ps*V-R\\KQJdVldFHK=:JHk))I!Jd

ที่นี่


เยลลี่ที่ถูกโจมตีโดย Pyth? คาถานี้คืออะไร?
คณิตศาสตร์ junkie

@ Mathjunkie ฉันไม่ได้ชนะ Jelly; ฉันเมาไวยากรณ์อินพุต
Maria

... และฉันคิดว่าฉันสามารถปรับปรุง: D
Jonathan Allan

@JanathanAllan สามารถตอบได้เช่นนี้
แม่ชีที่รั่วไหล

1
ขั้นตอนที่ 1: แทนที่จะ("\[]""{}""\(\)""<>")ทำc"\[] \{} \(\) <>")(แยกกันในช่องว่าง); แทนที่จะ:@Kd*\\2kทำ-@Kdตามเราด้วยแบ็กสแลชสองอัน จากนั้นแทนที่จะทำแผนที่U4เราจะทำ*V-R\\KQ(คูณสองอาร์เรย์ในแบบคู่ขนาน) แถวแรกจะถูกสร้างขึ้นโดยใช้Rคือ-R\\kนี้จะทำให้คุณมีรุ่น 54 ไบต์
รั่วนูน

2

05AB1E , 33 32 30 27 25 ไบต์

ที่บันทึกไว้ 7 ไบต์ต้องขอบคุณไรลีย์

คำสั่งซื้อคือ [(),<>,[],{}]

žu4äשJœJÙD[D®õ:DŠQ#]€g_Ï

ลองออนไลน์!

คำอธิบาย

žu                             # push the string "()<>[]{}"
  4ä                           # split in 4 parts
    ©                          # store a copy in register
     ×                         # repeat each bracket a number of times decided by input
      JœJÙ                     # get the unique permutations of the string of brackets
          D                    # duplicate
           [                   # start infinite loop
            D                  # duplicate current list of permutations
             ®õ:               # replace any instance of (), [], <>, {} 
                               # with an empty string
                DŠ             # duplicate and move down 2 places on stack
                  Q#           # if the operation didn't alter the list, exit loop
                    ]          # end loop
                     €g        # get the length of each subtring
                       _Ï      # keep only the strings in the original 
                               # list of unique permutations 
                               # that have a length of 0 in the resulting list

1. ฉันคิดว่า:vectorizes (คุณสามารถข้ามวนวนอนันต์ได้) 2. จะสั้นลง 1 ไบต์เพื่อใช้UXที่จุดเริ่มต้นและXเมื่อคุณต้องการรายการของวงเล็บอีกครั้ง
Riley

@ ไรลีย์: ฉันได้ลอง:ก่อน แต่เราพบปัญหาเมื่อมีตัวอย่างเช่นการแทนที่บน{}สร้างการแทนที่ที่เป็นไปได้()เพราะเราได้ลองแทนที่ทั้งหมด()แล้ว จุดดีเกี่ยวกับUXแม้ว่า เราสามารถรับไบต์อื่นด้วย©®เช่นกัน
Emigna

ความจริงที่Uปรากฏบนสุดนั้นน่าหงุดหงิดอยู่เสมอ ©®ผมไม่ทราบเกี่ยวกับ
Riley

ฉันกำลังดูคำตอบนี้ 05AB1E ได้รับการอัปเดตที่ทำลายหรือคำตอบนั้นไม่ถูกต้องหรือไม่
Riley

คำตอบที่ทำงานแต่ไม่ได้สำหรับ[([]{})<{[()<()>]}()>{}] ความแตกต่างเพียงอย่างเดียวคือถูกลบออก[({})<{[()<()>]}()>{}] []ฉันจะถามเกี่ยวกับมันในไตรวิว
Riley

2

ทับทิม 123 ไบต์

->a{"<>{}[]()".gsub(/../){$&*a.pop}.chars.permutation.map(&:join).uniq.grep /^((\(\g<1>\)|\[\g<1>\]|\{\g<1>\}|<\g<1>>)*)$/}

ลองออนไลน์! แม้ว่ามันจะไม่มีประสิทธิภาพดังนั้นแม้กระทั่งอินพุตเช่น[1,2,1,1]จะหมดเวลาออนไลน์ ตัวอย่างที่แสดงไว้ทั้งหมดจะได้ผลอย่างน้อยที่สุด!

คำอธิบาย

->a{                                        # Procedure with input a
    "<>{}[]()".gsub(/../){                  # For all pairs of brackets
                          $&*a.pop          # Pop last item in input, then repeat
                                            #   the bracket pair by that number
                                  }.chars   # Get characters
        .permutation                        # All permutations of characters
                    .map(&:join)            # For each permutation, join the chars
                                .uniq       # Get unique permutations only
            .grep /^((\(\g<1>\)|\[\g<1>\]|\{\g<1>\}|<\g<1>>)*)$/}
                                            # Only return permutations that match
                                            #   this bracket-matching regex
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.