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 บิตซึ่งคู่วงเล็บถูกเชื่อมโยงเข้าด้วยกัน0
a
b
ต่อไปเราจะห่วงผ่านตัวละครแต่ละตัว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 และมีคำตอบของเรา