แผ่โปรแกรม Stack Cats


13

Stack Catsเป็นภาษาที่สามารถย้อนกลับได้ ธรรมชาติที่พลิกกลับได้ของมันทำให้เกิดวงวนที่ค่อนข้างแปลก (...)ความท้าทายนี้เป็นเรื่องเกี่ยวกับห่วงเงื่อนไข เมื่อลูปเหล่านี้ซ้อนในบางวิธีคุณสามารถแปลงรหัสเพื่อลดความลึกในการซ้อน ต่อไปนี้เป็นกฎ (ตำแหน่งAและBตัวอย่างของตัวอย่าง):

  1. เมื่อหนึ่งในวงเริ่มต้นด้วยวงอื่นเราสามารถดึงภายในวงไปด้านหน้า: กลายเป็น((A)B)(A)(B)
  2. เมื่อหนึ่งในห่วงจบลงด้วยวงอื่นเราสามารถดึงภายในวงที่สิ้นสุด: กลายเป็น(B(A))(B)(A)
  3. ()สามารถลบลูปที่ว่างเปล่าออกจากโปรแกรมทั้งหมด ในฐานะที่เป็นข้อพิสูจน์ (ร่วมกับกฎระเบียบอื่น ๆ ) เทียบเท่ากับ((A))(A)

ลูปซ้อนกันเท่านั้นที่จะยังคงอยู่ในรูปแบบ(A(B)C)ที่A, BและCมีไม่ว่างเปล่า

ความท้าทาย

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

โปรแกรม Stack Cats ที่ถูกต้อง ...

  • ... ประกอบด้วยอักขระ()/\<>[]{}!"*+-:=ITX^_|เท่านั้น
  • ... มีมิเรอร์สมมาตร (เช่น\(]{}!{}[)/เป็นโปรแกรมที่ถูกต้อง แต่/|/ไม่มี)
  • ... ได้อย่างถูกต้องและตรงกับการซ้อนกัน()และ{}( [], <>และ\/ไม่จำเป็นต้องมีการจับคู่ตามปกติแม้ว่าพวกเขาจะปรากฏในคู่เนื่องจากความต้องการกระจกสมมาตร)

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

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

นี่คือดังนั้นคำตอบที่สั้นที่สุดที่ถูกต้อง - วัดเป็นไบต์ - ชนะ

กรณีทดสอบ

กรณีทดสอบคือสองบรรทัดแต่ละบรรทัด (อินพุตและเอาต์พุต) คั่นด้วยบรรทัดว่าง โปรดทราบว่าหนึ่งเอาต์พุตว่างเปล่า คุณต้องสนับสนุนอินพุตว่าง (ซึ่งควรทำให้เอาต์พุตว่าง)

(((=+|+=)))
(=+|+=)

({(=+|+=)})
({(=+|+=)})

((\)/)I(\(/))
(\)(/)I(\)(/)

(()()(())()())


((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)

เพื่อให้แน่ใจว่าลูปที่เราต้องแยกจะถูกระบุด้วยวงเล็บ()เท่านั้นดังนั้นอินพุต{{A}B}จะยังคงเป็นอยู่และจะไม่ถูกแยกออกมา{A}{B}ด้วยหรือไม่
Kevin Cruijssen

@KevinCruijssen ใช่การแปลงจะใช้ได้กับ(...)-type loops เท่านั้น
Martin Ender

ในกรณีทดสอบขั้นสุดท้ายทำไมอยู่\^/ในวงเล็บ?
Kevin Cruijssen

1
@KevinCruijssen ผู้ที่มีวงเล็บสุดหลังจากที่คุณดึงและ(<|>((X((T)))[_])) (([_](((T))X))<|>)
Martin Ender

1
ฉันเห็นแล้ว ดังนั้น((A)B(C))จะกลายเป็น(A)(B)(C)เพราะทั้งกฎ 1 และ 2 ต่อมา: ((A)B(C))(A)(B(C))(กฎ 1) → (A)(B)(C)(กฎ 2)
Kevin Cruijssen

คำตอบ:


6

เรติน่า 0.8.2 , 113 107 67 66 ไบต์

+`\(\)|(\()?(\(((\()|(?<-4>\))|[^()])*(?(4)@)\))(?(1)|(\)))
$5$2$1

ลองออนไลน์! รวมการประหยัด3 4 ไบต์ด้วย @MartinEnder คำอธิบาย:

+`

ใช้การเปลี่ยนตัวซ้ำหลายครั้งจนกว่าจะไม่มีการแข่งขัน

\(\)|

จับคู่ลูปที่ว่างเปล่า (ซึ่งในกรณีนี้จะไม่มีการจับภาพใด ๆ ดังนั้นการแทนที่จะเป็นการลบ) หรือ:

(\()?

เลือกจับคู่ก(. สิ่งนี้จะถูกจับในกลุ่ม 1 ถ้ามันจับคู่กัน แต่จะไม่จับถ้าไม่ใช่

(\(

จับเนื้อหาหลักของการแข่งขันในกลุ่มที่ 2 และจับคู่ก(.

(
 (\()
|
 (<-4>\))
|
 [^()]
)*

จับคู่ a ซ้ำ ๆ(จับภาพในกลุ่ม 4 หรือ a )เอาการจับออกจากกลุ่ม 4 (ไม่สำเร็จหากไม่มี) หรืออย่างอื่น

(?(4)@)

ตรวจสอบให้แน่ใจว่าไม่มีการจับอะไหล่สำรองในกลุ่ม 4

\))

จบการยึดกลุ่ม 2 กับอีก)กลุ่ม

(?(1)|(\)))

หากกลุ่มการจับภาพ 1 ว่างเปล่าให้จับกลุ่มการ)จับภาพที่ 5 (ดังนั้นกลุ่มหนึ่งในสองกลุ่มนั้นจะมีการจับภาพ)

$5$2$1

ย้ายตัวยึดที่จับได้ในกลุ่ม 1 หรือกลุ่ม 5 ไปยังอีกด้านหนึ่งของกลุ่ม 2 สิ่งนี้มีผลในการย้ายลูปด้านในไปด้านหน้าหรือท้ายของลูปด้านนอกขึ้นอยู่กับด้านที่จับคู่


2

Stax v1.0.3 +, 76 65 64 62 58 ไบต์CP437

îÜ•$o,Γ{í]Üf╒9♦╛üΣóç*\$ñ₧└ΦJ♠¥c╥jóu≥3E.╘ⁿ◄◘W₧<¶┼7úê╟┴zç↨aG

70 ไบต์เมื่อแกะออกมา

{{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md}X!:Rx!:Rc.()z:rgp

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์!

คำอธิบาย

{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Mdเป็นบล็อกที่แยกออกเป็นสี่ส่วนและแปลงเป็นA((B)C)DA(B)(C)D

X!:Rx!:Rดำเนินการบล็อกบนสตริงอินพุต (ขั้นตอนที่ 1) จากนั้นสะท้อนสตริง (การสะท้อนสตริงในสแตกซ์หมายถึงการย้อนกลับสตริงบวกแทนที่ (แปล) (<[{/ด้วย (ไปยัง) \}]>)) และดำเนินการบล็อกบนสตริงที่ได้รับแล้วสะท้อนกลับ (ขั้นตอนที่ 2). ขั้นตอนที่ 2 เป็นหลักแปลงไป(A(B))(A)(B)

c.()z:r ลบลูปที่ว่างเปล่าทั้งหมด (ขั้นตอนที่ 3)

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

เอาต์พุตโดยนัย


1

Python 3 , 226 223 212 206 ไบต์

ตกลงนี่เป็นความพยายามที่จะแก้ปัญหานี้ในภาษาที่ไม่สนับสนุน regex แบบเรียกซ้ำ

lambda s:g(g(s,*'()'),*')(').replace('()','')
def g(s,t,u):
 m,*a={},;i=v=0
 for c in s:
  i+=1;a+=[i]*(c==t)
  if c==u:*a,x=a;m[x]=i;v=m.get(x+1)
  if v:return g(s[:x]+s[x+1:v]+t+s[v:],t,u)
 return s[::-1]

ลองออนไลน์!

การแก้ไข:

  • ได้รับการสร้างใหม่[::-1]เพื่อบันทึก 6 ไบต์ขอบคุณ Mr.Xcoder

gฟังก์ชั่นเป็นกลุ่มอาคารพื้นฐานซึ่งพบการเกิดขึ้นของ((A)B)การเปลี่ยนแปลงมัน(A)(B)แล้วใช้ตัวเองเพื่อผลจนกว่าจะไม่มีการเปลี่ยนแปลงมากขึ้นเป็นไปได้

ขั้นตอนหลักคือ:

  • นำgไปใช้กับอินพุตตามปกติ
  • นำgไปใช้กับการป้อนข้อมูลพลิก ระยะนี้พบว่าการเกิดขึ้นของในการป้อนกลับซึ่งมีประสิทธิภาพจับ))A(B((A(B))
  • ลบใด ๆ ()เกิดขึ้นของ

ปัญหาคือgมีโครงสร้างการควบคุมที่แย่มากที่พยายามหนึ่งบรรทัดมันทำให้มันขยายตัวไม่ดีดังนั้นฉันไม่คิดว่าการปรับปรุงที่สำคัญจะเกิดขึ้นได้โดยใช้วิธีนี้

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