JavaScript (ES7), 121 117 ไบต์
x=>(a=b=0,[for(c of x)for(d of'1234')(e=c.charCodeAt()/26|0)==d?a^=1<<d:b^=(a>>d&1)<<d*4+e],f=y=>y&&y%2+f(y>>1))(b)/2
ว้าว. นั้นน่าสนุก. ฉันร่างแนวคิดคำตอบเมื่อความท้าทายนี้ออกมาเป็นครั้งแรก แต่มันมีความยาวเกิน 150 ไบต์และฉันไม่ต้องการพยายามตีกอล์ฟ ฉันวิ่งข้ามความคิดนี้ในสมุดบันทึกของฉันเมื่อวานนี้และตัดสินใจว่าจะไม่หยุดคิดจนกว่าฉันจะตีกอล์ฟให้เต็มที่ ฉันลงเอยด้วยการเขียนอัลกอริธึมใหม่ทั้งหมดสองอย่างโดยเริ่มแรกนั้นสั้นลงหลายไบต์หลังจากเล่นกอล์ฟไปประมาณ 25 ไบต์ด้วยการแฮ็คบิตจำนวนหนึ่ง
มันทำงานอย่างไร
ครั้งแรกที่เราตั้งค่าตัวแปรaและการb เป็นอาร์เรย์ไบนารี 4 บิตซึ่งคู่วงเล็บเราอยู่ในขณะนี้และเป็นอาร์เรย์ไบนารี 16 บิตซึ่งคู่วงเล็บถูกเชื่อมโยงเข้าด้วยกัน0ab
ต่อไปเราจะห่วงผ่านตัวละครแต่ละตัวcในxแต่ละถ่านในd '0123'ครั้งแรกที่เรากำหนดประเภทของตัวยึดอยู่กับc e=c.charCodeAt()/26-1|0รหัสถ่านฐานสิบของวงเล็บแต่ละประเภทมีดังนี้:
() => 40,41
<> => 60,62
[] => 91,93
{} => 123,125
โดยการหารด้วย 26 การลบ 1 และการปูพื้นเราจับคู่สิ่งเหล่านี้กับ 0, 1, 2 และ 3 ตามลำดับ
dต่อไปเราจะตรวจสอบว่าหมายเลขนี้จะเท่ากับมูลค่าปัจจุบันของ ถ้าเป็นเรามีทั้งเข้าหรือออกจากdประเภทวงเล็บ, th ดังนั้นเราจึงพลิกdบิตในลำดับที่มีa a^=1<<dหากยังไม่ได้ แต่เรามีอยู่ภายในdชนิดยึดวันที่เราต้องพลิกeบิตบริบูรณ์ในdวันที่มาตรา 4 bบิต ทำเช่นนี้เพื่อ:
b^=(a>>d&1)<<d*4+e
(a>>d&1)ผลตอบแทนบิตในลำดับที่d aถ้าเราอยู่ในdประเภทวงเล็บปีกกานี่จะส่งคืน 1 มิฉะนั้นจะส่งคืน 0 ถัดไปเราเลื่อนซ้ายไปทีละd*4+eบิตและ XOR bตามผลลัพธ์ หากเราอยู่ในdประเภทวงเล็บปีกกา XOR นี้จะเป็นd*4+eบิตที่สามของb; มิฉะนั้นจะไม่ทำอะไรเลย
ในตอนท้ายของการวนซ้ำทั้งหมดbจะมีจำนวน 1 บิตเท่ากับค่าส่งคืนที่ต้องการสองเท่า แต่เรายังต้องหาจำนวนบิตนี้ นั่นคือที่fมาของฟังก์ชั่นย่อย:
f=y=>y&&y%2+f(y>>1)
ถ้าyเป็น 0 นี้ก็กลับ 0 มิฉะนั้นก็จะใช้เวลาบิตสุดท้ายของyด้วยy%2แล้วเพิ่มผลของการทำงานทั้งหมด แต่บิตสุดท้ายที่yผ่านการทำงานอีกครั้ง ตัวอย่างเช่น:
f(y) => y && y%2 + f(y>>1)
f(0b1001101) => 1 + f(0b100110) = 4
f(0b100110) => 0 + f(0b10011) = 3
f(0b10011) => 1 + f(0b1001) = 3
f(0b1001) => 1 + f(0b100) = 2
f(0b100) => 0 + f(0b10) = 1
f(0b10) => 0 + f(0b1) = 1
f(0b1) => 1 + f(0b0) = 1
f(0b0) => 0 = 0
เราวิ่งbผ่านฟังก์ชั่นนี้และหารผลลัพธ์ด้วย 2 และมีคำตอบของเรา