जावास्क्रिप्ट (ईएस 7), 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
करते हैं 0
। a
4-बिट बाइनरी सरणी है, जो ब्रैकेट जोड़े हम वर्तमान में अंदर हैं, और b
16-बिट बाइनरी सरणी है जिसमें ब्रैकेट जोड़े एक साथ जुड़े हुए हैं।
अगला, प्रत्येक चरित्र के माध्यम से हम पाश 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
, वें ब्रैकेट प्रकार तो हम फ्लिप d
में वें बिट a
के साथ a^=1<<d
। यदि यह नहीं है, लेकिन हम वें ब्रैकेट प्रकार के अंदर हैंd
, तो हमें वें 4-बिट अनुभाग e
में वें बिट को फ्लिप करना होगा । यह इस तरह किया जाता है:d
b
b^=(a>>d&1)<<d*4+e
(a>>d&1)
में d
वें बिट लौटाता है a
। यदि हम d
वें ब्रैकेट प्रकार के अंदर हैं , तो यह 1 देता है; अन्यथा, यह 0. लौटाता है। अगला, हम इसे d*4+e
बिट्स द्वारा छोड़ दिया है , और XOR b
परिणाम द्वारा। यदि हम d
th ब्रैकेट प्रकार के अंदर हैं , तो यह XORs के 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 से विभाजित करते हैं, और हमारा उत्तर है।