मॉड्यूलर SNUSP में एक संख्या का सबसे छोटा प्रतिनिधित्व प्राप्त करें


10

पृष्ठभूमि

कई गूढ़ प्रोग्रामिंग भाषाओं में संख्याएं शाब्दिक रूप से नहीं होती हैं, इसलिए आपको उन्हें रनटाइम पर गणना करना होगा; और इनमें से कई मामलों में, संख्या प्रतिनिधित्व काफी दिलचस्प हो सकता है। हमारे पास पहले से ही अंडरलोड के लिए संख्याओं का प्रतिनिधित्व करने के बारे में एक चुनौती है । यह चुनौती मॉड्यूलर एसएनयूएसपी में संख्याओं का प्रतिनिधित्व करने के बारे में है । (ध्यान दें कि इस चुनौती को पूरा करने के लिए आपको SNUSP सीखने की आवश्यकता नहीं है - आपके लिए आवश्यक सभी जानकारी विनिर्देश में है - लेकिन आपको पृष्ठभूमि दिलचस्प लग सकती है।)

काम

इस चुनौती के प्रयोजन के लिए, एक मॉड्यूलर SNUSP संख्या एक स्ट्रिंग में बाहर का गठन है @, +और =इसके अलावा कि अंतिम वर्ण कोई है, #है, और उस अंत से पहले चरित्र होना चाहिए +या =(यह नहीं हो सकता है @)। उदाहरण के लिए, मान्य नंबर शामिल @+#, ==#और @@+@=#; अमान्य नंबर के उदाहरणों में शामिल हैं +=, @@#, और +?+#

एक मॉड्यूलर SNUSP संख्या के मूल्य की गणना निम्नानुसार की जाती है:

  • # का मान 0 है (यह बेस केस है)।
  • यदि संख्या में =xकिसी भी स्ट्रिंग के लिए फॉर्म है x, तो इसका मान मूल्य के बराबर है x
  • यदि संख्या में +xकोई स्ट्रिंग है x, तो इसका मान xप्लस 1 के मान के बराबर है ।
  • यदि @cxकिसी एकल वर्ण cऔर किसी स्ट्रिंग के लिए संख्या का रूप है , तो xइसका मान, के मान के बराबर xहै cx

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

स्पष्टीकरण

  • यह पूरी तरह से संभव है कि एक ही मान के साथ एक से अधिक स्ट्रिंग होंगे, और विशेष रूप से, कुछ पूर्णांकों के लिए उस मान के साथ सबसे छोटे मॉड्यूलर SNUSP संख्या के लिए एक टाई होगी। ऐसे मामले में, आप किसी भी संख्या को शामिल कर सकते हैं जिसमें टाई शामिल है।
  • नंबर खोजने के लिए आपके द्वारा उपयोग किए जाने वाले एल्गोरिथ्म पर कोई प्रतिबंध नहीं है; उदाहरण के लिए, ब्रूट-फोर्सिंग स्ट्रिंग्स और उनका मूल्यांकन करना एक कानूनी रणनीति है, लेकिन खोज स्थान को कम करने के लिए ऐसा कुछ चतुर कर रहा है।
  • PPCG पर हमेशा की तरह, आपका सबमिशन पूर्ण प्रोग्राम या फ़ंक्शन हो सकता है (जो भी आपकी भाषा में अधिक संक्षिप्त हो)।
  • यह इनपुट और आउटपुट फॉर्मेट को हैंडल करने के बारे में समस्या नहीं है, इसलिए आप किसी नॉन-नेटिव पूर्णांक को इनपुट करने और एक स्ट्रिंग को आउटपुट करने के लिए किसी भी उचित साधन का उपयोग कर सकते हैं। नहीं है मेटा पर एक पूर्ण गाइड है, लेकिन सबसे अधिक इस्तेमाल किया कानूनी तरीकों समारोह तर्क / रिटर्न, आदेश पंक्ति तर्क, और मानक इनपुट / मानक आउटपुट शामिल हैं।

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

यहां पहले कुछ नंबरों के सबसे छोटे निरूपण हैं:

  • 0 :#
  • 1 :+#
  • 2 :++#
  • 3 : +++#या@++#
  • 4 : ++++#या +@++#या@=++#
  • 5 : @+++#या@@++#
  • 6 : +@+++#या +@@++#या @=+++#या @=@++#या@@=++#
  • 7 : @++++#या@+@++#
  • 8 : @@+++#या@@@++#
  • 9 : +@@+++#या +@@@++#या @+++++#या @++@++#या @+@=++#या @@=+++#या@@=@++#
  • 10 : @=@+++#या @=@@++#या @@@=++#( यह जांच करने के लिए एक महत्वपूर्ण परीक्षण मामला है , क्योंकि सभी संभावित उत्तर शामिल हैं =)
  • 11 : @+@+++#या @+@@++#या @@++++#या@@+@++#
  • 12 : +@+@+++#या +@+@@++#या +@@++++#या +@@+@++#या @=+@+++#या @=+@@++#या @=@=+++#या @=@=@++#या @=@@=++#या @@=++++#या @@=+@++#या@@=@=++#
  • 13 : @@@+++#या@@@@++#
  • 14 : +@@@+++#या +@@@@++#या @=@++++#या @=@+@++#या @@+++++#या @@++@++#या@@+@=++#
  • 15 : @+@++++#या @+@+@++#या @@=@+++#या @@=@@++#या @@@=+++#या@@@=@++#

एक बड़ा परीक्षण का मामला है, इनपुट से उत्पादन 40 होना चाहिए @@@=@@+++#, @@@=@@@++#, @@@@=@+++#, या @@@@=@@++#

विजय की स्थिति

एक के रूप में चुनौती, विजेता कम से कम प्रविष्टि, बाइट में मापा जाता है।


1
=के रूप में ही @=सही, हो जाएगा ?
orlp

3
वैसे, इस तरह की चुनौतियां आमतौर पर मेटागॉल्फ के रूप में सबसे अच्छी तरह से पोस्ट की जाती हैं , क्योंकि शायद ही कोई दिलचस्प जवाब होगा (बस सभी संभावित तारों पर स्ट्रिंग और लूप का मूल्यांकन करें)।
orlp

3
@orlp: मैं असहमत हूं, यह चुनौती एक मेटाफॉल्फ के रूप में बहुत आसान होगी, क्योंकि एक इष्टतम जवाब मिलना अपेक्षाकृत आसान है, और मेटागॉल्फ स्कोरिंग पर कोई अन्य प्रतिबंध नहीं लगाता है। मैं यहां अधिकांश उत्तरों की उम्मीद कर रहा हूं कि यह क्रूरतापूर्ण है, लेकिन विनिर्देश इतना जटिल है कि जानवर बल a) कम से कम नहीं हो सकता है, और b) अपने आप में गोल्फ के लिए दिलचस्प होने की संभावना है। यदि आप जीत की स्थिति में बदलाव चाहते हैं, तो संभवत: केवल अन्य दिलचस्प एक सबसे तेज़ कोड है , और यह एक अलग चुनौती के रूप में अधिक समझ में आएगा ।

ब्रेन-फ्लैक के लिए भी हमारे पास कई गोल्फ चैलेंज हैं
केवल

जवाबों:


3

Oracle SQL 11.2, 341 262 बाइट्स

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c,i)AS(SELECT'#',0,0,e,1 FROM e UNION ALL SELECT c||s,DECODE(c,'+',1,'@',p,0)+v,v,e,i+1 FROM n,e WHERE i<11)CYCLE s SET y TO 1 DEFAULT 0 SELECT s FROM n WHERE:1=v AND rownum=1;

पुराना संस्करण

WITH e AS(SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),n(s,v,p,c) AS(SELECT'#',0,0,e FROM e UNION ALL SELECT s||c,CASE c WHEN'+'THEN 1 WHEN'='THEN 0 WHEN'@'THEN p ELSE 0 END+v,v,e FROM n,e WHERE LENGTH(s)<10)CYCLE s SET y TO 1 DEFAULT 0 SELECT MIN(REVERSE(s))KEEP(DENSE_RANK FIRST ORDER BY LENGTH(s))FROM n WHERE v=:1;

: 1 मॉड्यूलर SNUSP में प्रतिनिधित्व करने के लिए संख्या

अन-गोल्फ:

WITH e AS (SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4),  
n(s,v,p,c,i) AS                   
(
  SELECT '#',0,0,e,1 FROM e
  UNION ALL
  SELECT s||c
       , DECODE(c,'+',1,'@',p,0)+v 
       , v
       , e
       , i+1
  FROM n,e
  WHERE i<11
) CYCLE s SET y TO 1 DEFAULT 0
SELECT s FROM n WHERE:1=v AND rownum=1;

पहले 3 पंक्तियों के साथ एक दृश्य बनाएं, प्रत्येक प्रतीक के लिए एक का उपयोग संख्याओं का प्रतिनिधित्व करने के लिए किया जाता है, माइनस # जो केवल स्ट्रिंग के अंत में उपयोग किया जाता है:

SELECT DECODE(LEVEL,1,'=',2,'@','+')e FROM DUAL CONNECT BY LEVEL<4;    

फिर पुनरावर्ती दृश्य n उन 3 प्रतीकों के साथ हर स्ट्रिंग को संभव बनाता है, उन्हें # तक समेटता है और उनका मूल्यांकन करता है।

पैरामीटर हैं:

s: मॉड्यूलर एसएनयूएसपी संख्या का मूल्यांकन किया जा रहा है
v: पिछली पुनरावृत्ति
p द्वारा गणना किए गए s का दशमलव मान : i-2 पुनरावृत्ति द्वारा गणना की गई
c:
i को समरूप करने के लिए अगला प्रतीक : s की लंबाई, केवल गोल्फ उद्देश्य के लिए दो LENGTH () से छुटकारा पाने की जरूरत है

DECODE(c,'+',1,'@',p,0)+v 

यदि अंतिम प्रतीक + है तो 1 जोड़ें
यदि यह @ है तो i-2 पुनरावृत्ति का मान जोड़ें
प्रतीक या तो # या = है। v को पुनरावर्ती दृश्य के init भाग के साथ 0 से आरम्भ किया गया है, इसलिए नया v किसी भी स्थिति में पिछले v के बराबर है।

WHERE i<11

3 प्रतीकों के साथ संभव हर स्ट्रिंग की गणना की जाती है, यह हिस्सा बीमा करता है कि अनुरोध बड़े क्रंच तक नहीं चलता है।

CYCLE s SET y TO 1 DEFAULT 0

चूंकि तारों के निर्माण के लिए कोई नियम नहीं है, इसलिए डुप्लिकेट उत्पन्न होने के लिए बाध्य हैं। एक पुनरावर्ती दृश्य में होने के कारण ओरेकल उन डुप्लिकेट को चक्र के रूप में व्याख्या करता है और यदि मामले में स्पष्ट रूप से ध्यान नहीं दिया जाता है तो एक त्रुटि फेंक देते हैं।

SELECT s FROM n WHERE:1=v AND rownum=1;

पैरामीटर के रूप में दर्ज दशमलव संख्या का मूल्यांकन करने वाले पहले मॉड्यूलर एसएनयूएसपी प्रतिनिधित्व को लौटाता है: 1

मेरे परीक्षणों में कि पहली पंक्ति हमेशा सबसे छोटी अभ्यावेदन में से एक है।

यदि आपका डेटाबेस उसी तरह कार्य नहीं करेगा, तो उस अंतिम खंड को प्रतिस्थापित किया जाना चाहिए

SELECT MIN(s)KEEP(DENSE_RANK FIRST ORDER BY i)FROM n WHERE:1=v

2

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

n=>eval("for(a=[['#',0,0]];[[s,t,p],...a]=a,t-n;)a.push(['='+s,t,t],['+'+s,t+1,t],['@'+s,t+p,t]);s")

सरल जानवर बल चौड़ाई पहली खोज एल्गोरिथ्म।


40 के लिए यह "@@@@@@@@ ++ #" लौटाता है जो 42 का मूल्यांकन करता है
विज्ञापन छोड़ दें क्योंकि SE EVIL

यहां तक ​​कि 12 के लिए यह "@@@ +++ #" देता है जो 13 का मूल्यांकन करता है
एडिट्स ने छोड़ दिया क्योंकि एसई ईवीआईएल

हम्म, मुझे लगता t<nहै t-nकि काम करने के लिए बदल सकता है ...
नील

2

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

L?b+ytb@[yttb001)Chb0+hfqQyTs^L"+@="UhQ\#

परीक्षण सूट

यह काम किस प्रकार करता है:

इसके दो भाग हैं। एक पुनरावर्ती कार्य जो अनुगामी के बिना एक SNUSP अभिव्यक्ति के मूल्य की गणना करता है #, और एक क्रूर बल दिनचर्या।

Evalutaion:

L?b+ytb@[yttb001)Chb0
L                        Define the function y(b) as follows
 ?b                      If b is nonempty
   +ytb                  The sum of y(tail(b)) and   # tail(b) = b[1:]
   @[       )            The element in the list at location
   Chb                   Character values of the first character.
                         Modular indexing means that 
                         + -> 3
                         @ -> 0
                         = -> 1
                         Index 2 is filler.
    [yttb001)            @ adds y(tail(tail(b)). Tail suppresses the error when
                         called on an empty list, so this treats @# as zero, but
                         this can't lead to problems because removing the @ will
                         always make the expression shorter.
                         + adds 1, = adds 0.
 0                       If b is the empty string, return 0

पाशविक बल:

+hfqQyTs^L"+@="UhQ\#
               UhQ      0 ... Q     # Q is the input
        ^L"+@="         Map that list to all strings formed from the characters
                        "+@=", with that many characters.
       s                Concatenate
  fqQyT                 Filter for strings which evaluate to the input
 h                      Take the first success, which is the shortest due to
                        the order the strings were generated.
+                 \#    Add a '#' and output

1

CJam, 58

ri:M;'#0_]]{_{M&}#_)!}{;{~[2,+1$f+"@=+"\]z\f+\af.+~}%}w=0=

नील के जवाब से थोड़ी प्रेरणा लेकर ब्रूट बल। इसे ऑनलाइन आज़माएं

कुशल संस्करण, १०fficient

ri0"#"a{_{:B\:A={'=A0j+}{A(B={'+B0j+}{AB>{BAB-j_N={'@\+}|}N?}?}?}{;_(0j'+\+a\,1>_W%.{j}Na-'@\f++{,}$0=}?}2j

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

यह डायनेमिक प्रोग्रामिंग का उपयोग करता है।


1

हास्केल , 89 86 बाइट्स

संपादित करें:

  • -3 बाइट्स: ज़िपिंग इंडेक्सिंग से कम थी।

एक और क्रूर बल समाधान जो नील के जवाब से बहुत प्रेरणा के साथ समाप्त हुआ। (हालांकि इसने गोल्फ को पेश करने से पहले इसहाक के पाइथ की तरह अधिक काम किया l।)

f n=[s|(a,_,s)<-l,a==n]!!0
l=(0,0,"#"):[(a+c,a,d:s)|(a,b,s)<-l,(c,d)<-zip[0,1,b]"=+@"]

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

  • f मुख्य कार्य है, जो एक पूर्णांक लेता है और एक स्ट्रिंग लौटाता है।
  • lट्यूपल्स की एक अनंत सूची है (a,b,s), सबसे sपहले कम से कम प्रतिनिधित्व , साथ में उनके मूल्य aऔर bपहले चार छीन के साथ प्रतिनिधित्व का मूल्य । (जैसा कि अन्य ने भी ध्यान दिया / देखा है, बाद के लिए 0 के रूप में व्यवहार करना हानिरहित है #।)
  • lपहले एक के अलावा अन्य तत्वों को एक सूची समझ के साथ पुनरावर्ती रूप से उत्पन्न किया जाता है। dवह चरित्र है जिसे sसूची में एक नया प्रतिनिधित्व उत्पन्न करने के लिए तैयार किया जाना है, और 'c' के लिए इसी वृद्धि है a
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.