अंकों का उत्पाद


10

किसी दिए गए धनात्मक पूर्णांक संख्या N के लिए, न्यूनतम प्राकृतिक M को खोजने के लिए एक पूर्ण प्रोग्राम लिखें, जैसे कि M के अंकों का गुणन N. N, 1,000,000,000 से कम है। यदि कोई M मौजूद नहीं है, तो -1 प्रिंट करें। आपके कोड को किसी भी मामले में 10 सेकंड से अधिक नहीं लेना चाहिए।

Sample Inputs
1
3
15
10 
123456789
32
432
1296

Sample Outputs
1
3
35
25
-1
48
689
2899

4
1देना 1एक महत्वपूर्ण परीक्षण मामला है।
पीटर टेलर

1
आपको अधिक जटिल मामलों को जोड़ना चाहिए, जैसे तीन मैंने नीचे उपयोग किया है: 32, 432, 1296। जब तक आप कोडर के लिए एक अभ्यास के रूप में नहीं छोड़ते।
मेलमोकब

@ एस-मार्क 26, एह। सबसे छोटी संख्या।
fR0DDY

मेरा मानना ​​है कि हमें मज़े के लिए 387420489 (9 ^ 9) और 1000000000 का भी परीक्षण करना चाहिए।
asoundmove

2
क्योंकि यह एक पुराना सवाल है और ओपी निष्क्रिय है, यह भविष्य के पदों के लिए सिर्फ एक नोट है: "10 सेकंड" वर्तमान मानक (किस मशीन पर?) के अनुसार अस्पष्ट है
user202729

जवाबों:


4

गोल्फस्क्रिप्ट, ४५ ४३ ४० चार्ट

~9{{1$1$%!{\1$/1$}*}12*(}8*>{];-1}*]$1or

ऐसे संस्करण को प्रतिस्थापित करता है, जो छोटे primes को शक्तियों में समूहित नहीं करता है और ऐसा करते समय 8 वर्ण बचाता है। नोट: 12 = मंजिल (9 लॉग 10 / लॉग 5)।

आभार: @mellamokb से एक ट्रिक निकालकर सहेजे गए दो अक्षर; 3 @Nabb से एक संकेत के साथ बचाया।


1
क्या! आप इसे परीक्षण के बिना गोल्फस्क्रिप्ट लिख सकते हैं? +1, ठीक लग रहा है, 123456789 को छोड़कर, इसकी मशीन पर 1 मिनट से अधिक समय लगता है और मैंने इस प्रक्रिया को मार दिया है। 12345मुझे -1 दें, तो हो सकता है कि 123456789अगर मैं लंबे समय तक इंतजार कर सकता हूं तो इसके लिए भी काम करना चाहिए ।
आप

@ S.Mark, धन्यवाद। लगता है कि मैं भोली कारक एल्गोरिथ्म के साथ दूर नहीं जा सकता।
पीटर टेलर

@Peter: अधिक जटिल मामलों के लिए गलत उत्तर देता है। ३२ -> २२२२२, ४. होना चाहिए। ४३२ -> २२२२३३३, ६. ९ होना चाहिए। १२ ९ ६ -> २२२२३३३३, २. ९९ होना चाहिए। इत्यादि
म्लेच्छम

@ ममलमोक, अच्छी बात है। मुझे लगता है कि मुझे फिर से लिखना और परीक्षण करना होगा।
पीटर टेलर

वाह, 17 अक्षर कम। मुझे एक बेहतर एल्गोरिथ्म चाहिए, योग्य!
मेलमोकब

6

जावास्क्रिप्ट ( 84 78 76 74 72 70 68)

n=prompt(m="");for(i=9;i-1;)n%i?i--:(m=i+m,n/=i);alert(n-1?-1:m?m:1)

http://jsfiddle.net/D3WgU/7/

संपादित करें: अन्य समाधान, और छोटे आउटपुट तर्क से उधार इनपुट / आउटपुट विचार।

संपादित करें 2:for लूप में अनावश्यक ब्रेसिज़ को हटाकर 2 चार्ट सहेजे गए ।

संपादित 3: बयान के whileरूप में लूप को फिर से लिखना द्वारा 2 वर्ण सहेजे गए ।ifi++

4 संपादित करें: चारों ओर घूमने और संचालन को कम करके 2 चार्ट सहेजे गए i

5 संपादित करें: यदि कथन को 2 और वर्णों को सहेजने वाले टर्नरी प्रारूप में परिवर्तित करें

संपादित करें 6:i-- टर्नरी के सच्चे हिस्से में ले जाकर 2 वर्णों को बचाएं , निकालें ++i


आपने केवल फ़ंक्शन के लिए वर्ण गिने हैं। क्या यह पूरा कार्यक्रम है? क्या आप इसे यहाँ पर निष्पादित कर सकते हैं ideone.com
fR0DDY

1
ऐसा लगता है कि उनके द्वारा लिंक किए गए ideone पर spidermonkey के साथ जावास्क्रिप्ट के समान इनपुट है - ideone.com/samples#sample_lang_112
आप

@ fR0DDY: ठीक है, अब यह एक पूरा कार्यक्रम है :)
mellamokb

मैंने अंततः 69 पात्रों को मेरा कम कर दिया, लेकिन आप अब भी उसी तरह के विचार और promptचीज़ के साथ कर सकते हैं ।
Ry-

m?m:1=>m||1
l4m2

4

जावास्क्रिप्ट, 88 72 78 74 69 68

के लिए (रों = '', मैं = 2, मी = एन = शीघ्र (); मैं <मीटर; मैं ++), जबकि {अगर (i ((एन% i)!)> 9) {चेतावनी (-1), ई ( )} n / = मैं की + = मैं} चेतावनी (रों)
4 अक्षर लंबे, लेकिन वास्तव में एक निष्पादन योग्य स्क्रिप्ट (एक फ़ंक्शन के विपरीत)।

संपादित करें: अन्य जावास्क्रिप्ट से विचारों का उपयोग करना, मैं इसे इस तक कम कर सकता हूं:

for(s='',i=9,n=prompt();i>1;i--)for(;!(n%i);n/=i)s=i+s;alert(n-1?-1:s?s:1)

आखिरकार! 69-वर्ण समाधान, लूप के लिए केवल 1 का उपयोग करता है;)

for(s='',i=9,n=prompt();i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s:1)

ठीक है, एक अल्पविराम से मुंडा।

for(i=9,n=prompt(s='');i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s:1)

GolfScript समाधान के रूप में एक ही समस्या। इनपुट्स 32, 432, और 1296 पर विफल रहता है। एक कारण है कि मैं 9 पर शुरू होता हूं और पीछे की ओर जाता हूं, और बाएं के बजाय दाएं से समतल करता हूं।
मेलामोकब

इनपुट 1 के लिए भी विफल रहता है। 1. संभाल करने के लिए एक विशेष मामला बनाना है।
मैलामोकब

मैंने "न्यूनतम" भाग को याद किया, बदल दिया।
Ry-

@ मिनिटेक: फिर भी इनपुट '1' के लिए काम नहीं करता है। योग्य, हमारे उत्तर लगभग समान हैं :-)
mellamokb

आह, यह आपके मुकाबले 2 पात्रों को छोटा बनाने में कामयाब रहा! : D
Ry-

4

awk ( 63 61 59 58 57)

{for(i=9;i>1;$1%i?i--:($1/=i)<o=i o);print 1<$1?-1:o?o:1}

हम केवल एक इनपुट के लिए प्रोग्राम बुला रहे हैं। शुद्धता की जांच के लिए कई इनपुट दिए गए हैं।
fR0DDY

3

पर्ल (75) (72)

$ d = शिफ्ट; नक्शा {$ m = $ _। $ m, $ d / = $ _ जब तक $ d% $ _ उल्टा 2..9? प्रिंट $ d-1? -1: $ m || 1

मेलमोकब के जावास्क्रिप्ट कोड से प्रेरित; एक पैरामीटर के साथ चलाने का मतलब है


क्या यह छोटा नहीं होगा यदि आप एक पैरामीटर के बजाय स्टडिन का उपयोग करते हैं?
asoundmove

3

गोल्फस्क्रिप्ट ( 60 57)

~[{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+\9>[-1]@if$

~{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+$\9>-1@if

संपादित करें

ठीक है, मुझे लगता है कि यह संस्करण अब हर मामले के लिए सही आउटपुट देता है :-)

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

पीटर के सुझावों के अनुसार प्रति 3 वर्णों को काट दिया गया।


जिस कारण से मैंने ऊपर टिप्पणी की 1, 1वह एक महत्वपूर्ण परीक्षण मामला है कि यह एक बुरा विशेष मामला है - केवल वह संख्या जिसके लिए अंक 1आउटपुट में दिखाई देता है। और यह आपके कोड को तोड़ता है, मुझे डर है।
पीटर टेलर

यह 9. से अधिक के अपराधों से विभाज्य संख्या के लिए भी टूट जाता है
पीटर टेलर

@ पेटर: ठीक है, फिर से कोशिश करो। मुझे लगता है कि यह संस्करण अब सभी परीक्षण मामलों के लिए काम करता है।
मेलमोकब

लगता है, हाँ। आप एक चरित्र को सीधे हटाकर उस पहले को हटा सकते हैं [- यदि आपके पास [स्टैक पर नहीं है जब आप मूल्यांकन करते हैं कि ]यह स्टैक पर सब कुछ लेता है। और आप संभवतः -1एक सरणी में लपेटकर और अंतिम स्थानांतरित करके अंत के पास दो पात्रों को बचा सकते हैं $
पीटर टेलर

@Peter: धन्यवाद, 3 और चार्ट सहेजे गए!
मेलमोकब

3

हास्केल

f n=head([m|m<-[1..10^9],product(map(read.return)$show m)==n]++[-1])

बदलने के (show m)लिए एक चार से दाढ़ी $show m
फ़ूजएक्सएक्सएल

1
यह नहीं होना चाहिए m<-[1..9^9].... अन्यथा यह एक अनंत सूची है ... इसलिए -1कभी नहीं होगा .... मुझे सही करें अगर मैं गलत हूं।
st0le

मुझे नहीं लगता कि यह 10secs के भीतर काम कर सकता है ....
st0le


2

पर्ल (68)

$x=pop;map{$_-=11;$x/=$_,$@=-$_.$@until$x%$_}1..9;print!$x?-1:$@||1

यह भयानक चाल की तरह लगता है कि @mellamokb नेस्टेड लूप से बचने के लिए जावास्क्रिप्ट में उपयोग करता है ताकि पर्ल को अच्छी तरह से अनुवाद किया जा सके लेकिन यह बहुत अधिक क्रिया से निकलता है क्योंकि आप foreachस्टाइल लूप का उपयोग किसी भी समय नहीं कर सकते हैं । यह भी अफ़सोस की बात है कि पर्ल को नहीं लगता mapहै कि कोई और लूप redoकाम आएगा।


2

scala 106 वर्ण:

def p(n:Int,l:Int=9):List[Int]=if(n<=9)List(n)else
if(l<2)List(-1)else
if(n%l==0)l::p(n/l,l)else
p(n,l-1)

परीक्षण और मंगलाचरण:

scala> val big=9*9*9*8*8*8*7*7*7*5*3 
big: Int = 1920360960

scala> p(big)                        
res1: List[Int] = List(9, 9, 9, 8, 8, 8, 7, 7, 7, 5, 3)

प्रतिक्रिया समय: तुरंत, 2Ghz सीपीयू पर <1s।


2

जेली , 18 13 10 बाइट्स

×⁵RDP$€io-

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

13-बाइट समाधान:

×⁵RDP$€iµ’¹¬?

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

इनपुट के साथ स्पष्टीकरण N:

׳R              create a range from 1 to N * 100 (replace ³ with ⁵ for a faster execution time)
   DP$           define a function ($) to get the product of the digits of a number,
      €          apply that function to each element in the list,
       iµ        get the index of the input N in the list (or 0 if it's not there), and yeild it as the input to the next link,
         ’¹¬?    conditional: if the answer is 0, then subtract one to make it -1, otherwise, yeild the answer

18-बाइट समाधान:

D×/
×⁵RÇ€i
Ç⁾-1¹¬?

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

D×/        product of digits function, takes input M
D          split M into digits,
 ×/        reduce by multiplication (return product of digits)

×⁵RÇ€i     range / index function
×⁵R        make a range from 1 to N*10,
   ǀ      run the above function on each of the range elements,
     i     get the index of N in the result, or 0 if it's not there

Ç⁾-1¹¬?    main function:
Ç    ¬?    run the line above and check if the answer is null (0)
 ⁾-1       if it is, return "-1",
    ¹      otherwise, return the answer (identity function).

अंतिम लिंक केवल 0 को बदलने के लिए है (जेली का डिफ़ॉल्ट गलत मूल्य, क्योंकि सभी सूचियां एक-अनुक्रमित हैं) -1 के साथ। यदि आप 0 को एक ठीक गलत मान मानते हैं, तो प्रोग्राम 8 बाइट्स है


1
कुछ नोट: (1) आप प्रत्येक सहायक लिंक का उपयोग केवल एक बार करते हैं, इसलिए सहायक लिंक बनाने का कोई कारण नहीं है। बस का उपयोग करें $ƊƲµ। (2) जैसा कि आउटपुट के समय स्ट्रिंग -1और संख्या -1समान होती है, संख्या का उपयोग करके 2 बाइट्स बचाता है। (3) के Pलिए आशुलिपि है ×/। (4) इनपुट के लिए विफल 3125
user202729

@ user202729 बहुत बहुत धन्यवाद! मैंने (1), (2), और (3) को लागू किया और उन्होंने 6 बाइट्स बचाए! अगर मैंने I को If में बदल दिया, तो इसने इनपुट 3125 पर काम किया लेकिन काफी विलंब के बाद। क्या आप जानते हैं कि कोई बेहतर (और छोटा) तरीका है, या मेरा दृष्टिकोण (जो मुझे पता है कि निश्चित रूप से समय-जटिलता के मामले में सबसे तेज़ नहीं है) उतना ही अच्छा होगा जितना यह मिलेगा?
हैरी

1
मुझे लगता है कि _¬$काम करना चाहिए’¹¬?
dylnan

1
o-और भी छोटा है।
user202729

@dylnan धन्यवाद - मैंने देखा कि क्योंकि µमैं सिर्फ 2 बाइट्स बचाए बिना उपयोग कर सकता था $! लेकिन तब मुझे एहसास हुआ कि o-मैं µपूरी तरह से चूक सकता हूं और 3 बाइट बचा सकता हूं !
हैरी


0

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

f=lambda n,a=0,u=1,i=9:n<2and(a or 1)or-(i<2)or n%i<1and f(n/i,a+i*u,u*10)or f(n,a,u,i-1)

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

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

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