ตรวจจับการจับคู่ที่สมบูรณ์แบบ


25

มามีฟังก์ชั่นfที่รับสตริงและลบคู่ของอักขระที่เหมือนกันที่อยู่ติดกันทั้งหมด ตัวอย่างเช่น

f(abbbacc)=aba

โปรดทราบว่าเมื่อทับซ้อนกันสองคู่เราจะลบหนึ่งคู่เท่านั้น

เราจะเรียกสตริงที่จับคู่อย่างสมบูรณ์หากการใช้งานซ้ำ ๆ ในที่สุดก็จะทำให้สตริงว่าง ยกตัวอย่างเช่นสตริงดังกล่าวข้างต้นไม่ได้จับคู่อย่างสมบูรณ์แบบเพราะถ้าเราใช้อีกครั้งที่เรายังคงได้รับABAอย่างไรก็ตามสตริงอย่างนั้นถูกจับคู่อย่างสมบูรณ์เพราะถ้าเราใช้สามครั้งเราจะได้สตริงว่างabbbaccอีd d fabaeabbccaddef

(อีaaddอี)=อีaaอี

(อีaaอี)=อีอี

(อีอี)=


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

คุณสามารถส่งออกค่าที่แตกต่างกันสองค่า: ค่าหนึ่งสำหรับกรณีที่มีการจับคู่อินพุตอย่างสมบูรณ์และอีกค่าหนึ่งสำหรับกรณีที่ไม่มี

นี่เป็นคำถามเกี่ยวกับดังนั้นคำตอบจะได้คะแนนจากขนาดเป็นไบต์ของแหล่งข้อมูลด้วยจำนวนไบต์ที่น้อยลง


กรณีทดสอบ

abbbaccFalseabcbaFalseababFalseabbbaabaccTrueeabbccaddeTruebbbbTrue


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

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

4
เอกไม่ให้โทษเกี่ยวกับกฎการ จำกัด แหล่งที่มาของคุณ mwahahahaha (นั่นคือ ... ตราบใดที่คำตอบมีจำนวนไบต์ที่เท่ากัน)
Arnauld

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

1
@dylnan สตริงว่างสามารถวนซ้ำได้ตลอดไปอย่างไรก็ตามไม่ใช่เอาต์พุตที่ถูกต้อง
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


10

Haskell, 146 124 ไบต์

((""##))
a===bb=bb==a
((aa:bb))##((cc:dd))|aa===cc=bb##dd|1==1=((cc:aa:bb))##dd
a##""=""===a
""##cc=((cc!!00:cc!!00:""))##cc

ไม่มีความคิดเห็น. ผลตอบแทนอย่างใดอย่างหนึ่งหรือTrueFalse

ลองออนไลน์!

แก้ไข: -22 ไบต์ขอบคุณ @Cat Wizard


2
นี่คือฮาเซลน้อยที่สุดที่เป็นฮาเซลที่ฉันเคยเห็น
ลูกบาศก์


5

05AB1E , 26 24 22 20 18 ไบต์

-2 ไบต์ขอบคุณที่OVS เอาต์พุต0ถ้าสตริงถูกจับคู่อย่างสมบูรณ์1จะเป็นอย่างอื่น

ΔγʒgÉ}JJ}ĀqqĀÉgʒγΔ

ลองออนไลน์!

ΔγʒgÉ} JJ} ĀqqĀÉgʒγΔ - โปรแกรมเต็มรูปแบบ
Δ} - จนกว่าผลลัพธ์จะไม่เปลี่ยนแปลงอีกต่อไป:
 γʒ} - แยกสตริงออกเป็นส่วน ๆ ของตัวอักษรและตัวกรองเท่ากันโดย:
   gÉ - ยาวแปลกไหม
      JJ - และหลังจากกรองแล้วให้เข้าร่วมส่วนต่าง ๆ ด้วยกัน แต่ทำสิ่งนี้
                     สองครั้งเพื่อบันทึก 2 ไบต์เช่นเดียวกับในรุ่นก่อนหน้า
         Ā - ตรวจสอบว่าผลลัพธ์ว่างเปล่า
          q - การดำเนินการยุติ (ออก) ส่วนที่เหลือของรหัสจะถูกละเว้น
           คำถาม - จำลองส่วนที่ไม่ตรงกันเพื่อช่วยในการจัดวางแหล่งที่มา

รุ่นก่อนหน้า

อันนี้ต้องอาศัยพฤติกรรมที่ไม่ได้กำหนด (ดังนั้นจึงไม่มี "รหัสตาย") และผลลัพธ์[['0']]สำหรับสตริงที่จับคู่อย่างสมบูรณ์และ[['1']]สำหรับสตริงที่ไม่ตรงกันอย่างสมบูรณ์:

ΔγεDgÉ£}JJ}ĀĀ£ÉgDεγΔ 

และเวอร์ชั่น 22- ไบต์อธิบายซึ่งเป็นเพียงข้างต้น แต่ไม่ดูถูก UB และให้คุณค่าของสติ

ΔγεDgÉ£}JJ}ĀqqĀ£ÉgDεγΔ – Full program.
Δ         }            – Until fixed point is reached (starting from the input value):
 γε    }                 – Group equal adjacent values, and for each chunk,
   DgÉ                     – Duplicate, get its length mod by 2.
      £                    – And get the first ^ characters of it. This yields the
                             first char of the chunk or "" respectively for odd-length
                             and even-length chunks respectively.
         JJ                – Join the result to a string, but do this twice to help
                             us with the source layout, saving 2 bytes.
            Ā           – Check if the result is an empty string.
             q          – Terminate the execution. Any other commands are ignored.
              qĀ£ÉgDεγΔ – Mirror the part of the program that isn't otherwise removed
                          anyways. This part forgoes }JJ} because that substring will
                          always be trimmed by the algorithm anyway.

5

Cubix , 54 ไบต์

U#;!u1@.Oi>??>i..??O.@1^^...u--u.u!ww;..#..U..;..;!^^!

ไม่มีอะไรขาออกถ้าสตริงจะถูกจับคู่อย่างสมบูรณ์แบบและ1เป็นอย่างอื่น
ลองที่นี่

Cubified

      U # ;
      ! u 1
      @ . O
i > ? ? > i . . ? ? O .
@ 1 ^ ^ . . . u - - u .
u ! w w ; . . # . . U .
      . ; .
      . ; !
      ^ ^ !

คำอธิบาย

อักขระส่วนใหญ่เป็นฟิลเลอร์ที่จำเป็นในการจับคู่รหัสอย่างสมบูรณ์ .เราได้รับการแทนที่ด้วย(ไม่มี op)

      U # ;
      ! u 1
      @ . O
i . ? . > i . . ? . . .
. . ^ . . . . u - . . .
. . . w ; . . . . . . .
      . ; .
      . ; !
      ^ ^ !

สิ่งนี้สามารถแบ่งออกเป็นสามขั้นตอน:

  • ตรวจสอบกับสตริงว่าง (ซ้ายiและ?)
  • วนซ้ำตัวอักษรลงบนสแต็คและซ้ำ popping (ทุกอย่างที่ด้านล่างและขวา)
  • ตรวจสอบว่าสแต็กว่างเปล่า (สิ่งที่อยู่ด้านบน)

4

V , 20 , 18 ไบต์

òóˆ±òø‚

::‚øò±ˆóò

ลองออนไลน์!

hexdump:

00000000: f2f3 88b1 f2f8 820a 0a3a 3a82 f8f2 b188  .........::.....
00000010: f3f2                                     ..                   ....

เอาต์พุต 0 สำหรับความจริง, 1 สำหรับความเท็จ ขอบคุณ nmjcman101 สำหรับการบันทึกทางอ้อม 2 ไบต์

ò        ò        " Recursively...
 ó                "   Remove...
  <0x88>          "     Any printable ASCII character
        ±         "     Followed by itself
          ø       " Count...
           <0x82> "   The number of non-empty strings

::<0x82>øò±<0x88>óò      " NOP to ensure that the code is paired

คุณสามารถแทนที่^$ด้วย.และส่งกลับ 0 สำหรับความจริงมีอะไรอีกที่เป็นเท็จ? ฉันมีหมอกเล็กน้อยในกฎหลังจากไม่ได้ทำสิ่งนี้มาระยะหนึ่งแล้ว
nmjcman101

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

3

R , 142 126 ไบต์

ตรรกะที่เข้มงวดมากขึ้นและบางความคิดเห็นไบต์ golfed โดย @Giuseppe

f=function(x,p="(.)\\1")"if"(grepl(p,x),f(sub(p,"",x)),!nchar(x))##x(rahcn!,x,,p(bus(f,)x,p(lperg("fi")"1\\).("=p,x(noitcnuf=f

ลองออนไลน์!

f=function(x,p="(.)\\1")"if"(nchar(x),"if"(grepl(p,x),f(sub(p,"",x)),0),1)##)1,)0,xp(bus(f,)x,p(lperg("fi",)x(rahcn("fi")"1).("=p,x(noitcnuf=f

เดิม:

ลองออนไลน์!

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


ขณะนี้รหัสของคุณมีข้อผิดพลาด นี่คือเวอร์ชันการทำงานที่ 142 ไบต์
ovs

ขอขอบคุณ. ต้องเป็นอุบัติเหตุที่ถูกตัดและวาง
ngm

126 ไบต์ - คุณอาจบีบอัดความคิดเห็นได้อีกด้วย ...
Giuseppe

ฉันสงสัยว่า `\\ ˋจะลดความซับซ้อนหรือจำเป็นต้องทำซ้ำในความคิดเห็น
JayCe

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



2

Brain-Flak , 228 200 ไบต์

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

ลองออนไลน์!

นี่เป็นข้อพิสูจน์แนวคิด มันอาจจะสั้นกว่านี้ ไม่ได้ใช้ความคิดเห็นใด ๆ

เอาต์พุต0,0ถ้าอินพุตถูกจับคู่อย่างสมบูรณ์และ0,1ถ้าอินพุตไม่


2

sed 4.2.2 , 34 ไบต์

:;:t;ss((..??\??))\1ss1;t;/..??/cc

ลองออนไลน์!

สตริงที่จับคู่ให้เอาท์พุทที่ว่างเปล่าให้คนที่ไม่ได้คู่ให้ ct:

รุ่น palindromic เล็กน้อยก็คือที่ :;ss(.)\1ss;t;/./cc/./;t;1\).(;:32 โซลูชันเดิมคือ:;ss((..??\??))\1ss1;t;;/./cc/./t:(เปลี่ยนเนื่องจากปัจจุบันมีการละเมิดcน้อยกว่าแก้ไข: ใช่ตอนนี้มีเพียง 1 ตัวอักษรหลังจากc: D)

(โปรดทราบว่า;เป็นตัวคั่นคำสั่ง)

: ประกาศป้ายกำกับที่ว่างเปล่า

:t ประกาศฉลาก t

ss((..??\??))\1ss1เป็นการทดแทนใน sed คุณสามารถเปลี่ยน delimiter เป็นการทดแทนได้และนี่คือสิ่งที่ฉันทำโดยการเปลี่ยนเป็นsดังนั้นสิ่งนี้จะแทนที่ตัวแรก (ดังที่แสดงโดย1ตอนท้าย)

  • การแข่งขันของ ((..??\??))\1

    • . ตัวละครใด ๆ
    • .?? ตามด้วยอักขระตัวเลือกเพิ่มเติม
    • \?? และตัวเลือก ?
    • ตามด้วยสิ่งเดียวกันข้างๆมัน
  • ด้วยอะไร

ตอนนี้การทดแทนนี้ถูกจับคู่กับตัวเองดังนั้น;s ก่อนและหลังมันก็ถูกยกเลิกเช่นกัน

t และวนกลับไปที่ป้ายกำกับจนกว่าจะไม่มีการทดแทนที่ประสบความสำเร็จอีก

/..?/if .(wildcard) ตามด้วย.?อักขระตัวเลือกที่ตรงกัน

  • cc เปลี่ยนบัฟเฟอร์เป็น c

2

Brain-Flak , 112 110 108 ไบต์

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

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

ลองออนไลน์!

นี่คือคำตอบของฉันจากวงเล็บมีการจับคู่หรือไม่? .

พยายามที่จะไม่ใช้ความคิดเห็น แต่ติดขัดในการพยายามทำให้ป๊อป nilads ( {}) จับคู่กัน ปัญหาอยู่ในวิธีที่ง่ายที่สุดในการจับคู่วงเล็บคือการล้อมรอบในอีกประเภทเดียวกัน ขณะนี้เป็นเรื่องง่ายสำหรับ nilads อื่น ๆ{...}monad สร้างลูป ในการออกจากลูปคุณจะต้องกด 0 แต่เมื่อคุณออกจากลูปคุณจะต้องป๊อป 0 ซึ่งประกอบปัญหา

วิธีแก้ปัญหาที่จับคู่ 66 ไบต์คือ:

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

ลองออนไลน์!

เอาท์พุท1หรือ1,0ถ้าอินพุทเป็นการจับคู่ที่สมบูรณ์แบบ0,0ถ้าไม่

ไม่มีรุ่นความคิดเห็น 156 ไบต์

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

ลองออนไลน์!

ในขณะที่ Cat Wizard ชี้ให้เห็นคำตอบแรกไม่สามารถใช้ได้กับล่ามทุกคนเนื่องจากไม่ได้#แสดงความคิดเห็นทั้งหมด รุ่นนี้ไม่มีความคิดเห็น


โปรดทราบว่าวิธีนี้ใช้ได้เฉพาะกับล่าม rubfl brainflak interpreter เท่านั้นดังนั้นจึงไม่ใช่คำตอบที่เข้าใจยาก
Wheat Wizard

@CatWizard มีล่าม Canon Brain-Flak หรือไม่? เท่าที่ฉันรู้ Rain-Flak (Ruby) เป็นล่ามตัวจริง (นอกจากนี้ฉันกำลังทำงานเกี่ยวกับวิธีการแก้ปัญหาโดยไม่มีความคิดเห็น)
Jo King

ไม่ได้จริงๆ Rain-Flak เป็นล่ามตัวจริง แต่เป็นความคิดเห็นของไวยากรณ์ที่ไม่ซ้ำกัน เราเขียนมาตรฐาน Brain-Flak สักพักผมจำไม่ได้ว่ามันจบลงที่ใด
ข้าวสาลีตัวช่วยสร้าง

@CatWizard เสร็จสิ้นการไม่มีรุ่นความคิดเห็น
Jo King

2

Japt 24 24ไบต์

ผลลัพธ์falseสำหรับความจริงและtrueเพื่อความเท็จ

&&!!e"(.)%1"PP"1%).("e

ลองมัน


จะ«e"(.)%1ทำงานอย่างไร
โอลิเวอร์

@Oliver นั่นคือสิ่งที่ฉันเคยมีมาก่อนข้อ จำกัด ของแหล่งที่มาทำให้ฉันสนใจ ยังคงพยายามที่จะคิดหาวิธีที่จะได้รับมันทำงานกับ«แม้ว่า
Shaggy

@Oliver มันไม่ทำงานเศร้า
Shaggy

ฉันสงสัยว่าคุณอาจพลาดส่วนที่ท้าทายซึ่งเป็นแหล่ง จำกัด / แหล่งที่มาของเค้าโครง @Oliver
Shaggy

ฉันทำ ... ฉันไม่ดี
Oliver

2

Brain-Flakขนาด 96 ไบต์

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

ลองออนไลน์!

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

รุ่นที่ไม่ได้จับคู่อย่างสมบูรณ์แบบ (ดั้งเดิม):

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

ลองออนไลน์!



2

เพิ่ม ++ , 146 ไบต์

D,g,@~~,L2_|*;;*|_2L,@,g,D
D,ff,@^^,BG€gBF;;FBg€GB,@D1:?:

xx:?

aa:1
`bb
Bxx;;B
Waa*bb,`yy,$ff>xx,`aa,xx|yy,`bb,Byy,xx:yy

O;;O:,B,`,|,`,>$,`,*W`

ลองออนไลน์!

ความจริงแล้วสนุก: นี่คือ 272 ไบต์นานก่อนที่คำอธิบายจะเริ่มขึ้นตอนนี้มันเต้นจาวา

เอาต์พุตTrueสำหรับสตริงที่สมดุลอย่างสมบูรณ์และFalseอื่น ๆ

เพื่อความพึงพอใจอันยิ่งใหญ่ของฉันนี่เป็นการตีรุ่น palindromize ที่น่าเบื่อด้วย2ไบต์เพื่อป้องกันผลลัพธ์ที่พิมพ์ออกมาสองครั้ง ฉันยังมุ่งที่จะมีรหัสตายตัวน้อยที่สุดเท่าที่จะทำได้อย่างไรก็ตามยังมีบางส่วนที่ถูกคอมเม้นต์และรหัสออกด้วยรหัสข้อผิดพลาด1หลังจากพิมพ์ค่าที่ถูกต้อง

NB : ข้อผิดพลาดกับBFคำสั่งได้รับการแก้ไขในขณะที่คำตอบนี้อยู่ในการพัฒนา

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

ก.ก.S(S)S

Saaaa[[a],[],[aa],[],[a],[]]ก.และแทนที่รายการย่อยด้วยผลลัพธ์ของฟังก์ชัน

ก.2x[a][][]

[a][a,1]
[][,,0]
[][,,,1]

อย่างที่เห็น xระบุจำนวนตัวอักษรถัดไปที่เราต้องการเก็บ สำหรับคู่ที่เรียบง่ายเราจะลบพวกเขาทั้งหมด (ให้ผลเป็น0ของตัวละครถัดไป) สำหรับตัวอักษรตัวเดียวที่เราปล่อยให้พวกเขาแตะต้องหรือให้ผล1ของพวกเขาและสำหรับกลุ่มที่x>2, พวกเราต้องการ x-2ของตัวละคร เพื่อที่จะสร้างxของตัวละครเราทำซ้ำตัวละครด้วย*และฟังก์ชั่นส่งกลับองค์ประกอบบนสุดของสแต็กโดยธรรมชาติ: สตริงซ้ำ

หลังจาก ก.(s) ถูกแมปผ่านแต่ละกลุ่ม sBFเราอาร์เรย์แดงไปยังกองที่จะได้รับผลแต่ละบุคคลที่มี ในที่สุด^แฟล็กที่นิยามฟังก์ชัน ( D,ff,@^^,) จะบอกให้ฟังก์ชันส่งคืนเชื่อมสตริงในสแต็กและส่งคืนเป็นสตริงเดียว สำหรับคู่ซึ่งให้สตริงว่างจากก.สิ่งนี้จะลบมันออกโดยที่สตริงว่างตัดกับสตริงใด ๆ R ผลลัพธ์ใน R. อะไรก็ตามหลังจากทั้งสอง;;คือความคิดเห็นและจะถูกเพิกเฉย

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

  • xx : อินพุตเริ่มต้นและผลลัพธ์ก่อนหน้าของการใช้
  • YY : ผลการสมัครปัจจุบัน
  • aa : สภาพลูป
  • : ไม่ว่าจะเป็น YY เป็นความจริง

อย่างที่คุณเห็นตัวแปรและฟังก์ชั่นทั้งหมด (นอกเหนือจาก ก.) มีชื่อตัวอักษรสองตัวซึ่งช่วยให้สามารถลบออกจากซอร์สโค้ดได้ค่อนข้างรวดเร็วแทนที่จะมีความคิดเห็นที่มีจำนวนมาก xYa. ก. ไม่ได้ทำสิ่งนี้ด้วยเหตุผลหลักประการหนึ่ง:

หากผู้ประกอบการเช่นถูกเรียกใช้มากกว่าฟังก์ชั่นที่ผู้ใช้กำหนดaชื่อฟังก์ชั่นจะต้องมีการล้อมรอบ{...}เพื่อให้ชื่อทั้งหมดจะถูกดำเนินการโดยผู้ประกอบการ อย่างไรก็ตามหากชื่อนั้นเป็นอักขระตัวเดียวเช่นก.ที่{...}สามารถละเว้น ในกรณีนี้ถ้าชื่อฟังก์ชั่นเป็นก.ก.รหัสสำหรับ และ ก. จะต้องเปลี่ยนเป็น

D,gg,@~~,L2_|*;;*|_2L,@D             (NB: -2 bytes)
D,ff,@^^,BG€{gg}BF;;FB}gg{€GB,@D?:   (NB: +6 bytes)

อันไหนยาวกว่า 4 ไบต์

คำสำคัญที่จะแนะนำในตอนนี้คือตัวแปรที่ใช้งานอยู่ คำสั่งทั้งหมดยกเว้นการกำหนดให้กำหนดค่าใหม่ให้กับตัวแปรที่ใช้งานและหากตัวแปรที่ใช้งานอยู่กำลังดำเนินการอยู่ก็สามารถละเว้นได้จากอาร์กิวเมนต์ของฟังก์ชัน ตัวอย่างเช่นถ้าตัวแปรที่ใช้งานอยู่x=5จากนั้นเราสามารถตั้งค่า x=15 โดย

x+10 ; Explicit argument
+10  ; Implicit argument, as x is active

ตัวแปรที่ใช้งานคือ x โดยค่าเริ่มต้น แต่สามารถเปลี่ยนแปลงได้ด้วย `คำสั่ง เมื่อเปลี่ยนตัวแปรที่ใช้งานเป็นสิ่งสำคัญที่จะต้องทราบว่าตัวแปรแอคทีฟใหม่ไม่จำเป็นต้องมีอยู่ก่อนและจะถูกกำหนดเป็น 0 โดยอัตโนมัติ

ดังนั้นหลังจากกำหนด และ ก.เรากำหนดอินพุตให้ xxxx:?กับ จากนั้นเราต้องจัดการกับเงื่อนไขลูปของเราเล็กน้อย อันดับแรกเราต้องการตรวจสอบให้แน่ใจว่าเราป้อนขณะที่ลูปเว้นแต่xxมันว่างเปล่า. ดังนั้นเราจึงกำหนดค่าความจริงให้กับaaด้วยaa:1ค่าที่สั้นที่สุดเช่นนี้1. จากนั้นเราจะกำหนดความจริงของxx ไปยัง ด้วยสองบรรทัด

`bb
Bxx

ซึ่งก่อนอื่นทำ ตัวแปร active จากนั้นรันคำสั่ง boolean xx. ทางเลือกที่เกี่ยวข้องของaa=1 และ =¬¬xx เรื่องตามที่จะแสดงในภายหลัง

จากนั้นเราเข้าไปในห่วงของเราในขณะที่:

Waa*bb,`yy,$ff>xx,`aa,xx|yy,`bb,Byy,xx:yy

ห่วงในขณะที่เป็นโครงสร้างใน Add ++: มันทำงานโดยตรงกับรหัสมากกว่าตัวแปร โครงสร้างใช้ชุดของคำสั่งรหัสแยกจากกัน,ซึ่งพวกเขาทำงานบน คำสั่ง while และ if ยังใช้เงื่อนไขโดยตรงก่อนคำสั่งแรก,ซึ่งประกอบด้วยคำสั่งที่ถูกต้องเพียงคำเดียวเช่นคำสั่ง infix ที่มีตัวแปร สิ่งหนึ่งที่ควรทราบ: ตัวแปรที่ใช้งานอยู่ไม่สามารถละเว้นได้จากเงื่อนไข

aa*bbห่วงในขณะที่นี่ประกอบไปด้วยเงื่อนไข นี่หมายถึงการวนซ้ำในขณะที่ทั้งสองaa และ เป็นความจริง เนื้อความของรหัสแรกทำYY ตัวแปรที่ใช้งานเพื่อเก็บผลลัพธ์ (x). สิ่งนี้ทำได้ด้วย

`yy,$ff>xx

จากนั้นเราจะเปิดใช้งานเงื่อนไขลูปของเรา aa. เรามีสองเงื่อนไขสำหรับการวนซ้ำอย่างต่อเนื่อง:

  • 1) ค่าใหม่ไม่เท่ากับค่าเก่า (วนซ้ำในขณะที่ไม่ซ้ำกัน)
  • 2) ค่าใหม่ไม่ใช่สตริงว่าง

หนึ่งในข้อเสียที่ใหญ่ที่สุดของ Add ++ คือการขาดคำสั่งผสมซึ่งจำเป็นต้องมีตัวแปรลูปที่สอง เรากำหนดตัวแปรสองตัวของเรา:

aa=xxYY
=¬¬(YY)

ด้วยรหัส

`aa,xx|yy,`bb,Byy

ในกรณีที่|เป็นความไม่เท่าเทียมกันผู้ประกอบการและแปรรูปบูลB จากนั้นเราอัพเดทxx ตัวแปรที่จะเป็น YYตัวแปรที่มีxx:yyในการเตรียมการสำหรับลูปถัดไป

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

หลังจากวนซ้ำมันสามารถแตกได้ด้วยหนึ่งในสองเหตุผลดังที่กล่าวไว้ข้างต้น จากนั้นเราจะส่งออกค่าของaa. หากลูปเสียเพราะx=Yจากนั้นทั้งเอาต์พุตและ aaเป็นเท็จ ถ้าลูปเสียเพราะYY เท่ากับสตริงว่างแล้ว เป็นเท็จและ aa และผลลัพธ์เป็นความจริง

จากนั้นเราก็มาถึงคำสั่งสุดท้ายของเรา:

O

โปรแกรมสามารถอยู่ในสถานะหนึ่งในสามสถานะซึ่งตัวแปรแอ็คทีฟทั้งหมด :

  • 1) อินพุตว่างเปล่า ในกรณีนี้ลูปไม่ทำงานaa=1 และ =Faล.sอี. ผลลัพธ์ที่ถูกต้องคือFaล.sอี.
  • 2) อินพุตมีความสมดุลอย่างสมบูรณ์แบบ ถ้าเป็นเช่นนั้นลูปจะวิ่งaa=TRยูอี และ =Faล.sอี. ผลลัพธ์ที่ถูกต้องคือFaล.sอี
  • 3) อินพุตไม่สมดุลอย่างสมบูรณ์ ถ้าเป็นเช่นนั้นลูปจะวิ่งaa=Faล.sอี และ =TRยูอี. ผลลัพธ์ที่ถูกต้องคือTRยูอี

อย่างที่เห็น, เท่ากับเอาท์พุทที่คาดหวัง (แม้ว่าจะกลับจากคำตอบเชิงตรรกะ ) ดังนั้นเราก็แค่เอาท์พุท ไบต์สุดท้ายที่ช่วยเราเอาชนะ Java มาจากความจริงที่ว่า เป็นตัวแปรที่ใช้งานอยู่ดังนั้นสามารถตัดออกจากการโต้แย้งทำให้เราออกผลลัพธ์เช่นกัน TRยูอี หรือ Faล.sอีขึ้นอยู่กับว่าอินพุตนั้นมีความสมดุลอย่างสมบูรณ์หรือไม่


1

JavaScript (ES6), 76 ไบต์

ส่งคืนบูลีน

ff=ss=>ss==(ss=ss.replace(/(.)\1/,''))?!ss:ff(ss)//)(:!?,/1\).(/(ecalper.=(>

ลองออนไลน์!

แนะนำโดย @Shaggy: 58 ไบต์โดยส่งคืนสตริงว่างสำหรับการจับคู่หรือการโยนข้อผิดพลาดอย่างสมบูรณ์


1
หากหนึ่งใน "ค่ากลับ" อาจเป็นข้อผิดพลาด (รอการยืนยันในนั้น) แล้วนี้อาจเป็น66 ไบต์
Shaggy

โปรแกรมสามารถโดยการส่งออกเริ่มต้นรหัสผ่านทางออก ในกรณีเฉพาะของคำตอบผลลัพธ์ที่เป็นไปได้คือรหัสทางออก0สำหรับสตริงที่จับคู่อย่างสมบูรณ์และรหัสทางออก1สำหรับสตริงที่ไม่ได้จับคู่อย่างสมบูรณ์ซึ่งเป็นสองค่าที่แตกต่างกันดังนั้นจึงเป็นไปตามเกณฑ์ ดังนั้น 58 byter จะต้องถูกต้องสมบูรณ์
นาย Xcoder


1

Lua , 178 ไบต์

p=...S={}for a in p:gmatch"."do E=S[#S]~=a;S[E and#S+1 or#S]=E and a or X end;print(#S==0)--)0S#(tnirp;dne X ro a dna E=]S#ro 1+S#dna E[S;a=~]S#[S=E od"."hctamg:p ni a rof}{=S.=p

ลองออนไลน์!

ในขณะที่มันเป็นทางออกที่ยาวชะมัด แต่มันใช้ประโยชน์จากนิสัยแปลก ๆ ของ Lua นี่เป็นอัลกอริทึมกองกำลังเดรัจฉานขนาดเล็ก โปรแกรมนี้มีความซับซ้อนเนื่องจากรูปแบบของ Lua ไม่อนุญาตให้แทนที่คู่และ regex ไม่ได้ถูกสร้างขึ้น

คำอธิบาย:

p=... -- command-line argument
S={} -- the stack
for c in p:gmatch"." do -- shorter than "for i=1,#p do ..."
    E=S[#S]~=c -- check whether we have the right letter on top of stack
    -- could've saved some bytes by doing == instead of ~=
    -- but the double negation is necessary for ternary operator
    -- to work with nil values
    S[E and #S+1 or #S]=E and c or X -- Lua's awesome "ternary operator"
end
-- i'm sure there is a better way to output this (table indexing?)
print(#S==0)

1

Gol> <> , 30 ไบต์

1ll1**F:}}:{=Q{~~||lzBBzl{Q={F

ลองออนไลน์!

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

คำอธิบาย:

1       Push 1 as the end string marker
 ll1**  Push n, where n (len+1)*(len+2), 
        This is larger than the amount of steps needed to determine pairing
      F           |  Repeat that many times
       :}}:{=        Compare the first two characters of the string
             Q   |   If they are equal
              {~~    Pop both of them
        String is also rotated by 1
        If the string becomes empty, the 1 is compared to itself and removed.
                   lzB   Return whether the length of the stack is 0
                      Bzl{Q={F  Excess code to match unpaired symbols

1

Cubix , 30 ไบต์

1O@;??;@ii??O;>>;;;..1Wcc1??1W

ลองออนไลน์!

เอาต์พุต1ถ้าสตริงถูกจับคู่อย่างสมบูรณ์และไม่มีอะไรอื่น

Cubified

      1 O @
      ; ? ?
      ; @ i
i ? ? O ; > > ; ; ; . .
1 W c c 1 ? ? 1 W . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

แบบย่อ

      1 O @
      ; ? .
      . @ .
i ? . . . . > ; ; ; . .
. W c . . . ? 1 W . . .
. . . . . . . . . . . .
      . . .
      . . .
      . . .

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


1

Haskell , 92 ไบต์

gg""

gg((aa:cc:bb))dd|aa==cc=gg bb dd

gg  aa""=""==aa

gg  aa((bb:c))=gg((bb:aa))c--c:=c:|

ลองออนไลน์!

@ คำตอบของ nimiค่อนข้างเท่ห์ไม่ใช้ความคิดเห็น อันนี้สั้นกว่า แต่ใช้ความคิดเห็น

@ คำตอบของ xnorนั้นยอดเยี่ยมเช่นกันมันใช้ความคิดเห็นและสั้นกว่าอันนี้


0

Python 2 , 114 ไบต์

import re

e=lambda i,nn=1:e(*re.subn('(.)\\1','',i))if nn else''==i##ieslef'1).('(nbus.er*(e:1=,i adbmal=r tropmi

ลองออนไลน์!

ส่งคืนTrueสตริงที่จับคู่อย่างสมบูรณ์Falseมิฉะนั้น

(ที่จริงแล้วล้มเหลวในการตรวจสอบตัวเองเพราะ(.)จะไม่ตรงกับบรรทัดใหม่ในรหัส! แต่ @Cat Wizard บอกว่าไม่เป็นไรเพราะบรรทัดใหม่ไม่ใช่ตัวอักษร ASCII ที่พิมพ์ได้ดังนั้นโปรแกรมของฉันไม่จำเป็นต้องจัดการมัน)


นี่เป็นรุ่นที่จับคู่อย่างสมบูรณ์แบบของ:

import re;p=lambda s,n=1:p(*re.subn('(.)\\1','',s))if n else''==i

ซึ่งการทำให้สมบูรณ์แบบของ "คนขี้เกียจ" code + '##' + f(code[::-1])จะให้ 120 ไบต์ (นั่นคือเปลี่ยนชื่อตัวแปร ฯลฯ เพื่อแนะนำคู่ที่ยุบตัวมากขึ้นในครึ่งความคิดเห็นของรหัสที่บันทึกไว้ 6 ไบต์)


re.subnเป็นตัวแปรที่รู้จักกันน้อยของre.subผลตอบแทนที่ (new_string, number_of_substitutions_made)tuple มันค่อนข้างดีสำหรับการค้นหาจุดทดแทน regex!


0

เยลลี่ , 26 24 22 ไบต์

ẠƬµF€ḂLḣgŒŒgḣLḂ$$€FµƬẠ

ลองออนไลน์!

ดูเหมือนว่าจะทำงานโดยไม่ย้ายโค้ดย้อนหลังไปยังลิงก์ที่ไม่ได้ใช้

ส่งคืน0ถ้าอินพุตถูกจับคู่อย่างสมบูรณ์มิฉะนั้นจะเป็น1

รหัสที่ใช้งานอยู่:

ŒgḣLḂ$$€FµƬẠ
Œg            Group runs 'abbbcc'->['a','bbb','cc']
       €      For each of these strings:
      $       Monad{
     $            Monad{
   L                  Find the length...
    Ḃ                 ...mod 2. 
                      } -> [1, 1, 0] in this example.
  ḣ               Take this many characters from the string.
                  } -> [['a'], ['b'], []]
        F     Flatten -> ['a', 'b']
          Ƭ   Repeat...
         µ    The last monadic chain until a fixed point is reached.
           Ạ  All. If it is not a perfectly paired string, all elements in the 
              result of Ƭ will be nonempty and 1 is returned.
              If it is perfectly paired, the last element is [] which is falsy
              and 0 is returned.


0

Java 8, 158 156 154 ไบต์

n->{for(;n.matches(".*(.)\\1.*");n=n.replaceAll("(.)\\1",""));return  n.isEmpty();}//};)(ytpmEsi.ruter;,"1).("(Aecalper.n=n;)"*.1).(*."(sehctam.n;(rof{>-n

ส่งคืนบูลีน ( true/false )

-2 ไบต์ขอบคุณที่@raznagul

ลองออนไลน์

คำอธิบาย:

n->{                              // Method with String parameter and boolean return-type
  for(;n.matches(".*(.)\\1.*");   //  Loop as long as the String still contains pairs
    n=n.replaceAll("(.)\\1","")); //   Remove all pairs
  return  n.isEmpty();}           //  Return whether the String is empty now
//};)(ytpmEsi.ruter;,"1).("(Aecalper.n=n;)"*.1).(*."(sehctam.n;(rof{>-n
                                  // Comment reversed of the source code,
                                  // minus the pairs: '\\';'ll';'\\';'""))';'n  n';'//'

1
By renaming s to n and adding a second space to return s.isEmpty you can remove s n from the comment, saving 2 bytes in total.
raznagul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.