जेएस, 1719/1694
सिद्धांत
दुर्भाग्य से, नियम जो आप प्रदान करते हैं वह गणितीय दृष्टिकोण से एक बुद्धिमान निर्णय नहीं हो सकता है। वास्तव में, नियमों के एक छोटे उपसमुच्चय का उपयोग करके, आप दिए गए अंतराल में हर संख्या के लिए एक समाधान पा सकते हैं
![मैं = [१; 10000]](https://i.stack.imgur.com/KBiqV.gif)
के अलावा
![एक्स = [1; 3] 5 [5; १०] 12 {१२}](https://i.stack.imgur.com/rDCDo.gif)
जिसके लिए कोई उपाय नहीं है।
नियम सेट को कम किया गया
नियमों के निम्नलिखित सबट पर विचार करें:
- केवल ऑपरेटरों का उपयोग करें
plus, minusऔर times।
- आपको अपनी अभिव्यक्तियों में या उसके कई घटनाओं को लागू करने की आवश्यकता नहीं है ।
plusminus
- आपको न तो लागू करने की आवश्यकता है
division और न ही operator associativity(जैसा कि उनका समाधान सेट पहले नियम द्वारा कवर किया गया है)।
यह काम करने का कारण यह है कि, जैसा कि आपने पहले @Qwix के साथ चर्चा की थी, आप उबाऊ उत्तर देते हैं, अर्थात्, ऐसे भाव जो नियमित अभिव्यक्ति में समाप्त होते हैं
( times one)+$। इसकी अनुमति देने पर, दिए गए अंतराल में प्रत्येक संख्या का एक समाधान होगा।
जब आपने अपनी एक टिप्पणी में उत्तर दिया,
@ क्विक्स हाँ; उबाऊ उत्तर स्वीकार्य हैं, हालांकि वह 104, 105, 106, 107, 108, 109, 110, या 111 के लिए काम नहीं करता है। -
आप बिलकुल सही थे: यह तब काम नहीं करता है जब आप अपनी अभिव्यक्ति को स्वयं संख्याओं one hundred four times one times one …या उन संख्याओं में से किसी एक के साथ शुरू करने का प्रयास कर रहे हों ।
हालांकि, आपकी अभिव्यक्ति एक अभिव्यक्ति के साथ शुरू होती है जिसका मूल्यांकन दिए गए नंबरों में से एक के बराबर होता है, तो आप भाग्य से बाहर हैं। उदाहरण के लिए, ध्यान दें कि 17 + 87वास्तव में है 104, इसलिए हम इस प्रकार लिख सकते हैं 104:
104: seventeen plus eighty seven times one times one times one times one times one times one times one times one times one times one
यह देखने के लिए कि यह सबसेट काम करता है, इस फ़ाइल को इस रूप में सहेजें num.jsऔर यह सुनिश्चित करें कि आपके सिस्टम के लिए एक जावास्क्रिप्ट इंजन स्पाइडरमोंकी को इंस्टॉल किया गया है।
एल्गोरिथ्म
- आइए हम
Kसकारात्मक पूर्णांकों के लिए संपत्ति को परिभाषित करते हैं कि Nअक्षरों की संख्या और मान होने की स्थिति N।
- आइए हम
Fएक अभिव्यक्ति के लिए संपत्ति को उसके शब्द रूपांतरण की स्थिति के रूप में परिभाषित करें , जो कि 8kℕ k के साथ इसके मूल्यांकन से कम है। F"भरने योग्य" के लिए खड़ा है और वर्णन करता है कि हम अभिव्यक्ति के शब्द रूपांतरण को लंबाई 8 (यानी " times one") के भावों के साथ भर सकते हैं या नहीं , ताकि परिणामी अभिव्यक्ति को संपत्ति मिल सके N।
हम फिर इस प्रकार आगे बढ़ते हैं:
- इनपुट नंबर को शब्दों में बदलें।
- जांचें कि इनपुट नंबर में संपत्ति है या नहीं
K।
- यदि ऐसा होता है, तो शब्दों को वापस कर दें (
4इस संपत्ति के साथ एकमात्र संख्या है, दुर्भाग्य से)।
- यदि यह नहीं है, आगे बढ़ें।
- सभी दो-संचालन अभिव्यक्तियों के लिए (इस क्रम में जोड़, घटाव और गुणा) जो इनपुट संख्या में परिणाम करते हैं, जांचें कि क्या उनके मूल्यांकन में संपत्ति है
K।
- यदि ऐसा होता है, तो शब्दों को वापस करें।
- यदि ऐसा नहीं है, तो जांच लें कि क्या दो-ऑपरेंड की अभिव्यक्ति में संपत्ति है
N।
- यदि ऐसा होता है, तो अभिव्यक्ति को भरें
" times one"और जांचें कि क्या परिणामी अभिव्यक्ति के मूल्यांकन में संपत्ति है K।
- यदि ऐसा होता है, तो शब्दों को वापस करें
- यदि यह नहीं है, आगे बढ़ें
- यदि यह नहीं है, आगे बढ़ें
- एक कॉफ़ी पी जाओ
अभ्यास
num.js (स्पाइडरमैन / कमांड लाइन के लिए)
function X(e,t){return e+": "+t}function P(e){var n,t;for(n=1;.5*e+(e%2===0?1:0)>n;++n){if(t=C.s(n)+" plus "+C.s(e-n),t.replace(/\s/g,"").length===e)return t;if(F(e,t)&&e>t.length)return G(e,t)}return!1}function M(e){var t,n;for(t=L;t>1;--t){if(0>t-e)return!1;if(n=C.s(t)+" minus "+C.s(t-e),n.replace(/\s/g,"").length===e)return n;if(F(e,n)&&e>n.length)return G(e,n)}return!1}function F(e,t){return(e-t.replace(/\s/g,"").length)%8===0}function G(r,t){var e,i=(r-t.replace(/\s/g,"").length)/8,n="";for(e=0;i>e;++e)n+=" times one";return t+n}function T(e){var t,n,r;if(F(e,C.s(e)))return G(e,C.s(e));for(t=1,n=1;t<Math.floor(Math.sqrt(e));++t){for(;e>tn;)++n;if(tn===e&&(r=C.s(t)+" times "+C.s(n),r.replace(/\s/g,"").length===e))return r}return!1}function Y(e){var n,r,t;return e===C.s(e).length?X(e,C.s(e)):(n=P(e))?X(e,n):(r=M(e))?X(e,r):(t=T(e),t?X(e,t):X(e,"impossible"))}var L=1e4,C=new function(){return this.o=["","one","two","three","four","five","six","seven","eight","nine"],this.t=["","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"],this.T=["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"],this.s=function(e){return e?this.m(e):"zero"},this.m=function(e){return e>=1e6?this.m(Math.floor(e/1e6))+" million"+(e%1e6!==0?" "+this.Z(e%1e6):""):this.Z(e)},this.Z=function(e){return e>=1e3?this.h(Math.floor(e/1e3))+" thousand"+(e%1e3!==0?" "+this.h(e%1e3):""):this.h(e)},this.h=function(e){return e>99?this.o[Math.floor(e/100)]+" hundred"+(e%100!==0?" "+this.U(e%100):""):this.U(e)},this.U=function(e){return 10>e?this.o[e]:e>=10&&20>e?this.T[e-10]:this.t[Math.floor(e/10)]+(e%10!==0?" "+this.o[e%10]:"")},this};print(Y(0|arguments[0]))
num.js (ब्राउज़रों के लिए)
ऊपर से दिया गया कोड अपने अंतिम कमांड के कारण ब्राउज़रों के लिए काम नहीं कर सकता है, जो दिए गए स्क्रिप्ट से बाहर एक अच्छी कमांड बनाने के लिए कमांड लाइन के तर्क देता है।
अपने ब्राउज़र में सीधे जावास्क्रिप्ट कोड चलाने के लिए, उपरोक्त कोड के इस टुकड़े का चयन करें:
function X(e,t){return e+": "+t}function P(e){var n,t;for(n=1;.5*e+(e%2===0?1:0)>n;++n){if(t=C.s(n)+" plus "+C.s(e-n),t.replace(/\s/g,"").length===e)return t;if(F(e,t)&&e>t.length)return G(e,t)}return!1}function M(e){var t,n;for(t=L;t>1;--t){if(0>t-e)return!1;if(n=C.s(t)+" minus "+C.s(t-e),n.replace(/\s/g,"").length===e)return n;if(F(e,n)&&e>n.length)return G(e,n)}return!1}function F(e,t){return(e-t.replace(/\s/g,"").length)%8===0}function G(r,t){var e,i=(r-t.replace(/\s/g,"").length)/8,n="";for(e=0;i>e;++e)n+=" times one";return t+n}function T(e){var t,n,r;if(F(e,C.s(e)))return G(e,C.s(e));for(t=1,n=1;t<Math.floor(Math.sqrt(e));++t){for(;e>tn;)++n;if(tn===e&&(r=C.s(t)+" times "+C.s(n),r.replace(/\s/g,"").length===e))return r}return!1}function Y(e){var n,r,t;return e===C.s(e).length?X(e,C.s(e)):(n=P(e))?X(e,n):(r=M(e))?X(e,r):(t=T(e),t?X(e,t):X(e,"impossible"))}var L=1e4,C=new function(){return this.o=["","one","two","three","four","five","six","seven","eight","nine"],this.t=["","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"],this.T=["ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"],this.s=function(e){return e?this.m(e):"zero"},this.m=function(e){return e>=1e6?this.m(Math.floor(e/1e6))+" million"+(e%1e6!==0?" "+this.Z(e%1e6):""):this.Z(e)},this.Z=function(e){return e>=1e3?this.h(Math.floor(e/1e3))+" thousand"+(e%1e3!==0?" "+this.h(e%1e3):""):this.h(e)},this.h=function(e){return e>99?this.o[Math.floor(e/100)]+" hundred"+(e%100!==0?" "+this.U(e%100):""):this.U(e)},this.U=function(e){return 10>e?this.o[e]:e>=10&&20>e?this.T[e-10]:this.t[Math.floor(e/10)]+(e%10!==0?" "+this.o[e%10]:"")},this}
अब, इसे अपने ब्राउज़र के जावास्क्रिप्ट कंसोल में पेस्ट करें, ताकि आप उदाहरण के लिए अपने ब्राउज़र से उसी परिणाम का उत्पादन कर सकें:
Y(1234);
उदाहरण (कमांड लाइन)
chiru@chiru ~ $ js num.js 28
28: fourteen plus fourteen times one
chiru@chiru ~ $ js num.js 7
7: impossible
chiru@chiru ~ $ js num.js 42
42: nine thousand sixty minus nine thousand eighteen
और व्यवस्था चाल जिसके साथ आप प्रत्येक संख्या काम कर सकते हैं देखने के लिए, बस पर एक नजर है उबाऊ जवाब के लिए js num.js 1337:
1337: ten plus one thousand three hundred twenty seven times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one times one
प्रदान किए गए कोड दिए गए अंतराल के लिए मान्य समाधान उत्पन्न करते हैं (और शायद ऊपर भी, आपको केवल चर का मूल्य बढ़ाना होगा L)।
आंकड़े
मेरी रुचि थी कि "कैसे उबाऊ " भाव थे (या: times oneइस एल्गोरिथ्म के भीतर अभिव्यक्ति के अनुसार कितना सबस्ट्रिंग का उपयोग किया गया था), क्योंकि यह भाग दिए गए अंतराल के भीतर हर संख्या के लिए समाधान खोजने के लिए जिम्मेदार था। खुद के लिए देखें:
एक्स : एन-वें अभिव्यक्ति (न्यूनतम 0, अधिकतम 10,000)
y : अभिव्यक्ति के भीतर "बार एक" के घटित होने की संख्या (न्यूनतम 0, अधिकतम 1245)।

निष्कर्ष:
- भाव एक रैखिक तरीके से अधिक से अधिक उबाऊ हो जाते हैं।
- 99% से अधिक समाधान उबाऊ हैं।
So for 1234 we can do (massive expression) times zero plus one thousand two hundred thirty four.आप शून्य को बाहर करना चाह सकते हैं। आप पर निर्भर करता है।