केवल 0-9 और चार ऑपरेशन के साथ एक संख्या व्यक्त करें


14

व्याख्या

Befunge एक द्वि-आयामी कार्यक्रम है जो स्टैक का उपयोग करता है ।

इसका मतलब है, 5 + 6 करने के लिए, आप लिखते हैं 56+, जिसका अर्थ है:

56+
5    push 5 into stack
 6   push 6 into stack
  +  pop the first two items in the stack and add them up, and push the result into stack

(to those of you who do not know stacks, "push" just means add and "pop" just means take off)

हालाँकि, जैसा कि आप बुद्धिमानों ने देखा है, हम संख्या को 56सीधे स्टैक में नहीं धकेल सकते हैं ।

ऐसा करने के लिए, हमें 78*इसके बजाय लिखना होगा, जो उत्पाद को गुणा 7और 8स्टैक में धकेलता है।

विवरण

इनपुट को किसी भी प्रारूप में लिया जा सकता है, जिसका अर्थ है कि यह प्रोग्रामर के विवेकानुसार STDIN हो सकता है या नहीं।

इनपुट एक धनात्मक पूर्णांक (शामिल 0या नकारात्मक पूर्णांक के लिए कोई बोनस नहीं ) होगा।

आउटपुट केवल इन वर्णों से युक्त एक स्ट्रिंग 0123456789+-*/होगा : (मैं मोडुलो का उपयोग नहीं करूंगा %।)

लक्ष्य सबसे छोटा स्ट्रिंग ढूंढना है जो इनपुट का प्रतिनिधित्व कर सकता है, ऊपर वर्णित प्रारूप का उपयोग करके।

उदाहरण के लिए, यदि इनपुट है 123, तो आउटपुट होगा 67*99*+। आउटपुट का मूल्यांकन बाएं से दाएं किया जाना चाहिए।

यदि एक से अधिक स्वीकार्य आउटपुट हैं (जैसे 99*67*+कि स्वीकार्य भी है), तो किसी को भी प्रिंट किया जा सकता है (उन सभी को प्रिंट करने के लिए कोई बोनस नहीं)।

आगे की व्याख्या

यदि आपको अभी भी समझ में नहीं आया कि इसका 67*99*+मूल्यांकन कैसे किया जाए 123, तो यहां एक विस्तृत विवरण दिया गया है।

stack    |operation|explanation
          67*99*+
[6]       6         push 6 to stack
[6,7]      7        push 7 to stack
[42]        *       pop two from stack and multiply, then put result to stack
[42,9]       9      push 9 to stack
[42,9,9]      9     push 9 to stack
[42,81]        *    pop two from stack and multiply, then put result to stack
[123]           +   pop two from stack and add, then put result to stack

टी एल; डॉ

कार्यक्रम को सबसे छोटा स्ट्रिंग खोजने की आवश्यकता है जो ऊपर निर्दिष्ट प्रारूप का उपयोग करके इनपुट (संख्या) का प्रतिनिधित्व कर सकता है।

टिप्पणियाँ

यह एक चुनौती है, इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है।

बहुविकल्पी

-या तो किया जा सकता है x-yया y-xप्रोग्रामर के विवेक पर,। हालाँकि, समाधान के भीतर चुनाव लगातार होना चाहिए। इसी तरह के लिए /

नमूना कार्यक्रम

लुआ, 1862 बाइट्स ( इसे ऑनलाइन आज़माएं )

चूँकि मैं लेखक हूँ, इसलिए मैं इसे बिल्कुल नहीं समझूँगा।

स्पष्टीकरण:

This uses the depth-first search method.

गहराई-पहली खोज के बारे में और अधिक: यहाँ

कार्यक्रम:

local input = (...) or 81

local function div(a,b)
    if b == 0 then
        return "error"
    end
    local result = a/b
    if result > 0 then
        return math.floor(result)
    else
        return math.ceil(result)
    end
end

local function eval(expr)
    local stack = {}
    for i=1,#expr do
        local c = expr:sub(i,i)
        if c:match('[0-9]') then
            table.insert(stack, tonumber(c))
        else
            local a = table.remove(stack)
            local b = table.remove(stack)
            if a and b then
                if c == '+' then
                    table.insert(stack, a+b)
                elseif c == '-' then
                    table.insert(stack, b-a)
                elseif c == '*' then
                    table.insert(stack, a*b)
                elseif c == '/' then
                    local test = div(b,a)
                    if test == "error" then
                        return -1
                    else
                        table.insert(stack, a+b)
                    end
                end
            else
                return -1
            end
        end
    end
    return table.remove(stack) or -1
end

local samples, temp = {""}, {}

while true do
    temp = {}
    for i=1,#samples do
        local s = samples[i]
        table.insert(temp, s..'0')
        table.insert(temp, s..'1')
        table.insert(temp, s..'2')
        table.insert(temp, s..'3')
        table.insert(temp, s..'4')
        table.insert(temp, s..'5')
        table.insert(temp, s..'6')
        table.insert(temp, s..'7')
        table.insert(temp, s..'8')
        table.insert(temp, s..'9')
        table.insert(temp, s..'+')
        table.insert(temp, s..'-')
        table.insert(temp, s..'*')
        table.insert(temp, s..'/')
    end
    for i=1,#temp do
        if input == eval(temp[i]) then
            print(temp[i])
            return
        end
    end
    samples = temp
end

बक्शीश

यदि आप कोड लिखने के लिए Befunge (या इसके किसी भी प्रकार) का उपयोग करते हैं तो आपके लिए एक केक ।


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

4
इस की सबसेट ।
Addison Crump

2
मेरे विचारों को चैट से कॉपी करना : "मैंने इसके बारे में सोचा लेकिन मैं तर्क दूंगा कि सबसेट चीजों को बहुत सरल बनाता है क्योंकि 1) कोई हेक्स नहीं, 2) कोई फ्लोट्स नहीं, 3) कोई दोहराव और 4) पॉजिटिव केवल"
Sp3000

1
@CoolestVeto यह पुराने उत्तरों को अमान्य करने के लिए पर्याप्त भिन्न है।
17

1
@CoolestVeto मुझे लगता है कि दूसरी चुनौती को इस के डुप्लिकेट के रूप में बंद किया जाना चाहिए।
mbomb007 21

जवाबों:


4

पायथन 2, 278 बाइट्स

मेरा सबसे अच्छा समाधान, जो हर बार सबसे छोटा जवाब देता है। (लेकिन बहुत धीमी गति से)

def e(c):
 s=[];x,y=s.append,s.pop
 while c:
  d,c=c[0],c[1:]
  if"/"<d<":":x(d)
  else:a,b=y(),y();x(str(eval(b+d+a)))
 return int(y())
def g(v):
 s="0123456789+-*";t=list(s)
 while 1:
  for x in t:
   try:
    if e(x)==v:return x
   except:0
  t=[x+y for x in t for y in s]

पायथन 2, 437 बाइट्स

यह समाधान लंबा है, लेकिन बहुत तेज है (जानवर बल नहीं)। और मुझे पूरा यकीन है, कि यह हमेशा सबसे कम संभव परिणाम देता है।

r=range;l=len;a=input()
def f(n):
 if n<=9:return str(n)
 for d in r(9,1,-1):
  if n%d==0:return f(n/d)+"%d*"%d
 h=sum(map(int,list(str(n))))%9
 return f(n-h)+"%d+"%h
m={x:f(x) for x in r(a*9)}
for b in m:
 if a-b in m and l(m[b])+l(m[a-b])+1<l(m[a]):m[a]=m[a-b]+m[b]+"+"
 if a+b in m and l(m[b])+l(m[a+b])+1<l(m[a]):m[a]=m[a+b]+m[b]+"-"
 if b!=0 and a%b==0 and a/b in m and l(m[b])+l(m[a/b])+1<l(m[a]):m[a]=m[a/b]+m[b]+"*"
print m[a]

2
PPCG में आपका स्वागत है ! आशा है कि आपके पास यहाँ एक अच्छा समय होगा।
लीक नन

1
@pbochinak मुझे लगता है कि मुझे एक वैध मिल सकता है। f(6551)रिटर्न 25*8*9*7+9*8+(13 अक्षर), जबकि 9999***52*-(11 अक्षर) बेहतर है। मेरे स्वयं के evalफ़ंक्शन के ऊपर सत्यापित (प्रश्न में)।
लीक नून

4
@pbochniak खदान से पहले टिप्पणी के रूप में, यह उत्तर इसकी वर्तमान स्थिति में अमान्य है। यह तय करने के दौरान इसे अस्थायी रूप से हटाने की सिफारिश की जाती है (यदि कुछ और नहीं है, तो इसे डाउनवोट्स को आकर्षित करने से रोकने के लिए)।
डेनिस

1
आपका समय बस हो सकता हैwhile c:
Ven

आप ;वेरिएबल्स (जो इंडेंट ब्लॉक्स में बाइट्स को सेव करते हैं), वेन के टिप के लिए अलग-अलग असाइनमेंट का उपयोग कर सकते हैं , प्रतीक और किसी भी चीज़ के बीच व्हाट्सएप से छुटकारा पा tसकते हैं और जा सकते हैं।
कैलक्यूलेटरफलाइन

4

पर्ल, 134 133 132 128 बाइट्स

+5 के लिए -Xlp(2 अतिरिक्त क्योंकि कोड शामिल है ')

STDIN पर लक्ष्य संख्या के साथ चलाएँ:

perl -Xlp befour.pl <<< 123

befour.pl:

@1{1..9}=1..9;$.+=2,map{for$a(%1){"+-*/"=~s%.%"\$1{\$-=$a$&$_/'$1{$a}$1{$_}$&'=~/^.{$.}\$/}||=\$&"%eegr}}%1until$\=$1{$_}}{

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

7 और बाइट्स का त्याग करने से गति कुछ हद तक अधिक मजबूत हो जाती है।

@1{1..9}=1..9;$.+=2,map{for$a(@a){"+-*/"=~s%.%"\$1{\$-=$a$&$_/'$1{$a}$1{$_}$&'=~/^.{$.}\$/}||=\$&"%eegr}}@a=keys%1until$\=$1{$_}}{

लंबाई 11 समाधान के लिए 17 मिनट, लंबाई 13 समाधान के लिए लगभग 5 घंटे। पहले नंबर की लंबाई 15 की आवश्यकता 16622 है जिसमें लगभग 2 दिन लगते हैं। पहले नंबर की लंबाई 17 की जरूरत 73319 है।

ध्यान दें कि यह मान लेता है कि विभाजन 0 की ओर (पूर्णांक 93 विनिर्देशन) को काटकर एक पूर्णांक लौटाता है


डॉलर-संकेत क्या करते हैं? (मैं पर्ल बिल्कुल नहीं बोलता)
लीके नन

1
@KennyLau $स्केलर मान को एक्सेस करता है। जहां अधिकांश भाषाओं में आप लिखते हैं a=4, पर्ल उपयोग करेगा $a=4। लेकिन इसका उपयोग अधिक जटिल चर के अदिश अभिगम के लिए भी किया जाता है। जैसे $a{$b}हैश से नक्शा (नक्शा, शब्दकोश) %aस्केलर मूल्य पर$b
टन हास्पेल

2

सी, 550 545 बाइट्स

#define L strlen
#define y strcpy
#define t strcat
char c[9999][99];i=1,k=3;main(j){for(;i<10;i++)*c[i]=i+'0';for(;k--;){
for(i=1;i<9999;i++)for(j=1;j<=i;j++)*c[i]&&*c[j]&&(i+j>9998||*c[i+j]&&
L(c[i+j])<L(c[i])+L(c[j])+2||t(t(y(c[i+j],c[i]),c[j]),"+"),
i*j>9998||*c[i*j]&&L(c[i*j])<L(c[i])+L(c[j])+2||t(t(y(c[i*j],c[i]),c[j]),"*"));
for(i=9999;--i;)for(j=i;--j;)*c[i]&&*c[j]&&(*c[i/j]&&
L(c[i/j])<L(c[i])+L(c[j])+2||t(t(y(c[i/j],c[i]),c[j]),"/"),
*c[i-j]&&L(c[i-j])<L(c[i])+L(c[j])+2||t(t(y(c[i-j],c[i]),c[j]),"-"));}
scanf("%d",&i);printf("%s",c[i]);}

550 545 बाइट्स के बाद अनावश्यक न्यूलाइन्स को हटाना (सभी पूर्ववर्ती निर्देशों के बाद तीनों न्यूलाइन्स)।

@ केनी लाऊ - यह 1 और 9998 के बीच एक पूर्णांक इनपुट के रूप में प्राप्त कर सकता है, लेकिन मुझे लगता है कि इनपुट की श्रेणी जिसके लिए एक इष्टतम समाधान की गणना की जाती है, 9998 से छोटा है। दूसरी तरफ, दोनों रेंज को बढ़ाया जा सकता है, यदि मेमोरी अनुमति देता है।

प्रोग्राम किसी भी संख्या में 9998 से अधिक स्टैक पर पुश नहीं कर सकता है। (9998 को संशोधित किया जा सकता है।) मैंने प्रोग्राम को एक अलग संस्करण में चलाया, बाहरी लूप (के साथ एक) के लिए iterating जब तक कि किसी भी संख्या के लिए सुधार होता है। 1 और 9998 के बीच (जैसा कि दिक्जस्ट्रा के एल्गोरिदम में है)। तीन पुनरावृत्तियों के बाद कोई सुधार नहीं हुआ है। तो बाइट्स बचाने के लिए, मैंने हार्डकोड k = 3 किया।

सीमा का विस्तार करने के लिए, दो चीजें आवश्यक हैं - स्थिरांक को 9999 और 9998 को संशोधित करना, जब तक कि इसमें सुधार न हो जाए, तब तक इसे सुधारने के लिए बाहरी लूप पर पुनरावृत्तियों की एक चर संख्या के साथ चल रहा है, यह देखने में कितना समय लगता है। निरंतर k = 3 को उस मान में बदलें।


PPCG में आपका स्वागत है ! आशा है कि आपके पास यहाँ एक अच्छा समय होगा।
लीक नन

यह मेरा 6551 परीक्षण पूरी तरह से पास करता है। इस कार्यक्रम की प्रभावी सीमा क्या है?
लीक नन

मेरा मानना ​​है कि यह 9999 है। क्या आप कृपया इस जानकारी को अपने समाधान में जोड़ सकते हैं?
लीक नन

यह 9998. इसके अलावा हो सकता है, आपके द्वारा आरंभ कुछ बाइट्स खा सकते हैं i, jऔर kइससे पहले कि main()
लीक नन

1
@ केनी लाउ - संपादन के लिए धन्यवाद। सीमा का विस्तार करने के बारे में, मैंने देखा कि वास्तव में सीमा का विस्तार करने में थोड़ा अधिक लगता है। मैंने उस जानकारी को उत्तर में शामिल किया।
mIllIbyte

2

पायथन 2, 284 बाइट्स

डिस्क्लेमर: कुछ मूल्यों के लिए हमेशा के लिए टकराना ... लेकिन हमेशा कम से कम स्ट्रिंग वापस करने की गारंटी दी जानी चाहिए, और इसमें कोई कृत्रिम रूप से सीमित सीमा नहीं है ... यहां तक ​​कि नकारात्मक मूल्यों पर भी काम करता है। :)

def f(v):
 i,z=0,'+-*/'
 while 1:
  s=('%x'%i).translate(__import__('string').maketrans('abcd',z),'ef');t=s;q=[];a,p=q.append,q.pop;i+=1
  try:
   while t:
    o,t=t[0],t[1:]
    if o in z:n,m=p(),p();a(eval(`m`+o+`n`))
    else:a(int(o))
   if p()==v and not q:return s
  except:pass

कलन विधि:

  • के साथ शुरू i = 0
  • स्ट्रिंग के हेक्स मान का प्रतिनिधित्व ले लो i, और की जगह abcdके साथ +-*/क्रमशः, और किसी भी हटानेef
  • उपसर्ग संकेतन (RPN) के रूप में स्ट्रिंग को संसाधित करने का प्रयास
  • यदि सफल है, और परिणाम इनपुट मूल्य से मेल खाता है, तो प्रयुक्त स्ट्रिंग वापस लौटाएं।
  • अन्यथा, वृद्धि iऔर पुन: प्रयास करें।

"[t] akes [...] कुछ मूल्यों के लिए हमेशा के लिए" क्या आपने इसका परीक्षण किया है? क्या मूल्य?
लीक नन

@KennyLau मैं सिर्फ एक परीक्षण की गणना की जाती है कि लिखा f(i)से 0 <= i <= 6551(कब्जा करने के लिए 6551मूल्य आप की मूल प्रस्तुत @pbochniak रद्द करने के लिए प्रयोग किया जाता है)। अभी, यह केवल कुछ ही मिनटों के लिए चल रहा है, और यहाँ परीक्षण से अंतिम आउटपुट है: 91 : 49+7* 3.020 s (total 108.174 s, worst 89: 5.827 s) अपडेट - यह सिर्फ मूल्य 92 के साथ समाप्त हो गया है: 92 : 149+7*+ 258.761 s (total 366.935 s, worst 92: 258.761 s)
केन 'जॉय' मोशेर

@ केनीलाऊ: परीक्षण एक घंटे से अधिक समय से चल रहा है, और केवल मूल्य तक 113... यदि आप रुचि रखते हैं तो यहां पूर्ण परीक्षण आउटपुट देखें ...
केन 'जॉय' मोशेर

2

पायथन 2, 182 बाइट्स

n=input()
L=[[[],""]]
while 1:
 s,c=L.pop(0);L+=[[s+[i],c+`i`]for i in range(10)]+(s[1:]and[[s[:-2]+[eval(`s[-2]`+o+`s[-1]`)],c+o]for o in"/+-*"[s[-1]==0:]])
 if[n]==s[-1:]:print c;E

इतनी धीमी गति से, मैंने इसे एक घंटे के लिए इनपुट पर छोड़ दिया है 221और यह अभी भी समाप्त नहीं हुआ है। सुस्ती का एक बड़ा सौदा है, क्योंकि मैं एक चौड़ाई-पहले खोज के लिए एक कतार के रूप में एक सूची का उपयोग कर रहा है, और .pop(0)है O(n)सूचियों के लिए।

L(stack, code to reach stack)जोड़े वाली एक कतार मात्र है । प्रत्येक चरण में, अंकों को हमेशा जोड़ा जाता है, और ऑपरेटरों का प्रदर्शन किया जाता है यदि स्टैक में कम से कम दो तत्व होते हैं। डिवीजन केवल तभी किया जाता है यदि अंतिम तत्व 0 नहीं है, हालांकि मुझे एक मजबूत संदेह है कि विभाजन कभी भी आवश्यक नहीं है (हालांकि मेरे पास इसे साबित करने का कोई तरीका नहीं है, लेकिन मैंने जांच की है कि यह 500 तक का मामला है)।

NameErrorपरिणाम (अंततः) प्रिंट करने के बाद कार्यक्रम समाप्त हो जाता है ।


क्या है ;Eअंत में कर रही?
लीक नुन्

@ केनीलाऊ NameErrorसमाप्ति के लिए है, क्योंकि Eकहीं और परिभाषित नहीं किया गया है
Sp3000

वाह, ऐसी चतुराई।
लीक नुन्

1

CJam, 79

ri:M;A,:s:L;{L2m*{s,Y=},{~:A+AS*~!"/+-*">\f{\+}~}%Y2+:Y;_L@+:L;{S*~M=},:R!}gR0=

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

यह बुरी तरह से अक्षम है, लेकिन पर्याप्त स्मृति और समय दिया गया है, यह अंततः काम करता है। मेमोरी से 16GB के साथ 123 रन, लेकिन 120 और 125 ठीक हैं।


1

पायथ - 35 बाइट्स

पाशविक बल। एक अजीब बात यह है कि नया निहित इनपुट वास्तव में मेरे स्कोर को नुकसान पहुंचाता है क्योंकि यह .vpyth_eval के लिए भी काम कर रहा है ।

.V1IKfqQ.x.v+jd_T\;N^s+"+-*/"UTbhKB

इसे यहाँ ऑनलाइन आज़माएँ


0

पायथन 3, 183 बाइट्स

e,n=enumerate,input()
v=list('0123456789')+[' '*n]*n*2
for i,s in e(v):
 for j,t in e(v):
  for o,k in zip('+*-',(i+j,i*j,i-j)):
   if 9<k<2*n:v[k]=min(v[k],s+t+o,key=len)
print(v[n])

गति पूरी तरह से अनुचित नहीं है (123, 221, 1237, 6551 सेकंड या मिनट के आदेश पर समाप्त)। 9 और बाइट्स की कीमत पर, इसे और अधिक गति ifदेने के लिए बयान बदलना if j<=i and <k<2*n। मैंने विभाजन छोड़ दिया ( /), क्योंकि मैं नहीं देख सकता कि इसकी आवश्यकता कैसे होगी।


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