+ और * का उपयोग करके नंबर पाने के लिए लोगों की संख्या ज्ञात करें


28

परिचय

आपका लक्ष्य उन लोगों की कम से कम संख्या का पता लगाना है जिन्हें आपको इनपुट मूल्य प्राप्त करने के लिए एक साथ जोड़ना या गुणा करना है, यह A005245 है

इनपुट

एक सकारात्मक पूर्णांक एन

उत्पादन

N पाने के लिए सबसे छोटी संख्या जिसे जोड़ा / गुणा किया जाना चाहिए ।

नमूना इनपुट

7

नमूना आउटपुट

6

व्याख्या

( 1+ 1+ 1) * ( 1+ 1) + 1= 7

क्योंकि इसके लिए 6लोगों की आवश्यकता होती है, आउटपुट है6

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

 1  1
 2  2
 3  3
 5  5
10  7
20  9
50 12

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



9
प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! पहली चुनौती के रूप में यह ठीक है, लेकिन अगली बार चुनौतियों को पोस्ट करने से पहले सैंडबॉक्स का उपयोग करें ताकि आपको प्रतिक्रिया मिल सके!
betseg

4
मेरा सुझाव है कि इसे स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है कि आप न्यूनतम संख्या की तलाश कर रहे हैं। अन्यथा, बस मूल संख्या को आउटपुट करना और यह दावा करना कि यह उन लोगों की संख्या है जिन्हें आपको एक साथ जोड़ना होगा एक वैध समाधान होगा।
झबरा

2
क्या ऐसे उदाहरण हैं जहां f(x) != x.primeFactorisation().sum()1 को छोड़कर?
२०:२२ पर २

1
@jrtapsell: हाँ। $ F (7) = 6 $ का दिया गया उदाहरण एक है। किसी भी (बड़े पर्याप्त) प्राइम $ p $ के लिए आप $ p-1 को फ़ैक्टर कर सकते हैं और एक जोड़ सकते हैं। आप अभी तक बेहतर करने में सक्षम हो सकते हैं।
रॉस मिलिकन

जवाबों:


17

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

f=lambda n:min([n]+[f(j)+min(n%j*n+f(n/j),f(n-j))for j in range(2,n)])

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

वैकल्पिक संस्करण, 59 बाइट्स (असत्यापित)

f=lambda n:min([n]+[f(j)+f(n/j)+f(n%j)for j in range(2,n)])

यह कम से कम n = 1,000,000 तक काम करता है, लेकिन मुझे अभी तक यह साबित नहीं करना है कि यह सभी सकारात्मक n के लिए काम करता है ।

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


क्षमा करें यदि मैं कुछ सरल याद कर रहा हूं, लेकिन यह स्पष्ट नहीं है कि यह हर व्यवहार्य अभिव्यक्ति ट्री की कोशिश करता है। विशेष रूप से, हमारे पास बाहरी परत n=a*j+bहै b<j, लेकिन क्या हमें आवश्यकता हो सकती है b>=j?
xnor

हम्म, यह केवल असफल होगा अगर दोनों b>=jऔर b>=a। लेकिन आप सही हैं, यह स्पष्ट नहीं है कि ऐसा नहीं होगा।
डेनिस

दिलचस्प है कि 1,000,000 तक कोई प्रतिपक्ष नहीं है, मुझे आश्चर्य है कि अगर यह वास्तव में हमेशा काम करता है। एक प्रतिरूप के लिए मेरा सबसे अच्छा विचार सभी योग अभिव्यक्तियों के a*b+c*dसाथ कुछ रूप होगा a,b,c,dऔर बहुत कुशल हैं।
23

10

जेली , 16 14 बाइट्स

2 बाइट्स बचाने के लिए धन्यवाद डेनिस!

ÆḌḊ,Ṗ߀€+U$FṂo

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


तर्क की व्याख्या

एक नंबर n दिया :

  • यदि यह है 1, तो इसका उत्तर है 1। अन्यथा:

प्रतिनिधित्व a + bया तो है a × b, या जहां aऔर bअभिव्यक्ति हैं।

के सभी संभव मूल्यों पर विचार करें aऔर b:

  • यदि प्रतिनिधित्व है a + b, तो aऔर bसीमा में हैं [1 .. n-1]
  • यदि प्रतिनिधित्व है a × b, aऔर bसे nबड़े के उचित विभाजन हैं 1

दोनों मामलों में, सूची [[<proper divisors of n larger than 1>], [1, 2, ..., n-1]]की गणना की गई है ( ÆḌḊ,Ṗ), प्रत्येक नंबर पर वर्तमान लिंक को मैप करें ߀€, सही जोड़े को एक साथ जोड़ें ( +U$) और न्यूनतम मान प्राप्त करें ( FṂo)।

कोड स्पष्टीकरण

ÆḌḊ,Ṗ߀€+U$FṂo   Main link. Assume n = 10.
ÆḌ       Proper divisors. [1,2,5]equeue, remove the first element. [2,5]
   ,Ṗ    Pair with op. Auto convert n = 10 to range 
         [1,2,3,4,5,6,7,8,9,10] and remove the last element
         10, get [1,2,3,4,5,6,7,8,9].

߀€      Apply this link over each element.
   +U$   Add with the Upend of itself.

FṂ       Flatten and get the inimum element.
  o      Logical or with n.
         If the list is empty, minimum returns 0 (falsy), so logical or
         convert it to n.

5

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

f=n=>n<6?n:Math.min(...[...Array(n-2)].map((_,i)=>Math.min(f(++i)+f(n-i),n%++i/0||f(i)+f(n/i))))

बहुत ही अक्षम; Array(n>>1)एक बाइट की कीमत पर इसे थोड़ा गति दें। स्पष्टीकरण: n%++iगैर शून्य है अगर i, एक कारक नहीं है तो n%++i/0है Infinity(और इसलिए truthy, और यह भी निश्चित रूप से कम से कम नहीं) करता है, तो iएक कारक नहीं है, लेकिन NaN(और इसलिए falsy) यदि iएक कारक है। संपादित करें: @ edc65 से प्रेरणा के साथ 12 बाइट्स सहेजे गए।


मैंने यह देखने के लिए पृष्ठभूमि में इसे चलाने की कोशिश की कि क्या यह वास्तव में गणना करने में सक्षम है f(50)लेकिन दुर्भाग्य से विंडोज अपडेट ने समाप्त होने से पहले मेरे पीसी को रिबूट कर दिया।
नील

क्या आपने किसी सरणी पर एक बार चलने की कोशिश की?
edc65

@ edc65 क्षमा करें, लेकिन मैं स्पष्ट नहीं कर रहा हूं कि आप क्या सुझाव दे रहे हैं और क्यों।
नील

मुझे 2 नक्शे दिखाई दे रहे हैं, हर एक aसरणी को स्कैन कर रहा है । क्या आप 2 लैम्ब्डा में मूल्यांकन को मर्ज नहीं कर सकते हैं और मिनट ले सकते हैं?
edc65

@ edc65 आह हाँ, किसी कारण से मैंने सोचा था कि घोंसला बनाना मिन सस्ता नहीं होगा, लेकिन मुझे (i+=2)एक और के साथ प्रतिस्थापित करना है ++iइसलिए मैं कुल 12 बाइट बचा रहा हूँ, धन्यवाद!
नील

5

परी / जीपी , 66 बाइट्स

डेनिस के पायथन जवाब का एक बंदरगाह :

f(n)=vecmin(concat(n,[f(j)+min(n%j*j+f(n\j),f(n-j))|j<-[2..n-1]]))

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


परी / जीपी , 72 बाइट्स

लंबा, लेकिन अधिक कुशल:

f(n)=if(n<6,n,vecmin([if(d>1,f(d)+f(n/d),1+f(n-1))|d<-divisors(n),d<n]))

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


1
डेनिस ने अपने तरीके में सुधार किया और इसका उपयोग करके आप 11 बाइट्स बचा सकते हैं f(n)=vecmin(concat(n,[f(j)+f(n\j)+f(n%j)|j<-[2..n-1]])):।
जोनाथन एलन


3

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

def F(N,n,s="",r=""):
 try:
	if n<1:return(eval(s)==N)*0**(`11`in s or"**"in s)*s
	for c in"()+*1":r=F(N,~-n,s+c)or r
 except:r
 return r
f=lambda N,n=1:F(N,n).count(`1`)or f(N,-~n)

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


@ pizzapants184 मुख्य कार्य fगुमनाम नहीं होना चाहिए, क्योंकि यह खुद को पुनरावर्ती कहता है।
जोनाथन फ्रीच

आह, क्षमा करें, मैंने वह नहीं देखा।
pizzapants184

2

वोल्फ्राम भाषा (गणितज्ञ) , 59 बाइट्स

मार्टिन एंडर की बदौलत 3 बाइट्स बचाए। CP-1252 एन्कोडिंग का उपयोग करना, जहां ±एक बाइट है।

±1=1;±n_:=Min[1+±(n-1),±#+±(n/#)&/@Divisors[n][[2;;-2]]]

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


2
का उपयोग ±करने के बजाय fबचत होती है 3 बाइट्स स्रोत मानते हुए सीपी 1252 में एन्कोड किया गया है: tio.run/##y00syUjNTSzJTE78///QRkNbQ@tDG/PirWx9M/...
मार्टिन Ender

1
इनपुट 353942783 के लिए सही ढंग से काम नहीं करता है।
मिशा लावरोव

1

पर्ल 5 , -पी 78 बाइट्स

पुरानी शैली की गिनती में 79 बाइट्स (के +1लिए -p)

तथ्य यह है कि perl $सभी स्केलर का उपयोग करने के लिए एक अतिरिक्त का उपयोग करना चाहिए वास्तव में गोल्फ की लंबाई दर्द होता है कि अंकगणित का एक बहुत कुछ ...

यह विधि ज्यादातर पहले से पोस्ट किए गए अन्य लोगों की तरह है (लक्ष्य संख्या बनाने के लिए गुणा और जोड़ के लिए प्रयास करें, सबसे सस्ता लें)। हालांकि यह बार-बार नीचे नहीं आता है, इसलिए इसका उपयोग अपेक्षाकृत बड़े इनपुट के लिए किया जा सकता है।

यह अतिरिक्त या बहु संख्या द्वारा निर्माण की लागत को कम करने का प्रयास भी नहीं करता है [lication क्योंकि perl 5 में कोई अंतर्निहित minऔर संख्यात्मक प्रकार नहीं है looooooong है (जैसा कि कोड में अभी भी देखा गया है)। इसके बजाय मैं सिर्फ यह मानता हूं कि यदि कोई संख्या लक्ष्य का एक कारक है जिसे मैं गुणा का उपयोग करूंगा। यह तब से सुरक्षित है जब जैसे 3कि एक कारक है 12(इसलिए यह लूप की लागत को कम करता है ) 3और 12/3बाद में लूप में विचार 9=12-3करेगा जो कि एक कारक नहीं होगा, इसलिए 9+3उसी लागत के साथ जो 3+9भी आजमाया जाएगा। हालांकि <= 4यह लक्ष्य के लिए विफल हो सकता है (यह केवल करता है 1और 2)। $_फिक्स को कम करने के लिए सूची में जोड़ना । जो दुर्भाग्यपूर्ण है क्योंकि मुझे वास्तव में आधार मामलों के लिए इसकी आवश्यकता नहीं है क्योंकि मैं पहले से ही आरंभ कर रहा हूं@; उचित शुरुआती मूल्यों के साथ इसलिए इसकी कीमत 3 बाइट्स है।

#!/usr/bin/perl -p
($_)=sort{$a-$b}$_,map{$;[$_]+$;[$'%$_?$'-$_:$'/$_]}//..$_ for@;=0..$_;$_=pop@

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

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