ผนวกหรือเติม? ขึ้นอยู่กับ


23

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


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

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

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

    ()
    []{}
    

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

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

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

    [(){<><>[()]}<>()]
    <[{((()))}]>
    
  • สตริงถือเป็น "จับคู่อย่างสมบูรณ์" ถ้าหาก:

    1. ตัวละครทุกตัวจะเป็นตัวยึด

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

ในการเฉลิมฉลองวันคล้ายวันเกิดครั้งแรกของสมองความท้าทายในวันนี้เกี่ยวกับการใช้ชุดวงเล็บที่ไม่สมดุล

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

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

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

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

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

appendable
prependable
both
neither

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

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

คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลจะไม่ถูกต้องของสมองสะบัดหรือเปล่า

ตัวอย่าง

อินพุตต่อไปนี้เป็นสิ่งที่สามารถสรุปได้ทั้งหมด:

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

สิ่งเหล่านี้สามารถต่อท้ายได้ทั้งหมด:

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

เหล่านี้ล้วนเป็นทั้ง :

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

และสิ่งเหล่านี้ล้วนไม่ใช่ :

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

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


ความท้าทายนี้ยากมากโดยเฉพาะในสมองสะเก็ดดังนั้นจุดสูงสุดของบราวนี่ให้กับทุก ๆ คำตอบที่เขียนด้วยสมอง :)


1
maximum brownie pointsฉันคิดว่าการให้คะแนนบราวนี่และคุกกี้สูงสุดแทนการกระตุ้นให้สมองสะบัดความท้าทายนี้มากกว่าเพียงแค่จุดบราวนี่เนื่องจากฉันไม่คิดว่าเรื่องเล็กน้อยในภาษาใด ๆ เลย Brain-Flak : P
Erik the Outgolfer

FYI: การทดสอบทั้งสองจบลงด้วยเครื่องหมายวงเล็บเปิดการทดสอบทั้งหมดไม่ได้ปิดด้วยเครื่องหมายวงเล็บปิด
Jonathan Allan

2
ฉันจะยืนยันว่า 'ทั้งสอง' เป็นคำที่ผิด สตริงที่ชอบ][คือไม่ appendable เป็นอะไรที่คุณสามารถผนวกสามารถทำให้มันถูกต้อง ในทำนองเดียวกันมันไม่สามารถหักล้างได้ มัน ... 'ใส่ได้'! คุณสามารถแทรกลงในสายอักขระเพื่อทำให้ Brainflak ที่ใช้ได้ทั้งหมด
orlp

สตริงที่มีความสมดุลอยู่แล้วทั้งสองหรือไม่?
ข้าวสาลีตัวช่วยสร้าง

@wheatwizard สตริงที่สมดุลจะไม่ถูกระบุเป็นอินพุต You can assume that the input will never be valid brain-flak or empty.
DJMcMayhem

คำตอบ:


6

เยลลี่ , 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

(ข้อมูลที่ป้อนไม่ถูกต้องส่งคืนผลลัพธ์ที่น่าเกรงขามแม้ว่าสมองจะมีผลตอบแทนที่ถูกต้อง[]ก็ตาม)

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


5

เรติน่า , 41 40 41 ไบต์

บันทึก 1 ไบต์ด้วย @MartinEnder

+`\(\)|\[]|{}|<>

[]})>]+
1
\W+
0
...+
01

ลองออนไลน์!

  • ที่จ่ายล่วงหน้าคือ 1
  • ต่อท้ายคือ 0
  • ทั้งคู่เป็น 10
  • ไม่มีคือ 01

การแก้ไข

  • รับ 1 ไบต์เพื่อแก้ไขข้อบกพร่องที่สังเกตเห็นโดย @Neil

[]})>]บันทึกเป็นไบต์
Martin Ender

@MartinEnder อ่าเป็นเพราะชุดตัวอักษรต้องไม่ว่างเปล่าขอบคุณ!
Kritixi Lithos

สิ่งนี้ใช้ไม่ได้กับอินพุตที่ไม่สามารถต่อพ่วง(][)ได้ทั้งหมด ฉันคิดว่ามันจะสามารถคงที่ค่าใช้จ่ายของหนึ่งไบต์โดยการเปลี่ยนไป101 ...+
Neil

@Neil ขอบคุณสำหรับการสังเกตเห็นข้อผิดพลาดที่ผมสงสัยว่ามีกรณีดังกล่าวด้วยBothเช่นกัน
Kritixi Lithos

ไม่มีผมคิดว่าเป็นส่วนผสมที่ถูกต้องสำหรับ10 Both
Neil

3

แบตช์ 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%

ขาออก]สำหรับย่อหน้า, [สำหรับการผนวก][สำหรับทั้งสอง[]สำหรับค่า


3

Haskell , 115 108 ไบต์

แก้ไข:

  • -7 ไบต์: ใช้การ์ดเพิ่ม
(""#)
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#""ตรวจสอบสายถ้าวงเล็บปิดทั้งหมดได้รับการค้นพบโดยจุดสิ้นสุดของสตริงมิฉะนั้นท้ายเป็นสิ่งจำเป็น
    • สาขาแรกของการs#(c:d)ตรวจสอบว่าตัวละครต่อไปcเป็นวงเล็บเปิดและถ้าเป็นเช่นนั้นออกจากวงเล็บปิดที่สอดคล้องกันในสแต็คสำหรับการเรียกซ้ำ
    • มิฉะนั้นหากสแต็คมีวงเล็บปิดสาขาที่สองจะตรวจสอบว่าอันแรกตรงกับอักขระถัดไปหรือไม่หากส่งคืนรายการเปล่าแทนการเรียกซ้ำ
    • สุดท้ายในสาขาสุดท้ายสแต็กจะว่างเปล่าและเรามีวงเล็บปิดที่ไม่ตรงกันซึ่งอาจแก้ไขได้โดยการเตรียมการก่อนที่จะเรียกซ้ำ

2

Japtap , 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

2

PHP, 137 ไบต์

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

1 => ผนวกได้

2 => จ่ายล่วงหน้าได้

12 => ทั้งสอง

0 => ไม่

Testcases


"ตราบใดที่การส่งออกแต่ละที่แตกต่างและสอดคล้องที่ดีของ" สิ่งนี้ดูเหมือนจะไม่ได้มีค่าที่สอดคล้องกันสำหรับทั้ง
Cyoce

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