ผนวกหรือ Prepends? ขึ้นอยู่กับ

DJMcMayhem 04/29/2017. 6 answers, 427 views
code-golf string balanced-string classification brain-flak

Brain-flak เปลี่ยนวันพรุ่งนี้ให้เป็นหนึ่งปี! ในเกียรติของวันเกิดนี้เรากำลังมีปาร์ตี้วันเกิดแบบ PPCG ซึ่งผู้ใช้หลายคนโพสต์คำถามที่เกี่ยวข้องกับสมอง! ช่วยเราเฉลิมฉลอง! :)


Brain-flak เป็นภาษาลึกลับที่ฉันเขียนซึ่งคำสั่งทั้งหมดเป็นวงเล็บและส่วนวงเล็บทั้งหมดจะต้องตรงกันทั้งหมด การยืม คำนิยามของตัวเอง :

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

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

    ()
    []{} 

    หรือถ้าทุกๆวงกลมด้านในมีการจับคู่กัน

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

    Subelements สามารถซ้อนกันได้หลายชั้น

    [(){<><>[()]}<>()]<[{((()))}]> 
  • สตริงจะถือว่าเป็น "ครบตามตัวอักษร" ถ้าหากมีเฉพาะ:

    1. ทุกตัวอักษรเดียวคือวงเล็บ,

    2. คู่วงเล็บแต่ละคู่มีวงเล็บเปิดและปิดที่ถูกต้องและเรียงตามลำดับที่ถูกต้อง

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

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

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

  • อินพุตบางตัวมีความซับซ้อนกว่าเล็กน้อย ตัวอย่างเช่น )][({ ไม่สามารถทำถูกต้องโดยการผนวกหรือ prepending แต่ can ทำถูกต้องโดย prepending [( และผนวก })] ดังนั้น input นี้เป็นทั้ง prependable และ appendable

  • สุดท้ายปัจจัยการผลิตบางส่วนไม่สามารถสร้างรหัสสะเก็ดไฟสมองได้ด้วยการผนวกรวมหรือผนวกเข้าด้วยกัน ตัวอย่างเช่น (> ไม่สามารถกำหนดให้ถูกต้องได้) (Prepending < สร้าง <(> และต่อท้าย ) สร้าง (>) ซึ่งไม่ถูกต้อง) ดังนั้นข้อมูลนี้จึงไม่สามารถใช้งานได้

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

appendable
prependable
both
neither 

คุณสามารถเลือกค่าที่คุณใช้เพื่อแสดงในแต่ละกรณี ตัวอย่างเช่นการแสดงผล 1, 2, 3, 4 หรือ 'a', 'p', 'b', 'n' หรือ 1, 'foo', 3.1415, -17 หรือสิ่งใดก็ได้ ตราบเท่าที่แต่ละเอาท์พุท distinct และ consistent นั่นก็ดี อย่างไรก็ตามคุณ must ระบุอย่างชัดเจนว่าผลลัพธ์ใดตรงกับกรณีใด

คุณอาจส่งคืนค่านี้ในรูปแบบใดก็ตามที่สะดวกที่สุด (เช่นกลับจากฟังก์ชันการพิมพ์ไปยัง STDOUT การแก้ไขอาร์กิวเมนต์การเขียนลงในไฟล์ ฯลฯ )

คุณสามารถสันนิษฐานได้ว่าอินพุทจะไม่มีวันหมดสติหรือเปล่า

ตัวอย่าง

ปัจจัยการผลิตต่อไปนี้ทั้งหมดมีการ prependable :

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

สิ่งเหล่านี้ล้วนเป็นแบบ appendable :

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

เหล่านี้ทั้งหมด:

))((
>()[(()){
>{ 

ทั้งหมดนี้ neither ทั้งหมด:

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

ตามปกตินี่เป็น ดังนั้นช่องโหว่มาตรฐานจึงถูกใช้และคำตอบที่สั้นที่สุดในไบต์จะชนะ!


ความท้าทายนี้เป็นเรื่องที่ยากมากในสมอง - สะเก็ดระเบิดดังนั้น จุดที่ชี้ ไปที่คำตอบที่เขียนขึ้นในสมอง - สะเก็ดระเบิด :)

5 Comments
1 Erik the Outgolfer 04/29/2017
maximum brownie points ผมคิดว่าการเสนอคะแนนสูงสุดและคุกกี้คุกกี้แทนจะสนับสนุนให้สมอง - Flaking ความท้าทายนี้มากกว่าจุดบราวนี่ตั้งแต่ฉันไม่คิดว่ามันเป็นเรื่องเล็กน้อยที่ทุกภาษา any ให้อยู่คนเดียวสมอง Flak - : P
Jonathan Allan 04/29/2017
FYI: การทดสอบทั้งคู่สิ้นสุดลงด้วยวงเล็บปีกกาทั้งสองข้อทดสอบจะสิ้นสุดลงด้วยวงเล็บปิด
1 orlp 04/29/2017
ฉันจะยืนยันว่า "ทั้งสอง" เป็นคำที่ไม่ถูกต้อง สตริงที่เหมือน ][ not เนื่องจากไม่มีอะไรที่คุณสามารถผนวกไว้ได้จึงสามารถใช้งานได้ ในทำนองเดียวกันจะไม่ได้ตั้งค่าล่วงหน้า มัน ... 'แทรก'! คุณสามารถแทรกลงในสตริงเพื่อให้ทั้ง Brainflak ถูกต้อง
Funky Computer Man 04/30/2017
สตริงที่สมดุลกันอยู่แล้วหรือไม่?
DJMcMayhem 04/30/2017
@wheatwizard สตริง Balanced จะไม่ได้รับเป็นอินพุท You can assume that the input will never be valid brain-flak or empty.

6 Answers


Jonathan Allan 04/29/2017.

วุ้น 33 32 37 35 34 ไบต์

พบบั๊กที่น่ากลัวแก้ไข +5 ไบต์แก้ไขได้ดีกว่า - 2 ไบต์โดยใช้เคล็ดลับของ Adnan ของฉันเห็น ที่นี่ สำหรับ -1 เพิ่มเติม

“({[<“)}]>”Z;@WœṣF¥/µÐLO‘&2µIṀ>0ȯQ 

ค่าที่ส่งคืน:

prepends [2]
 appends [0]
    both [2,0]
 neither 1 

(การป้อนข้อมูลไม่ถูกต้องจะส่งกลับค่าผลปลอมแม้ว่าจะมีผลต่อการทำงานของ Brain-Flack ก็ตามจะส่งกลับ [] )

Try it online! - ชุดทดสอบ (พิมพ์การแสดงผลที่เป็นอันตรายดังนั้น 20 สำหรับ [2,0] และละเว้นบรรทัดที่มี - )


Cows quack 04/29/2017.

Retina , 41 40 41 bytes

1 byte saved thanks to @MartinEnder

+`\(\)|\[]|{}|<>[]})>]+
1
\W+
0
...+
01 

ทดลองใช้แบบออนไลน์!

  • Prependable คือ 1
  • ค่าที่อ่านได้คือ 0
  • ทั้งสองมีค่าเท่ากับ 10
  • ไม่มีคือ 01

การแก้ไข

  • ได้รับ 1 ไบต์เพื่อแก้ไขข้อผิดพลาดที่สังเกตโดย @Neil
5 comments
Martin Ender♦ 04/29/2017
[]})>] บันทึกไบต์
Cows quack 04/29/2017
@MartinEnder Ah, เป็นเพราะชุดตัวอักษรไม่สามารถว่างเปล่าขอบคุณ!
Neil 04/29/2017
ไม่สามารถใช้งานได้กับปัจจัยการผลิตที่ไม่ใช่ตัวควบคุมทั้งหมดเช่น (][) ฉันคิดว่าสามารถแก้ไขค่าใช้จ่ายของหนึ่งไบต์ได้โดยการเปลี่ยน 101 เป็น ...+ .
Cows quack 04/29/2017
@ Neil ขอบคุณสำหรับ noticing ข้อผิดพลาดที่ฉันสงสัยว่ามีกรณีเช่นกับ Both
Neil 04/29/2017
ไม่ฉันคิดว่า 10 เป็นชุดค่าผสมที่ถูกต้องสำหรับ Both เท่านั้น

Neil 04/29/2017.

แบทช์ 337 ไบต์

@echo off
set/ps=
:g
set "t=%s:<>=%
set "t=%t:()=%
set "t=%t:[]=%
set "t=%t:{}=%
if not "%t%"=="%s%" set "s=%t%"&goto g
set "s=%s:<=[%
set s=%s:>=]%
set s=%s:(=[%
set s=%s:)=]%
set s=%s:{=[%
set s=%s:}=]%
:l
if %s:~,2%==]] set s=%s:~1%&goto l
:r
if %s:~-2%==[[ set s=%s:~,-1%&goto l
if not _%s:~2%==_ set s=[]
echo %s% 

ผลลัพธ์ ] for prepend, [ for append, ][ for both, [] สำหรับทั้งสอง


Ørjan Johansen 04/29/2017.

Haskell , 115 108 bytes

แก้ไข:

  • -7 bytes: ใช้ guards เพิ่มเติม
 (""#)
s#""=[s>"",1>0]
s#(c:d)|Just a<-lookup c$zip"([{<"")]}>"=(a:s)#d|(a:b)<-s=[1|a==c]>>b#d|0<1=take 1$s#d 

ทดลองใช้แบบออนไลน์!

ใช้เช่น (""#) "))" ผลลัพธ์จะได้รับเป็น:

 [False,True]: needs nothing
[False]: prependable
[True,True]: appendable
[True]: both
[]: neither 

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

  • การเข้ารหัสสัญญาณเอาต์พุตจะถูกเลือกโดยการลดองค์ประกอบที่สองของผลลัพธ์สำหรับส่วนที่เหลือหากมีการส่งสัญญาณที่ไม่ตรงกันทั้งหมดโดยการปล่อยข้อมูลทั้งหมดออก
  • s#d แยกวิเคราะห์สตริง d ที่เหลืออยู่ให้สตริง / กองซของวงเล็บปิดที่คาดไว้
    • สาย s#"" ตรวจสอบว่าได้พบวงเล็บปิดทั้งหมดแล้วหรือไม่โดยท้ายสตริง
    • สาขาแรกของ s#(c:d) จะตรวจสอบว่าอักขระตัวถัดไป c เป็นวงเล็บเปิดหรือไม่และหากปล่อยให้วงเล็บปิดที่ตรงกันบนกองซ้อนทับกัน
    • สาขาที่สองจะตรวจสอบว่าช่องด้านบนตรงกับอักขระถัดไปหรือไม่ถ้าไม่ใช่ให้ส่งรายการที่ว่างเปล่าแทนการทำใหม่
    • สุดท้ายในสาขาสุดท้ายกองจะว่างเปล่าและเรามีวงเล็บปิดที่ไม่ตรงกันที่อาจได้รับการแก้ไขโดย prepending ก่อน recursing

ETHproductions 04/29/2017.

Japt , 44 ไบต์

=Ue"%(%)|%[]|\{}|<>" ®c -1&2|1})f31 |UfD |Ug 

ผลลัพธ์ 1 สำหรับ prependable, 3 สำหรับ appendable, 13 สำหรับทั้งสองและ 31 สำหรับทั้งสอง

ทดสอบแบบออนไลน์! หรือ ยืนยันกรณีทดสอบทั้งหมดพร้อมกัน

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

=Ue"%(%)|%[]|\{}|<>" ®   c -1&2|1})f31 |UfD |Ug
U=Ue"%(%)|%[]|\{}|<>" mZ{Zc -1&2|1})f31 |UfD |Ug

                    // "(((()()())))}"  "([({}{})"    ">()[(()){"  "((((<>()]"
Ue"%(%)|%[]|\{}|<>" // Recursively remove all instances of "()", "[]", "{}", and "<>" from U.
                    // "}"              "(["          ">[{"        "((((]"
mZ{Zc -1&2|1}       // Replace each char Z with (Z.charCodeAt() - 1) & 2 | 1.
                    // "1"              "33"          "133"        "33331"
U=                  // Save the result in U.
f31 |UfD |Ug        // Match all instances of "31" and "13" (D = 13) and bitwise-OR the results with the first char.
                    // null|null|1      null|null|3   null|13|1    31|null|3
                    // 1                3             13           31
                    // Implicit: output result of last expression 

Jörg Hülsermann 06/04/2017.

PHP, 137 ไบต์

for($c=1;$c;)$a=preg_replace("#<>|\(\)|\[\]|\{\}#","",$a=&$argn,-1,$c);echo($a=preg_replace(["#[]})>]+#","#[[{(<]+#"],[1,2],$a))<13?$a:0; 

1 => appendable,

2 => prependable,

12 => ทั้งสอง

0 => ไม่

Testcases

2 comments
Cyoce 06/04/2017
"ตราบเท่าที่แต่ละเอาท์พุทแตกต่างและ consistent, นั่นก็ดี" ดูเหมือนจะไม่มีค่าที่สอดคล้องกันสำหรับทั้งสอง
Jörg Hülsermann 06/04/2017
@Cyoce ตอนนี้แก้ไขแล้ว

Related questions

Hot questions

Language

Popular Tags