उन लोगों को कम से कम [बंद]


12

आपका काम लोगों को और केवल ऑपरेटरों और उनमें कम का उपयोग कर एक प्राकृतिक संख्या का निर्माण करना है +या -। उदाहरण के लिए, संख्या सात लिखी जा सकती है 1+1+1+1+1+1+1=7, लेकिन इसे भी लिखा जा सकता है 11-1-1-1-1=7। पहले 7वाले का उपयोग करता है, जबकि बाद वाला केवल उपयोग करता है 6। आपका काम, जो कि इस्तेमाल कुछ प्राकृतिक संख्या के इनपुट दिया जा सकता है की न्यूनतम संख्या वापस जाने के लिए है n

यह कोड गोल्फ है, इसलिए बाइट्स जीतने वाला सबसे छोटा वैध कोड है।

परीक्षण के मामलों

इनपुट => आउटपुट

0 => 2 (since 1-1=0)
7 => 6
121 => 6
72 => 15
1000 => 7
2016 => 21

अच्छी पहली चुनौती। मैं अधिक परीक्षण मामलों सहित सुझाव देना चाहूंगा। क्या "VALUT OUTPUTS" एक गलती है, यह देखते हुए कि एक ही आउटपुट है? इसके अलावा, 0 एक वैध इनपुट है, और यदि हां, तो आउटपुट क्या होना चाहिए?
xnor

यह एक दिलचस्प चुनौती है। आप आउटपुट के लिए स्पष्टीकरण जोड़ना चाहते हैं, बदल सकते हैं VALID OUTPUTS। यह आपकी पसंद है, लेकिन आम तौर पर लोग CAPITAL LETTERS के बजाय बोल्ड या इटैलिक्स पसंद करते हैं (वे इसे जोर देने के बजाय चिल्लाना पसंद करते हैं)। बोल्ड है **bold text**, और इटैलिक्स है *italics text*। आप ### Textबोल्ड-एर टेक्स्ट का भी उपयोग कर सकते हैं । वैसे भी, PPCG में आपका स्वागत है!
NoOneIsHere

आपको कंप्यूटर-पठनीय तालिका या परीक्षण मामलों की सूची बनानी चाहिए, जिन पर लोग अपना कोड चला सकें। इस टिप को देखें ।
xnor

6
मैं इस प्रश्न को बंद करने के लिए मतदान कर रहा हूं क्योंकि यह प्रश्न वर्तमान (सक्रिय !!) के डुप्लिकेट का है । codefights.com/challenges पर गोल्फ चुनौती । भले ही ओपी कोडफाइट्स पर मूल चुनौती का लेखक है (जो मुझे संदेह है), सवाल तब तक बंद होना चाहिए जब तक कि कोडफाइट्स पर चुनौती किसी भी अधिक सक्रिय न हो।
जकुबे

1
@ जाकुब सीधा लिंक मददगार हो सकता था, लेकिन मैं सहमत हूं। मैं बंद करने के लिए मतदान करूंगा।
NoOneIsHere

जवाबों:


3

जावास्क्रिप्ट (ईएस 6), 127 126 87 बाइट्स

f=(n,z=2,m=n*9+'',r=m.replace(/./g,1))=>n?m.length+(m<'55'?f(n- --r/10,0)-1:f(r-n,0)):z
Input: <input type="number" oninput="result.textContent=f(this.value)"> Result: <span id="result"></span>

लगभग 10 14 15 पर काम करना चाहिए जिस बिंदु पर आप जावास्क्रिप्ट की पूर्णांक सीमाओं में चलना शुरू करते हैं। स्पष्टीकरण:

f=(                             Recursive function
 n,                             Parameter
 z=2,                           Zero workaround
 m=n*9+'',                      Magic
 r=m.replace(/./g,1)            Find repunit not less than than n
)=>n?                           Nothing to do if n is zero
 m.length+                      Assume subtracting from repunit
 (m<'55'?                       Should we subtract from repunit?
  f(n- --r/10,0)                No, so subtract previous repuint
   -1:                          Which is one 1 shorter
  f(r-n,0)):                    Subtract from repunit
 z                              Return special case if n is zero

यह n*9दो बार जादू का उपयोग करता है ; सबसे पहले, यह मुझे अगले पुनर्मिलन की लंबाई देता है, दूसरे, यदि पहले दो अंक n*9हैं 55या उच्चतर हैं, तो हमें nउस अगले पुनर्मिलन से घटाना होगा, अन्यथा हमें पिछले पुनर्मिलन को घटाना होगा (जिसकी गणना 1 और घटाना के लिए की जाती है) 10 से भाग)। यह 10 15 तक काम करना चाहिए ।


2

पायथ, 19 16 बाइट्स

ffqQvs+R1Y^c3"+-

परीक्षण सूट

जानवर बल एल्गोरिथ्म। आवश्यक तार सभी सूचियों को ले कर उत्पन्न होते हैं, जिनके तत्व ['+', '-', '']परीक्षण किए जा रहे 1s की संख्या के बराबर लंबाई के होते हैं , प्रत्येक को 1 जोड़ते हैं, और एक ही स्ट्रिंग को समवर्ती करते हैं। इन तारों का मूल्यांकन किया जाता है और इनपुट के साथ तुलना की जाती है। यह तब तक दोहराया जाता है जब तक कि एक सफल स्ट्रिंग न मिल जाए।

एक अग्रणी के साथ कुछ तार +या -परीक्षण किए जाते हैं, लेकिन यह कोई समस्या नहीं है। यह तब होगा जब इनपुट नकारात्मक था।

यह बहुत धीमा होने से पहले लंबाई 9 तक चल सकता है।

स्पष्टीकरण:

ffqQvs+R1Y^c3"+-
ffqQvs+R1Y^c3"+-"T    Implicit variable introduction
                      Q = eval(input())
f                     Starting with T = 1 and counting upwards, repeat until true.
                      The value of T where the result is first true is output.
           c3"+-"     Chop "+-" into thirds, giving ['+', '-', '']
          ^      T    Form every list with those elements of length T.
 f                    Filter over those lists, lambda var Y.
      +R1Y            Append a 1 to each element of the list.
     s                Concatenate.
    v                 Eval.
  qQ                  Compare for equality with the input.
                      The inner filter will let through the successful cases.
                      The outer filter will stop when there is a successful case.

2

जावास्क्रिप्ट (ईएस 6), 92 बाइट्स

f=(n,i=3)=>eval([...s=i.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n?f(n,i+1):s.length-1
n = <input type="number" oninput="R.textContent=f(this.value)" /><pre id="R"></pre>

व्याख्या

पुनरावर्ती कार्य। यह या 1तो +, -या कुछ भी नहीं द्वारा अलग किए गए सभी संभावित क्रम उत्पन्न करता है । यह एक आधार -3 नंबर 0को बढ़ाकर -, 1इसे अंकों के एक सरणी में बदलकर, प्रत्येक अंक को , +और 2एक खाली स्ट्रिंग में परिवर्तित करके , फिर उन्हें 1एस के साथ जोड़कर करता है । परिणामस्वरूप स्ट्रिंग evalएक जावास्क्रिप्ट स्टेटमेंट के रूप में घ है जो समीकरण का परिणाम देता है।

क्योंकि ऑपरेटर 1आपस में s (जैसे +1+1+1+) से जुड़ते हैं , वहाँ length - 1 1s होते हैं । पहले ऑपरेटर को नजरअंदाज कर दिया जाता है (क्योंकि +1= 1, <nothing>1= 1और यह एक संख्या है, इसलिए इसके 0लिए अग्रणी नहीं होगा -) और अंतिम ऑपरेटर को भी अनदेखा किया जाता है ( .0समीकरण को जोड़कर )।

उच्च आउटपुट संस्करण, 96 बाइट्स

अन्य संस्करण पुनरावर्ती कॉल स्टैक सीमा के कारण आउटपुट ~ 10 से अधिक नहीं लौटा सकता है। यह संस्करण पुनरावृत्ति के बजाय लूप के लिए उपयोग करता है, इसलिए यह ~ 33 तक आउटपुट वापस कर सकता है। आवश्यक समय की मात्रा तेजी से बढ़ जाती है, हालांकि मैं इसे परीक्षण करने की सलाह नहीं देता।

n=>eval('for(a=3;eval([...s=a.toString(3)].map(d=>"-+"[d]||"").join`1`+".0")-n;)a++;s.length-1')

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