เติม Bracks


18

วงเล็บปกติ ( (), [], <>และ{}) ที่ดีและชัดเจน แต่ใครบางคนคิดว่ามันจะเป็นความคิดที่ดีที่จะใช้ตัวอักษรวงเล็บไม่ใช่เป็นวงเล็บ อักขระเหล่านี้|และ"มีความคลุมเครือ ตัวอย่างเช่น

""""

สอดคล้องกับ

(())

หรือ

()()

มันเป็นไปไม่ได้ที่จะบอก

สิ่งต่าง ๆ เริ่มน่าสนใจเมื่อคุณผสมวงเล็บประเภทที่ไม่ชัดเจนเช่น

"|""||""|"

อาจเป็นอย่างใดอย่างหนึ่งต่อไปนี้

([(([]))]),([()[]()]),([()][()])

งาน

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

เพิ่มเติมรูปธรรมผลผลิตสตริงสมดุลทั้งหมดที่สามารถทำแทนที่|ด้วย[หรือ]และ"ด้วยหรือ( )คุณไม่ควรส่งออกสตริงที่สมดุลใด ๆ สองครั้ง

IO

เป็นข้อมูลที่คุณควรจะสตริงประกอบด้วยและ| "หากคุณต้องการเลือกอักขระที่แตกต่างกันสองตัวนอกเหนือจาก|และ"เพื่อใช้เป็นตัวแทนที่คุณสามารถทำได้ คุณควรส่งออกคอนเทนเนอร์ของสตริงที่สมดุล คุณอาจเลือกที่จะเปลี่ยน[]และ()ในการส่งออกกับคนอื่น ๆ สองคู่วงเล็บใด ๆ ( (), [], <>หรือ{}) ที่คุณต้องการ รูปแบบผลลัพธ์ของคุณควรสอดคล้องกันระหว่างการดำเนินการ

เกณฑ์การให้คะแนน

นี่คือดังนั้นคำตอบจะได้คะแนนเป็นไบต์ด้วยจำนวนไบต์ที่น้อยกว่าจะดีกว่า

กรณีทดสอบ

"" -> ["()"]
"|"| -> []
||| -> []
"""" -> ["(())","()()"]
""|| -> ["()[]"]
"|"||"|" -> ["([([])])"]    
"|""||""|" -> ["([(([]))])","([()[]()])","([()][()])"]    

4
รอคำตอบจาก BrainFlak
caird coinheringaahing

เราสามารถใช้จำนวนเต็มแทนสตริงได้หรือไม่? สิ่งที่เกี่ยวกับรายการของตัวเลขหรือจำนวนเต็ม?
Zgarb

@Zgarb แน่นอนว่าใช้ได้
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


7

Python 2 , 135 ไบต์

s=input()
for k in range(2**len(s)):
 try:c=''.join("[]() , ,"[int(c)|k>>i&1::4]for i,c in enumerate(s));eval(c);print c[::2]
 except:0

ลองออนไลน์!

คาดว่าจะมีการป้อนข้อมูล2002แทน"||"และปิดด้วยเครื่องหมายคำพูด

ทำซ้ำการมอบหมายที่เป็นไปได้ทั้งหมด 2 Nของ "open" และ "close" กับสตริงการสร้างสตริงcเช่น:

"( [ ( ),],[ ( ),],),( ),"

ถ้าeval-ing สายนี้โยนข้อยกเว้นมันจะไม่ตรงกัน ถ้าไม่เราพิมพ์ c[::2]ให้:

([()][()])()

6

เรติน่า , 59 56 55 ไบต์

0`"
<$%">
}0`'
{$%"}
.+
$&_$&
+m`^_|(<>|{})(?=.*_)

A`_

ลองออนไลน์! น่าเสียดายที่การทดสอบวงเล็บที่จับคู่สองชุดนั้นเกิน golfiness ของ. NET regex เดียวดังนั้นจึงช่วยประหยัด 15 ไบต์ในการตรวจสอบด้วยตนเอง แก้ไข: บันทึกแล้ว3 4 ไบต์ขอบคุณ @ H.PWiz คำอธิบาย:

0`"
<$%">

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

}0`'
{$%"}

ในทำนองเดียวกันกับ', และ{ }จากนั้นให้เปลี่ยนจนทุก"และ'บนสำเนาทั้งหมดได้ถูกแทนที่

.+
$&_$&

_ตรวจซ้ำวงเล็บที่แยกจากกันโดย

+m`^_|(<>|{})(?=.*_)

ในซ้ำให้ลบวงเล็บที่จับคู่ซ้ำ ๆ จนกว่าจะไม่มีใครเหลือซึ่งในกรณีนี้จะลบเครื่องหมาย_ดังกล่าวด้วย

A`_

_ลบทุกสายที่ยังคงมี

เรติน่า , 74 71 70 ไบต์

0`"
<$%">
}0`'
{$%"}
Lm`^(.(?<=(?=\3)(<.*>|{.*}))(?<-3>)|(.))+(?(3)_)$

ลองออนไลน์! คำอธิบาย: สองสเตจแรกเป็นดังกล่าวข้างต้น ขั้นตอนที่สามพิมพ์ผลลัพธ์ของการจับคู่วงเล็บที่จับคู่สองชุดโดยตรง สิ่งนี้ใช้กลุ่มที่สมดุลของ. NET ในแต่ละขั้นตอนของการแข่งขัน regex พยายามจับคู่อักขระแล้วมองหาคู่ของวงเล็บที่ตรงกันจากนั้นตรวจสอบว่าด้านบนของสแต็กตรงกับวงเล็บเปิด หากสามารถทำเช่นนี้ได้แสดงว่าวงเล็บนั้นมียอดคงเหลือและวงเล็บเปิดนั้นโผล่ขึ้นมาจากกองซ้อน มิฉะนั้นสมมติฐานคือเราอยู่ในวงเล็บเปิดที่ต้องผลักไปที่กองซ้อน หากสมมติฐานเหล่านี้ไม่ได้เก็บไว้สแต็คจะไม่ว่างเปล่าในตอนท้ายและการแข่งขันจะล้มเหลว

ทางเลือกวิธี74 74ไบต์เช่นกัน:

Lm`^((?=(<.*>|{.*})(?<=(.))).|\3(?<-3>))+(?(3)_)$

ที่นี่เรามองไปข้างหน้าเพื่อหา<... >หรือ{... }จากนั้นมองด้านหลังเพื่อดันวงเล็บปิดไปยังสแต็ก มิฉะนั้นเราจะต้องจับคู่และวางวงเล็บปิดที่เราบันทึกไว้ก่อนหน้านี้ ในรุ่นนี้ regex อาจไม่ได้ทำให้มันถึงจุดสิ้นสุดของสตริง แต่บางสายเช่น<<<>จะลื่นผ่านเน็ตถ้าเราไม่ได้ตรวจสอบสแต็กที่ว่างเปล่า


1
คุณสามารถบันทึกบางไบต์ในการหลบหนีโดยใช้อักขระที่แตกต่างกัน
H.PWiz

@ H.PWiz Ah ฉันต้องมองข้ามบิตนั้นเกี่ยวกับการใช้วงเล็บคู่ทางเลือกขอบคุณ!
Neil

นอกจากนี้คุณยังสามารถเปลี่ยน|อินพุตได้
H.PWiz

2

Husk , 19 ไบต์

fo¬ω`ḞoΣx½¨÷₂¨ΠmSe→

ลองออนไลน์! ใช้อักขระdsในอินพุตและวงเล็บเหลี่ยมที่สอดคล้องกันdeและstในเอาต์พุต

คำอธิบาย

แนวคิดคือสร้างวงเล็บที่เป็นไปได้ทั้งหมดของอินพุตและเก็บค่าที่ลดลงเป็นสตริงว่างเมื่อเราลบวงเล็บที่อยู่ติดกันซ้ำ ๆ ¨÷₂¨เป็นสตริงบีบอัดที่ขยายเข้าไปใน"dest"ซึ่งได้รับเลือกเพราะมันมีรูปแบบสั้นอัดและประกอบด้วยตัวอักษรคู่กับ codepoints ที่อยู่ติดกัน ดังนั้นโปรแกรมเทียบเท่าดังต่อไปนี้

fo¬ω`ḞoΣx½"dest"ΠmSe→  Implicit input, say "ddssdd".
                 m     Map over the string:
                  Se    pair character with
                    →   its successor.
                       Result: ["de","de","st","st","de","de"]
                Π      Cartesian product: ["ddssdd","ddssde",..,"eettee"]
f                      Keep those strings that satisfy this:
                        Consider argument x = "ddsted".
   ω                    Iterate on x until fixed:
         ½"dest"         Split "dest" into two: ["de","st"]
    `Ḟ                   Thread through this list (call the element y):
        x                 Split x on occurrences of y,
      oΣ                  then concatenate.
                          This is done for both "de" and "st" in order.
                        Result is "dd".
 o¬                    Is it empty? No, so "ddsted" is not kept.
                      Result is ["destde","ddstee"], print implicitly on separate lines.

2

Perl, 56 55 53 ไบต์

รวม+1สำหรับn

ใช้[สำหรับ[]และ{สำหรับ{}

perl -nE 's%.%"#1$&,+\\$&}"^Xm.v6%eg;eval&&y/+//d+say for< $_>' <<< "[{[[{{[[{["

สร้างความเป็นไปได้ทั้งหมด 2 ^ N จากนั้นใช้ Perl evalเพื่อตรวจสอบว่าสตริงเช่น '+ [+ {}]' เป็นรหัสที่ถูกต้องและถ้าเอาออก+และพิมพ์ผลลัพธ์




1

Perl, 56 ไบต์

รวม+สำหรับn

ใช้อินพุต[สำหรับเอาต์พุต[หรือ]

ใช้อินพุต{สำหรับเอาต์พุต{หรือ}

perl -nE '/^((.)(?{$^R.$2})(?1)*\2(?{$^R.=$2^v6}))*$(?{say$^R})^/' <<< "[{[[{{[[{["

ใช้ regex ที่ขยายเพิ่มเพื่อจับคู่วงเล็บปีกกาในขณะที่ติดตามตัวเลือกที่ทำในระหว่างการย้อนรอย สิ่งนี้จะมีประสิทธิภาพมากกว่าการสร้างผู้สมัคร 2 ^ N ทั้งหมดเพราะมันปฏิเสธการมอบหมายที่เป็นไปไม่ได้จำนวนมากแล้วในขณะที่ผ่านสายป้อนข้อมูล


0

Kotlin , 240 236 234 ไบต์

fold(listOf("")){r,c->r.flatMap{i->when(c){'"'->"()".map{i+it}
else->"[]".map{i+it}}}}.filter{val d=ArrayList<Char>()
it.all{fun f(c:Any)=d.size>1&&d.removeAt(0)==c
when(it){')'->f('(')
']'->f('[')
else->{d.add(0,it);1>0}}}&&d.size<1}

เชิดชู

    fold(listOf("")) {r,c ->
        r.flatMap {i-> when(c) {
            '"'-> "()".map {i+it}
            else -> "[]".map {i+it}
        }}
    }.filter {
        val d = ArrayList<Char>()
        it.all {
            fun f(c:Any)=d.size>1&&d.removeAt(0)==c
            when(it) {
                ')' -> f('(')
                ']' -> f('[')
                else -> {d.add(0,it);1>0}
            }
        } && d.size<1
    }

ทดสอบ

private fun String.f(): List<String> =
fold(listOf("")){r,c->r.flatMap{i->when(c){'"'->"()".map{i+it}
else->"[]".map{i+it}}}}.filter{val d=ArrayList<Char>()
it.all{fun f(c:Any)=d.size>1&&d.removeAt(0)==c
when(it){')'->f('(')
']'->f('[')
else->{d.add(0,it);1>0}}}&&d.size<1}

data class Test(val input: String, val outputs: List<String>)

val tests = listOf(
    Test("""""""", listOf("()")),
    Test(""""|"|""", listOf()),
    Test("""|||""", listOf()),
    Test("""""""""", listOf("(())","()()")),
    Test("""""||""", listOf("()[]")),
    Test(""""|"||"|"""", listOf("([([])])")),
    Test(""""|""||""|"""", listOf("([(([]))])","([()[]()])","([()][()])"))
)

fun main(args: Array<String>) {
    for ((input, output) in tests) {
        val actual = input.f().sorted()
        val expected = output.sorted()
        if (actual != expected) {
            throw AssertionError("Wrong answer: $input -> $actual | $expected")
        }
    }

การแก้ไข

  • -4 jrtapsell - ทำใหม่การตรวจสอบเพรดิเคต
  • -2 jrtapsell - true-> 1>0และ== 0->< 1

0

C (gcc) , 315 ไบต์

  • ขอบคุณceilingcatสำหรับ 19 ไบต์
j,b;B(char*S){char*s=calloc(strlen(S)+2,b=1)+1;for(j=0;S[j];b*=(S[j]<62||*--s==60)*(S[j++]-41||*--s==40))S[j]==60?*s++=60:0,S[j]<41?*s++=40:0;return*s>0&*--s<1&b;}f(S,n,k)char*S;{if(n<strlen(S))for(k=2;k--;)S[n]==46-k-k?S[n]=40+k*20,f(S,n+1),S[n]=41+k*21,f(S,-~n),S[n]=46-k-k:0;else B(S)&&puts(S);}F(int*S){f(S,0);}

ลองออนไลน์!


C (gcc) , 334 ไบต์ (รุ่นเก่า)

j,b;B(char*S){char*s=calloc(strlen(S)+2,1)+1;for(b=1,j=0;S[j];j++){if(S[j]==60)*s++=60;if(S[j]<41)*s++=40;b*=!(S[j]>61&&*--s!=60)*!(S[j]==41&&*--s!=40);}return*s>0&*--s<1&b;}f(S,n,k)char*S;{if(n>=strlen(S))return B(S)&&puts(S);for(k=0;k<2;k++)S[n]==46-k-k&&(S[n]=40+k*20,f(S,n+1),S[n]=41+k*21,f(S,-~n),S[n]=46-k-k);}F(char*S){f(S,0);}

ลองออนไลน์!


คำอธิบาย (เวอร์ชั่นเก่า)

j,b;B(char*S){                   // determine if string is balanced
 char*s=calloc(strlen(S)+2,1)+1; // array to store matching brackets
 for(b=1,j=0;S[j];j++){          // loop through string (character array)
  if(S[j]==60)*s++=60;           // 60 == '<', opening bracket
  if(S[j]<41)*s++=40;            // 40 == '(', opening bracket
  b*=!(S[j]>61&&*--s!=60)*       // 62 == '>', closing bracket
   !(S[j]==41&&*--s!=40);}       // 41 == ')', closing bracket
 return*s>0&*--s<1&b;}           // no unmatched brackets and no brackets left to match
f(S,n,k)char*S;{                 // helper function, recursively guesses brackets
 if(n>=strlen(S))                // string replaced by possible bracket layout
  return B(S)&&puts(S);          // print if balanced, return in all cases
 for(k=0;k<2;k++)                // 46 == '.', guess 40 == '(',
  S[n]==46-k-k&&(S[n]=40+k*20,   //  guess 41 == '(', restore
   f(S,n+1),S[n]=41+k*21,        // 44 == ',', guess 60 == '<',
   f(S,-~n),S[n]=46-k-k);}       //  guess 62 == '>', restore
F(char*S){f(S,0);}               // main function, call helper function

ลองออนไลน์!


คุณไม่สามารถใช้อาร์เรย์ความยาวผันแปรของ GCC เพื่อกำจัด calloc ได้หรือไม่?
Ton Hospel

@TonHospel แล้วฉันจะต้องแปลงอาร์เรย์เป็นตัวชี้หรือแนะนำตัวแปรดัชนีอื่นซึ่งฉันไม่ทราบว่ามันคุ้มค่าหรือไม่เพราะฉันใช้*s++ที่ไม่กี่แห่ง
Jonathan Frech

char S[n],*s=Sยังคงสั้นกว่าchars*s=calloc(n,1)
Ton Hospel

@TonHospel ผมไม่ทราบจริงๆว่าทำไมถึงแม้ว่ามันดูเหมือนจะไม่ทำงาน
Jonathan Frech

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