कोई शाखा नहीं


14

जो कोई भी निम्न स्तर के कोड अनुकूलन में मध्यम रूप से होता है, वह ब्रांचिंग की गड़बड़ियों के बारे में जानता है, इसे लागू किया जाए जैसे कि बयान, लूप या चयन-बयान एक शाखा के गलत होने की संभावना एक भयानक घड़ी बर्बाद करने वाली चीज है।

सरल अंकगणित से सरल समस्याओं को काफी बेहतर तरीके से हल किया जा सकता है, तो चलिए ऐसा करते हैं।

निम्नलिखित समस्याओं के लिए सभी चर 32 बिट अहस्ताक्षरित पूर्णांक हैं और केवल अनुमत कोड ही सादा सेट स्टेटमेंट है जिसमें केवल निम्नलिखित ऑपरेटर शामिल हैं:

+ addition
- subtraction
* multiplication
/ integer division, rounds down, division by 0 not allowed
% modulo
& binary and
| binary or
^ binary exclusive or
>> bitshift right
<< bitshift left

Logic operators, return 1 if the expression is true and 0 if it is false.
== equal
!= not equal
< less than
<= less than or equal
> greater than
>= greater than or equal

Set operator
=

हर लाइन में एक चर संचालक, एक अभिव्यक्ति के बाद एक चर पहचानकर्ता शामिल होना चाहिए।

एक अभिव्यक्ति में अतिरिक्त सेट ऑपरेटर नहीं हो सकते हैं, लेकिन चर पहचानकर्ता, शाब्दिक संख्या और कोष्ठक हो सकते हैं।

गोल्फ स्कोर केवल ऑपरेटरों की संख्या की गणना करेगा।

उदाहरण:

myvar = ( ( ( foo + 5 ) * bar ) % 7 ) == 3

5 ऑपरेटरों का स्कोर है।

एक समाधान में कई चर शामिल हो सकते हैं जैसा कि लेखक फिट देखता है।
चर जिन्हें सेट नहीं किया गया है, उनका मूल्य है 0
ओवरफ्लो और underflow अनुमति दी है, सभी ऋणात्मक संख्याओं underflow, इसलिए 3 - 5है 4294967294भी एक बड़ा बयान के भाग के रूप।

कार्य 1: मैक्स

दो मान, Aऔर B, गुंजाइश में मौजूद हैं, RESULTजब प्रोग्राम समाप्त होता है , तो चर में उन मानों में से सबसे बड़ा होता है।

टास्क 2: मेडियन

तीन मान और A, Bऔर C, दायरे में मौजूद हैं, RESULTजब प्रोग्राम समाप्त होता है , तो चर में उन मानों का माध्य होता है।

कार्य 3: वर्गमूल

एक मान, Aस्कोप में मौजूद होता है, जब प्रोग्राम समाप्त हो जाता है, तो RESULTवेरिएबल को वर्गाकार मूल में A, राउंड डाउन होता है।

प्रश्नों में से केवल एक या दो का उत्तर पोस्ट करना ठीक है, आप में से कुछ के लिए केवल वैध समाधान ढूंढना एक चुनौती होगी।


कहां हैं एक्री संचालक? मैं परवाह नहीं करता, -लेकिन ~अच्छा हो सकता है (भले ही मुझे नहीं पता कि इसके लिए क्या हो)।
जॉन ड्वोरक

ज़रूर, 0xFFFF_FFFF_FFFF_FFFF ^ xऔर 0 - x। मैं कैसे भूल सकता था?
जॉन ड्वोरक

@JanDvorak इसने सबसे छोटा विवरण दिया, पूर्णता तर्क के !लिए भी बहुत तुच्छ नहीं है x == 0:।
आआआआआआआआआआ आआआ आआआ आआआ

शून्य द्वारा विभाजन का व्यवहार क्या है?
जॉन ड्वोरक

Mathematica (a> b) में True या False मिलता है। Boole, False को 0 और True में परिवर्तित करता है। 1. क्या इसका उपयोग करना कानूनी है Boole[a-b]?
डेविड सीपी

जवाबों:


5

टास्क 3, 23 ऑप्स

x = (A >> 16) + A / ((A >> 13) + 511) + 15
x = (x + A/x) >> 1
x = (x + A/x) >> 1
x = (x + A/x) >> 1
RESULT = x - (x > A/x)

न्यूटन की विधि का उपयोग करना, जैसा कि अन्य समाधान करते हैं, अधिक चतुराई से चुने हुए बीज के साथ करते हैं। पहला बिट A >> 16रेंज के शीर्ष को खुश A / ((A >> 13) + 511)रखता है , दूसरा बिट रेंज के मध्य को खुश रखता है, और अंतिम बिट 15को नीचे रखता है , और शून्य त्रुटियों से विभाजन को भी रोकता है (15 सबसे बड़ा मूल्य संभव है जो 0सही ढंग से परिवर्तित करने की अनुमति देता है - आधा तीन गुना माइनस करेक्शन जीरो के बराबर है)। इनपुट मूल्यों 225, 275625, 82137969, 2908768489(और आस-पास के मूल्यों) के लिए प्रारंभिक बीज सटीक है। रेंज के सभी एज केस (परफेक्ट स्क्वेयर, परफेक्ट स्क्वेयर + 1 और परफेक्ट स्क्वेयर -1) 0 .. 2**32-1टेस्ट किए गए हैं और सही हैं।

नियमों के बारे में कुछ टिप्पणियां:
ओवरफ्लो और अंडरफ्लो की अनुमति है, सभी नकारात्मक संख्याएं अंडरफ्लो हैं, इसलिए 3 - 5 एक बड़े बयान के हिस्से के रूप में 4294967294 है ।

वह अंतिम बिट एक नवाचार हत्यारे के बारे में कुछ बताता है। मैंने शुरू में हैली की विधि के सामान्यीकृत रूप का उपयोग करके एक समाधान का प्रयास किया था , लेकिन यह महसूस किया कि इसे अवैध रूप से उपरोक्त प्रतिबंध दिया गया था। चलना (जैसा कि वर्गमूलों पर लागू होता है) यह है:

x = x * (3*A + x*x) / (A + 3*x*x)

इस पुनरावृत्ति में अच्छे गुण हैं जो न्यूटन के पास नहीं है। यह घनीभूत रूप से (चतुर्भुज के बजाय) परिवर्तित होता है, यह ऊपर या नीचे (केवल ऊपर से नहीं) से परिवर्तित होता है, और यह खराब चुने हुए बीज के प्रति उतना संवेदनशील नहीं होता है (यदि न्यूटन के पुनरावृत्ति को एक बीज प्रदान किया जाता है जो बहुत कम है, तो यह होगा) बहुत अधिक अभिसरण बिंदु को शूट करते हैं, और फिर वापस अपने तरीके से काम करने की आवश्यकता होती है)।

न्यूटन की विधि में भी समस्या है (कम से कम जब पूर्णांकों के साथ काम करते हैं) कि यह अक्सर एक एक्स तक पहुंच जाएगा जैसे कि ए / एक्स - एक्स = 2 - इस मामले में, यह उचित पूर्णांक रूट की तुलना में एक बड़ा मान में परिवर्तित करेगा, जिसे ठीक करने की आवश्यकता है; हैली की विधि को इस तरह के सुधार की आवश्यकता नहीं है। लेकिन दुर्भाग्य 3*A + x*xसे, अनुमत मूल्य अक्सर 32-बिट पूर्णांक स्थान की तुलना में बड़ा होगा।

कई अन्य सामान्यीकृत n वें रूट एल्गोरिदम हैं, लेकिन वे सभी इसे एक ही विशेषता साझा करते हैं:

x = x + x*(v - x**n)/(v*n)
x = (x*(n+1) - x**(n+1)/v)/n
x = ((n-2)*x + (4*v*x)/(v + x**n))/n
x = x*((n+2)*v + (n-2)*x**n)/(v + x**n)/n
x = ((n-2)*x + (n*x*v)/(v + (n-1)*x**n))/(n-1)
x = ((n-2)*x + x*((n*2-1)*v + x**n)/(v + (n*2-1)*x**n))/(n-1)

x = x + 2*x*(v - x**n)/(v + x**n)/n
x = x + x*31*(v - x**n)/(10*v + 21*x**n)/n
x = x + x*561*(v - x**n)/(181*v + 380*x**n)/n
x = x + x*1153*(v - x**n)/(372*v + 781*x**n)/n

आदि इनमें से अधिकांश घन या द्विघात अभिसरण प्रदर्शित करते हैं। अंतिम चार पुनरावृत्तियों की एक श्रृंखला का हिस्सा हैं जो क्वार्टिक अभिसरण पर परिवर्तित होता है। लेकिन प्रैक्सिस में, न्यूटन की विधि आपको वही मिलेगी जो आपको कम संचालन के साथ चाहिए, जब तक कि आपको कई सैकड़ों अंकों की गणना करने की आवश्यकता न हो।


बहुत अच्छा है, लेकिन 4294967295 के लिए विफल रहता है। नियमों के अनुसार, वे इसे दिलचस्प बनाने के लिए तंग होंगे। आप तर्क दे सकते हैं कि सटीक परिसर सबसे अच्छी चुनौती क्या है, लेकिन अंततः यह कहीं अधिक महत्वपूर्ण है कि नियम स्पष्ट और स्पष्ट हैं, वास्तव में वे क्या अनुमति देते हैं।
आआआआआआआआआआआआ आआआआआ आआआआआ

मुझे नहीं लगता कि हैली वैसे भी इसके लायक होगा, दूर के अनुमान से यह 3 के एक कारक से थोड़ा कम सुधार करेगा, न्यूटन 2 के कारक से थोड़ा कम करता है। इसी तरह एक अच्छे अनुमान से हैली ट्रिपल होगा सटीकता, न्यूटन इसे दोगुना कर देगा। तो एक हैली पुनरावृत्ति बिल्कुल log(3)/log(2) ~= 1.585न्यूटन पुनरावृत्तियों के लायक है ।
आआआआआआआआआआआआ आआआआआ आआआआआ आआआआआ

@eBusiness मैं शुरू में 2 हैली के साथ एक समान रूप से चुने हुए कुल 25 ऑप्स थे - जब त्रुटि के साथ A = 0- तो यह वास्तव में कम है। लगभग 4294967295 , यह एक निरीक्षण था: 65536≡ the 0 के रूप में , सुधार चलना सही करने में विफल रहता है। मैं देखूंगा कि क्या मुझे कोई विकल्प मिल सकता है।
Primo

@eBusiness तय किया।
Primo

पैक का सबसे चिकना वर्गमूल, अच्छी नौकरी और आधिकारिक जीत का बिल्ला।
आआआआआआआआआआ आआआआ आआआआआ

5

65 (61) ऑपरेशन (5 + 13 + 47 (43))

टास्क 1 - मैक्स (ए, बी)

RESULT = A + (B - A) * (A <= B)

यह स्पष्ट समाधान है। आपको असाइनमेंट की आवश्यकता है, आपको तुलना की आवश्यकता है, आपको किसी चीज के साथ तुलना को गुणा करने की आवश्यकता है, मल्टीप्लैंड चर में से एक नहीं हो सकता है और उत्पाद परिणाम नहीं हो सकता है।

टास्क 2 - मिड (ए, बी, सी)

RESULT = A                               \
       + (B - A) * (A > B) ^ (B <= C)    \
       + (C - A) * (A > C) ^ (C <  B)

यह मेरे पिछले 15-ऑप्स समाधान पर एक सुधार है, जिसने सभी तीन चर को वातानुकूलित किया है - इससे दो घटाव बच गए, लेकिन इसने एक और केंद्रीयता परीक्षण पेश किया। परीक्षण स्वयं सरल है: एक तत्व मध्य iff में है, ठीक दो में से एक अन्य ऊपर है।

टास्क 3 - sqrt (A)

X1     = 1024 + A / 2048
X2     = (X1  + A / X1 ) / 2
...
X10    = (X9 + A / X9 ) / 2
RESULT = X16 - (X16 * X16 > A)

न्यूटन सन्निकटन के ग्यारह राउंड। 1024 का जादुई स्थिरांक पहले से ही वुल्फ्रेमवे द्वारा पीटा जाता है (और 512 एक = 0 से पहले शून्य के लिए विभाजन का कारण बनता है = 2 ** 32 धर्मान्तरित), लेकिन अगर हम 0/0 को शून्य के रूप में परिभाषित कर सकते हैं, तो दस पुनरावृत्तियों शुरुआती मूल्य के साथ काम करेंगे 512 में। मैं मानता हूं कि दस पुनरावृत्तियों का मेरा दावा पूरी तरह से साफ नहीं है, लेकिन मैं अभी भी उन्हें कोष्ठक में दावा करता हूं। मुझे जांच करनी होगी कि क्या नौ संभव है, हालांकि।WolframH के समाधान है नौ पुनरावृत्तियों।


मुझे लगता है कि टास्क 3 की पहली पंक्ति सही नहीं है: दूसरा स्थिरांक पहले स्थिर से 4 गुना ("शुद्ध" न्यूटन) होना चाहिए।
मोनिका

@WolframH एक बेहतर प्रारंभिक अनुमान समझा सकता है कि मैं साइकिल क्यों बर्बाद कर रहा हूं। आप 4 * के साथ कहां आए? यह दो पुनरावृत्तियों को एक में लुढ़का हुआ लगता है।
जॉन ड्वोरक

(1024 + A/1024)/2 == (512 + A/2048)(जो पसंद है X0 = 1024, और फिर न्यूटन शुरू करना)।
मोनिका

टास्क का अच्छा समाधान 1. कोलंबस का अंडा।
डेविड सीपी

@DavidCarraher बेशक, सही समाधान होगा MOV RESULT, A; CMP A,B; CMOVA RESULT, B;-)
जॉन ड्वोरक

5

1: 5 ऑपरेटर

RESULT = B ^ (A ^ B)*(A > B)

2: 13 ऑपरेटर

RESULT = B ^ (A ^ B)*(A > B) ^ (A ^ C)*(A > C) ^ (B ^ C)*(B > C)

3: 27 ऑपरेटर

g = 47|((0x00ffffff & A)>>10)|(A>>14)
r = (g + A/g)/3
r = (r + A/r)>>1
r = (r + A/r)>>1
r = (r + A/r)>>1
RESULT = r - (r*r-1>=A)

5

टास्क 3, 39 संचालन

EDIT: अंतिम पंक्ति में परिवर्तन; टिप्पणी देखो।

यह न्यूटन विधि का कार्यान्वयन है। सभी सकारात्मक वर्गों के साथ परीक्षण किया गया, और सकारात्मक वर्गों के साथ शून्य से एक, और 0 से 2 ^ 32-1 की सीमा में एक मिलियन यादृच्छिक संख्याएं भी। प्रतीत होता है कि मजाकिया शुरुआती मूल्य कम है (1022 + A/1022) / 2, जिसके लिए कम से कम संख्या में पुनरावृत्तियों की आवश्यकता होती है (मुझे लगता है), और सही के RESULTलिए भी बनाता है A=0(जो 1024इसके बजाय मामला नहीं होगा 1022)।

r = (511 + A/2044)
r = (r + A/r) / 2
r = (r + A/r) / 2
r = (r + A/r) / 2
r = (r + A/r) / 2
r = (r + A/r) / 2
r = (r + A/r) / 2
r = (r + A/r) / 2
r = (r + A/r) / 2
RESULT = r - (r > A/r)

क्या मुझे न्यूटन के तरीके की अपनी हीन प्रतिलिपि रखनी चाहिए जो आपके साथ समानांतर रूप से अनुकूलित थी और बाद में एक सभ्य राशि पोस्ट की? महान दिमाग एक जैसा सोचते हैं और दो दो उत्तरों में हल का बंटवारा बुरा है, लेकिन यह है कि मामलों की वर्तमान स्थिति है, जैसा कि आपने इस उत्तर को नहीं दिया है।
जॉन ड्वोरक

@JDDvorak: पूछने के लिए धन्यवाद। यह ठीक है यदि आपने मेरी छोटी विधि को अपने उत्तर में डाल दिया है। इसके अलावा, मुझे श्रेय देने के लिए धन्यवाद :-)
मोनिका

वास्तव में अच्छी कोशिश, लेकिन 4294967295 के माध्यम से 4294965360 इनपुट के लिए विफल रहता है।
aaaaaaaaaaaa

@eBusiness: उन इनपुट्स के लिए आपको क्या परिणाम मिलेगा? मुझे अपने परीक्षणों में 65535 मिलते हैं, जो ठीक है।
मोनिका सेप

मुझे 65536 मिलते हैं। शायद आप निर्धारित पूर्णांक प्रारूप का उपयोग नहीं करते हैं।
आआआआआआआआआआआआ आआआआआ आआआआआ आआआआआआआआ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.