แสดงเครื่องหมายวงเล็บอย่างเต็มที่


11

วันนี้ความท้าทายของคุณคือการผลิตวงเล็บที่เป็นไปได้ทั้งหมดของการแสดงออก

การป้อนข้อมูลของคุณเป็น ASCII ที่พิมพ์ได้บรรทัดเดียวที่มีหนึ่งคำหรือมากกว่านั้นคั่นด้วยเครื่องหมาย อินพุตอาจมีช่องว่าง - คุณต้องละเว้นสิ่งเหล่านี้ คำที่เป็นผู้ประกอบการคือ[a-zA-Z0-9] [^ ()a-zA-Z0-9]คุณอาจคิดว่าอินพุตนั้นถูกต้องเสมอ

เอาท์พุทวิธีที่เป็นไปได้ทั้งหมดในการวงเล็บนิพจน์ที่กำหนดโดยคั่นด้วยการขึ้นบรรทัดใหม่ด้วยการขึ้นบรรทัดใหม่ที่เป็นตัวเลือก

ทำไม่ได้ :

  • คำศัพท์วงเล็บ - วงเล็บเท่านั้นรอบตัวดำเนินการ
  • เรียงลำดับเงื่อนไขใหม่
  • ส่งออกช่องว่างใด ๆ

ตัวอย่างอินพุต / เอาต์พุต:

N
N

a * b
(a*b)

x_x_0
(x_(x_0))
((x_x)_0)

a * b|c|d
(a*(b|(c|d)))
(a*((b|c)|d))
((a*b)|(c|d))
((a*(b|c))|d)
(((a*b)|c)|d)

รหัสที่เล็กที่สุดเป็นไบต์ชนะ


คุณต้องแสดงรายการโอเปอเรเตอร์ที่แน่นอนที่เราต้องพิจารณา เป็น!ผู้ประกอบการ? เกี่ยวกับอะไร
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ฉันแสดงการแสดงออกปกติของสิ่งที่ถือว่าเป็นผู้ประกอบการ !เหมาะกับ regex อย่างไรก็ตามไม่สามารถเป็นส่วนหนึ่งของอินพุตได้เพราะมันไม่สามารถพิมพ์ได้ ASCII
orlp

อ่าโอเค. ดังนั้นทุกอย่างยกเว้นเทอมคือโอเปอเรเตอร์ ...
เครื่องมือเพิ่มประสิทธิภาพ

ดังนั้นทั้งข้อกำหนดและโอเปอเรเตอร์จึงมีความยาวหนึ่งอักขระเสมอ
user81655

1
ใส่ LISP ที่เกี่ยวข้องกับคำสั่งบังคับที่นี่
แมว

คำตอบ:


2

Pyth, 38 ไบต์

L?tbsmmjj@bdk"()"*y<bdy>bhd:1lb2bjy-zd

ลองออนไลน์

มันกำหนดฟังก์ชั่นซ้ำที่:

  • ส่งคืนอินพุตหากความยาวคือ 1
  • รับอินพุตสองตัวแยกทั้งหมดจากตัวดำเนินการและสำหรับแต่ละตัวแยก:
    • เรียกตัวเองซ้ำ ๆ ในแต่ละส่วน
    • นำผลิตภัณฑ์คาร์ทีเซียนของผลลัพธ์ของแต่ละครึ่ง
    • รวมผลลัพธ์แต่ละรายการโดยผู้ดำเนินการที่แยก
    • วงเล็บผลลัพธ์การรวม
  • และในที่สุดก็เชื่อมต่ออาร์เรย์ที่เกิดขึ้น

จากนั้นฟังก์ชั่นจะถูกเรียกพร้อมกับสตริงอินพุตที่ลบช่องว่างและผลลัพธ์จะถูกรวมเข้าด้วยบรรทัดใหม่


3

JavaScript (ES6), 208 197 ไบต์

s=>((q=x=>x.map((_,i)=>(a=[...x.slice(0,i*=2),p="("+x[i]+x[++i]+x[++i]+")",...x.slice(i+1)],x[i]?a[1]?q(a):r.push(p):0)))([...s.replace(/ /g,o="")],r=[]),r.map((l,i)=>r.indexOf(l)<i?0:o+=l+`
`),o)

คำอธิบาย

ใช้ฟังก์ชั่นวนซ้ำที่ใช้อาร์เรย์ของ[ t, o, t, o, etc... ]และวงเล็บแต่ละคู่ต่อเนื่องของคำสองคำที่เหมือนกัน[ (tot), o, etc... ]และทำซ้ำกระบวนการนี้จนกว่าจะมีเพียงหนึ่งองค์ประกอบในอาร์เรย์จากนั้นกรองค่าที่ซ้ำกัน

s=>(                                  // s = input string
  (q=x=>                              // q = parenthesise array function
    x.map((_,i)=>(
      a=[                             // a = p with parenthesised pair of terms
        ...x.slice(0,i*=2),
        p="("+x[i]+x[++i]+x[++i]+")", // parenthesise and join 2 terms and an operator
        ...x.slice(i+1)
      ],
      x[i]?a[1]                       // make sure the loop is not over
        ?q(a)                         // check next level of permutations
        :r.push(p)                    // add the permutation to the results
      :0
    ))
  )([...s.replace(/ /g,               // remove spaces and parenthesise all expressions
    o="")],                           // o = output string
    r=[]),                            // r = array of result strings
  r.map(                              // filter out duplicates
    (l,i)=>r.indexOf(l)<i?0:o+=l+`
`
  ),o)                                // return o

ทดสอบ

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