मेरा "कीबोर" कुंजी-उबाऊ है मुझे! मुझे एक न्यूनतम कीस्ट्रोक्स खोजने में मदद करें


13

इस सवाल के साथ आने के लिए @ Agawa001 को श्रेय ।

व्याख्या

मेरे नए "कीबोर" में केवल 2 बटन हैं, अर्थात् +और -

मेमोरी में नंबर शुरू होता है 0

प्रत्येक लगातार दबाने +या -मेमोरी को बढ़ाने या घटाने के लिए स्मृति कितनी बार इसे लगातार दबाया गया है।

इसलिए, यदि आप +4 बार दबाते हैं, तो पहली बार यह 1 जोड़ता है, दूसरी बार यह 2 जोड़ता है, तीसरी बार यह 3 जोड़ता है, चौथी बार यह 4 जोड़ता है, आपको 10(दस) देता है।

अब, यदि आप -3 बार दबाते हैं , तो पहली बार यह 1 घटाता है, दूसरी बार 2, तीसरी बार 3, आपको 4(चार) छोड़कर ।

टी एल; डॉ

+ और - की एक स्ट्रिंग को देखते हुए, इसे चरित्र के प्रत्येक परिवर्तन पर विभाजित करें। तब एम +प्रतीकों के प्रत्येक परिणामी स्ट्रिंग को एम-वें त्रिकोण संख्या कहते हैं, और एन -प्रतीकों के प्रत्येक स्ट्रिंग एन-वें त्रिकोण संख्या को घटाते हैं।

वाल्क-के माध्यम से

अब, यदि आप अभी भी नहीं समझे हैं, तो मैं आपको दिखाऊंगा कि कैसे +++--+--निर्माण होता है 1

Program   | Counter | Memory
----------------------------
          |  0      | 0
+         | +1      | 1
++        | +2      | 3
+++       | +3      | 6
+++-      | -1      | 5
+++--     | -2      | 3
+++--+    | +1      | 4
+++--+-   | -1      | 3
+++--+--  | -2      | 1

कार्य

  • आप इनपुट के रूप में एक सकारात्मक पूर्णांक लेंगे, या तो कार्यात्मक तर्क के रूप में या एसटीडीआईएन से।
  • फिर, आप उपरोक्त विधि का उपयोग करके उस संख्या को बनाने के लिए आवश्यक कीस्ट्रोक्स की न्यूनतम संख्या को आउटपुट / प्रिंट करेंगे।

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

चूंकि पुनर्संरचना +या -रन एक ही नंबर देता है, ऐसे प्रत्येक समूह के लिए केवल लेक्सिकोग्राफिक रूप से प्रारंभिक अनुक्रम सूचीबद्ध है।

Input | Output | Possible corresponding sequences
-------------------------------------------------
    4 |      5 | -+++-
    6 |      3 | +++
    9 |      5 | ++++-
   11 |      7 | +++-+++
   12 |      7 | +++++--, ++++-++
   19 |      8 | -++++++-
   39 |     12 | +++++++++---
   40 |     13 | +++++++++---+, ++++++++-+++-
   45 |      9 | +++++++++
   97 |     20 | ++++++++++++++--+---, +++++++++++++-++++--, ++++++++++++-++++++-
  361 |     34 | ++++++++++++++++++++++++++-+++-+++

अतिरिक्त संसाधन

स्कोरिंग

यह । बाइट्स जीत में सबसे कम समाधान।


9
इसका मतलब यह है ... आप कीबर्ड हैं?
बुसुकुआन

मुझे लगता है कि आप 10 परीक्षण मामलों के साथ अब ठीक हैं (मेरे सहित)।
एग्रीकल्चर आउट

@ ΥριΈνσταντόποςλο 12 12 परीक्षण मामले को थोड़ा संशोधन के साथ जोड़ा गया है (चूंकि +++++--यह भी एक विकल्प है, लेकिन मैंने ++-++++तब से हटा दिया है जब से यह बराबर है ++++-++)। मुझे अभी भी एक और मामला मिला है, मैं बाद में जोड़ना चाहूंगा यदि कोई व्यक्ति एक कुशल समाधान के साथ आता है, अगर मैं इसे उत्पन्न करता हूं।
Sp3000

@ Sp3000 मैं ++-++++हटाया नहीं चाहता था। इसके अलावा, यह मेरा संपादन था, आपका नहीं।
एरिक आउटरीक

@ ΥριΈνσταντόποςλο 1 समकक्ष समाधान के प्रत्येक सेट से केवल 1 समाधान सूचीबद्ध है - मैंने सोचा कि यदि सभी न्यूनतम समाधान सूचीबद्ध किए गए थे, तो परीक्षण के मामले अनावश्यक रूप से लंबे होंगे (97 के लिए 40 और 17 समाधान के लिए 6 समाधान हैं)। मैं माफी माँगता हूँ अगर वह इरादा स्पष्ट नहीं था। इसके अलावा आप गायब थे +++++--(या, समतुल्य रूप से --+++++), यही कारण है कि मुझे पहली जगह में संपादित करने की आवश्यकता महसूस हुई।
Sp3000

जवाबों:


2

अजगर 2, 119 बाइट्स

def g(n,i=0,s=''):
 c=x=t=0
 for d in s:C=int(d)*2-1;t=(c==C)*t+1;c=C;x+=c*t
 return(x==n)*len(s)or g(n,i+1,bin(i)[3:])

बहुत धीमा जानवर-बल दृष्टिकोण। तीसरी पंक्ति एक स्ट्रिंग के स्कोर की गणना करती है x; अन्य पंक्तियों के सभी संभव बाइनरी स्ट्रिंग्स पर लूप जब तक कि एक जिसका स्कोर तर्क के बराबर न हो।

@ लीक से बचा तीन बाइट्स!


s/x==n and len/(x==n)*len/
लीक नून

इससे छुटकारा पाने के लिए कुछ बाइट्स बचा सकते हैं sऔर बस इस तरह के विभाजन को दोहरा सकते हैं, जैसे:def f(n): \n while n>0:print n%2;n/=2
लीक नून

2

पायथ, 25 बाइट्स

ffqyQ.as-Mc*RhdY2{s.pM./T

इसे ऑनलाइन आज़माएं।

यह अत्यंत अक्षम है, और f(n)calcul 11. के लिए स्मृति से बाहर चलाता है । यह f(22)मेरे लैपटॉप पर लगभग 10 सेकंड में = 10 की गणना करता है ।

व्याख्या

  • 1 से शुरू, संख्याओं के माध्यम से लूप T। ( f)
    • के सभी विभाजन उत्पन्न करें T। ( ./T)
    • उन सभी क्रमपरिवर्तन उत्पन्न करें। ( .pM)
    • सूची को समतल करें। ( s)
    • सूची को विशिष्ट करें। ( {) यह चरण हटाया जा सकता है, लेकिन यह कोड को बहुत तेज़ बनाता है।
    • विभाजन के परिणामी क्रमांक को फ़िल्टर करें: ( f)
      • dविभाजन की प्रत्येक संख्या ( *R) को एक से अधिक ( ) से गुणा करें hd। इससे परिणाम को जोड़ने / घटाने के लिए संख्या दोगुनी हो जाती है।
      • लंबाई 2 के कुछ हिस्सों की सूची को काटें ( c2)
      • उन भागों में से किसी भी दूसरी संख्या को दूसरी संख्या से घटाएं। ( -M)
      • परिणाम का योग करें। यह परिणामी संख्या को दोगुना कर देता है यदि विभाजन क्रमांकन को परिवर्धन की संख्या के रूप में व्याख्या की गई थी, तो घटाव आदि।
      • पूर्ण मूल्य लें। ( .a) यदि परिणाम नकारात्मक था, तो परिवर्धन और घटाव को स्वैप करने से सकारात्मक परिणाम मिलता है।
      • जांचें कि परिणाम डबल इनपुट के बराबर है या नहीं। ( qyQ) इस मामले में पार्टीशन परमीशन सही है, इसे वापस करें।
    • यदि फ़िल्टर ने कोई परिणाम दिया, तो लंबाई का एक समाधान था T। लौटकर प्रिंट करें T

2

MATL , 43 29 बाइट्स

E:"@TFEqZ^!"@Y'tQ**s]vGE=a?@.

यह स्मृति है- और समय-अक्षम। ऑनलाइन कंपाइलर 45केवल इनपुट तक संभाल सकता है ।

इसे ऑनलाइन आज़माएं!

यहां सभी परीक्षण मामलों के साथ एक संशोधित संस्करण है 40(ऑनलाइन संकलक में लगभग एक मिनट लगता है)।

व्याख्या

जब तक एक वैध अनुक्रम नहीं मिलता है, तब तक प्रत्येक लंबाई के सभी संभव कुंजी-प्रेस अनुक्रमों की जांच करता है।

E:       % Range [1 2 ... 2*N] where N is implicit input. The required sequence length is
         % less than 2*N, so this is enough
"        % For each
  @      %   Push current value: length of sequence
  TFEq   %   Push array [1 -1]
  Z^     %   Cartesian power. Gives all possible sequences of 1, -1 of that length
  !      %   Transpose. Each sequence is now a row
  "      %   For each sequence
    @    %     Push current sequence
    Y'   %     Run-length decoding: Pushes an array of values 1 and -1, and then an
         %     array of run-lengths
    tQ*  %     Duplicate, add 1, multiply. Gives twice the triangular number for each run
    *    %     Multiply element-wise by 1 or -1 to produce correct sign
    s    %     Sum of array. This is the number produced by the current sequence
  ]      %   End for
  v      %   Concatenate all numbers into an array
  GE=a   %   True if any of those numbers equals twice the input
  ?      %   If so
    @    %     Push current sequence length. This is the final result
    .    %     Break loop
         %   End if
         % End for
         % Implicit display

@ Sp3000 मैंने एक भी जोड़ा है, इसलिए, संदर्भ के लिए, क्रम में 4, 6, 9 और 19 परीक्षण मामले हैं।
आउटगोल्फर को एरिक करें

1

पायथन, 105 100 बाइट्स

एक अक्षम चौड़ाई-पहली खोज का उपयोग करता है।

def k(n):
 m=t=l=0;h=[]
 while m-n:o=1-2*(t>0);(m,t,l),*h=h+[(m+t-o,t-o,l+1),(m+o,o,l+1)]
 return l
  • h एक कतार के रूप में उपयोग की जाने वाली सूची है
  • m सूची के प्रमुख पर अनुक्रम का मूल्य है
  • t अंतिम संख्या को जोड़ा गया है m
  • l अनुक्रम की लंबाई है जो उत्पन्न हुई m
  • o +/- 1 है, साइन इन साइन के विपरीत है t

संपादित करें: लीक नन ने पांच बाइट का मुंडन किया।


s/m,t,l,h=0,0,0,[]/m=t=l=0,h=[]/
लीक नन

s/while m!=n/while m-n/
लीक नन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.