दी गई संख्या की एक संख्या का पता लगाएं जिसका दशमलव प्रतिनिधित्व द्विआधारी जैसा दिखता है


34

मुझे कोड समीक्षा साइट पर एक सवाल आया है जो दिलचस्प लगता है। मुझे लगता है कि ओपी यह गलत कर रहा है, लेकिन यह सुनिश्चित नहीं किया जा सकता है ... तो चलो उसके लिए इसे हल करें! (एक कार्यक्रम लिखें, एक समारोह / प्रक्रिया नहीं)

इनपुट (स्टडिन या समान):

xदशमलव संकेतन में एक पूर्णांक । यह 1 से अधिक और 2 ^ 31 से कम है।

आउटपुट (स्टडआउट या समान):

yदशमलव संकेतन में एक पूर्णांक । x * yदशमलव प्रतिनिधित्व में उत्पाद में केवल अंक 0 और 1 होना चाहिए। यह न्यूनतम संख्या 0 से अधिक होनी चाहिए।

नोट: आउटपुट सीमित नहीं है - यदि न्यूनतम y10 ^ 100 के आसपास है, तो आपके प्रोग्राम को अपने सभी 100 अंकों का आउटपुट करना होगा (मुझे नहीं पता कि क्या 2 ^ 64, जैसे y- कोई उचित सीमा नहीं है, इसे हल नहीं किया गया है )।

आपका कार्यक्रम उचित समय में समाप्त होना चाहिए (1 सेकंड? 1 घंटा? - कुछ ऐसा ही) सभी xके लिए रेंज में।

बोनस:

यदि आपके प्रोग्राम में इनपुट (RAM को छोड़कर) के आकार की कोई सीमा नहीं है, और बहुपद जटिलता है, तो अपने प्रोग्राम की बाइट संख्या को गुणा 0.8और नीचे करें।


उदाहरण: इनपुट 2; आउटपुट 5, क्योंकि 2 * 5 = 10

उदाहरण: इनपुट 21; आउटपुट 481, क्योंकि 21 * 481 = 10101


अस्वीकरण: मैं कोड समीक्षा साइट पर सवाल के लिए जिम्मेदार नहीं हूं। किसी भी विसंगति के मामले में, केवल उपरोक्त विवरण को उचित युक्ति माना जाना चाहिए।

OEIS A079339


6
यह हमेशा सॉल्व होना चाहिए। स्पष्ट रूप से कम से कम एक q मौजूद होना चाहिए कि n की अनंत संख्या हो जैसे कि 10 ^ n mod x = q। X के ऐसे मानों को लीजिए और संबंधित शक्तियां 10 ^ n में जोड़ दीजिए।
फ़ेरसुम

1
9 के गुणक असामान्य रूप से उच्च परिणाम प्रदान करते हैं।
SuperJedi224

1
संबंधित परियोजना यूलर समस्या , किसी और के लिए जिसने सोचा कि यह प्रश्न परिचित है
Sp3000

1
बहुपद जटिलता से, क्या आप इनपुट के अंकों की संख्या में बहुपद कहते हैं, या इनपुट के मूल्य में बहुपद हैं?
रेटो कोराडी

3
@anatolyg मेरा जानवर बल नहीं है
aditsu

जवाबों:


8

अजगर, 9 बाइट्स

f!-`*TQ10

प्रदर्शन

प्रत्येक एकाधिक के लिए, एक स्ट्रिंग में कनवर्ट करें, 10(इस मामले में पाइथ के आसान इंट का उपयोग करके) में अंकों को घटाएं और फिर तार्किक रूप से परिणाम को नकारात्मक करें, केवल सही मल्टीपल मिलने पर सीच को समाप्त करें।

बोनस समाधान, 10 बाइट्स:

f.xi`*TQ2Z

यह समाधान वास्तव में जांचता है कि क्या संख्या के स्ट्रिंग प्रतिनिधित्व को एक बाइनरी नंबर ( i ... 2) के रूप में माना जा सकता है और इस प्रयास में कोई त्रुटि नहीं होने पर समाप्त हो जाता है।


18

अजगर 2, कुशल समाधान, 99

n=input()
d={n:0}
k=1
while min(d):[d.setdefault((x+k)%n,d[x]+k)for x in set(d)];k*=10
print d[0]/n

कुछ गोल्फ सुझावों के लिए Sp3000 धन्यवाद।

मैं हर किसी को पोस्ट करने के लिए चुनौती देता हूं (अपने स्वयं के उत्तरों में) इनपुट 72या परिणाम के लिए परिणाम प्राप्त करने में कितना समय लगता है 99:) यदि वे वास्तव में तेज़ हैं, तो 79992अगले जैसे कुछ प्रयास करें (अभी भी <1 सेकंड यहां)।

स्पष्टीकरण:

मुझे लगा कि यह आवश्यक नहीं था (चूंकि कोड काफी पठनीय है), लेकिन मुझे एक अनुरोध मिला, इसलिए यहां यह हो गया:

पहला विचार यह है कि एक बाइनरी-लुकिंग नंबर 1 या 10 से अधिक विभिन्न शक्तियों का योग है। इसलिए, हम 10 की विभिन्न शक्तियों को अलग-अलग तरीकों से जोड़ने का प्रयास कर सकते हैं जब तक कि हम शेष 0 न हो जाएं।

यदि हम भोलेपन से ऐसा करते हैं, तो यह सभी बाइनरी-लुकिंग नंबरों को उत्पन्न करने और उनका परीक्षण करने के समान है। लेकिन बहुत सारे अवशेष समान होंगे। एक बेहतर तरीका यह है कि केवल सबसे छोटी संख्या को रिकॉर्ड किया जाए जो एक निश्चित शेष देता है, और क्रमिक रूप से हमने दर्ज की गई संख्याओं में 10 से अधिक शक्तियों को जोड़ा है। यही कार्यक्रम करता है।

dएक शब्दकोष / मानचित्र है जहाँ कुंजियाँ बनी रहती हैं और मान बाइनरी-लुकिंग नंबर होते हैं। प्रारंभिक n:0एक विशेष मामला है: ऐसा माना जाता है कि 0:0हम इसमें शक्तियां जोड़ना शुरू कर सकते हैं, लेकिन कुंजी 0 खोजने पर एल्गोरिथ्म बंद हो जाता है, इसलिए मैंने nइसके बजाय इसका उपयोग किया, जिसकी गारंटी समान प्रभाव है और अन्य मूल्यों के साथ हस्तक्षेप नहीं करना चाहिए।

फिर हम kसभी मौजूदा संख्याओं के लिए 10 (संग्रहीत ) की शक्तियों को जोड़ना और अवशेषों को रिकॉर्ड करना शुरू करते हैं। हम kशेष में जोड़ते हैं : (x+k)%nऔर संख्या में:, d[x]+kऔर इसे रिकॉर्ड करें केवल अगर यह एक नया शेष है: d.setdefault(…)तो अगली शक्ति पर जाएं: k*=10और तब तक दोहराएं जब तक हमें कुंजी 0 नहीं मिलती:while min(d)

अंत में, d[0]बाइनरी-लुकिंग नंबर देता है जिसमें 0 मॉड शेष है n, इसलिए हम इसे nसमाधान प्राप्त करने के लिए विभाजित करते हैं।

नोट: कार्यक्रम को बड़ी संख्या से बचने (10 की शक्तियों के बजाय रिकॉर्डिंग की रिकॉर्डिंग और पिछले मूल्यों से शक्तियों के अवशेषों की गणना) करके और अधिक कुशल बनाया जा सकता है, लेकिन यह कोड गोल्फ है, इसलिए ...

वास्तव में, यहाँ, मैंने एक तेज़ संस्करण लिखा है:

n=input()
d={n:0}
k=1
b=0
while 0not in d:
 for x in list(d):d.setdefault((x+k)%n,b)
 k=(k*10)%n;b+=1
x=10**d[0]
while x%n:x+=10**d[n-x%n]
print x/n

1
मेरा जवाब या तो नहीं मिलता है। xD "खतरनाक, जावा, डिफ़ॉल्ट रूप से BigInteger का उपयोग करने पर Integer.MAX_VALUE की अपनी पसंद को शाप दें!" - हर जावा प्रोग्रामर एवर
एडिसन क्रम्प

@VTCAKAVSMoACE आप लंबे समय का उपयोग क्यों नहीं करते?
aditsu

हम्म। यह एक अतिरिक्त बाइट है, लेकिन ... इसके लायक है। धन्यवाद!
एडिसन क्रम्प

या नहीं। कि वास्तव में गंभीरता से इसे कम कर देता है। धन्यवाद!
एडिसन क्रम्प

1
99 को हल करने के लिए समय: aditsu: 0.001 सेकंड; xnor: 5+ घंटे और यह अभी भी पूरा नहीं हुआ।
user193661

13

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

n=a=input()
while'1'<max(str(a)):a+=n
print a/n

इनपुट नंबर nऔर वर्तमान मल्टीपल ट्रैक करता है a। जब aद्विआधारी जैसा दिखता है, तो अनुपात को आउटपुट करें a/n। यह जाँचने के लिए कि एक संख्या 0's और 1' s से बनी है, हम इसके स्ट्रिंग प्रतिनिधित्व में अधिकतम चार वर्णों की तुलना करते हैं '1'

में समाप्त होने से बचने के str(a)बजाय उपयोग करता `a`है L। दुर्भाग्य से, 'L'से बड़ा है '1'


12

पर्ल, 27 बाइट्स

#!perl -p
1while($_*++$\)=~/[2-9]/}{

शेबबैंग को एक के रूप में गिना जाता है, इनपुट को स्टड से लिया जाता है।

नमूना उपयोग

$ echo 2 | perl dec-bin.pl
5

$ echo 21 | perl dec-bin.pl
481

$ echo 98 | perl dec-bin.pl
112245

पर्ल, 25 बाइट्स

#!perl -p
eval'0b'.++$\*$_||redo}{

@Skmrx द्वारा एक दो बाइट सुधार ।

रेगेक्स के खिलाफ जांच करने के बजाय, यह उत्पाद को द्विआधारी शाब्दिक के रूप में मूल्यांकन करने का प्रयास करता है। असफल होने पर, यह अगले पर जाता है। आमतौर पर octइस उद्देश्य के लिए फ़ंक्शन का उपयोग किया जाएगा, लेकिन यह चुपचाप अमान्य अंकों को ट्रिम कर देता है, जो इस चुनौती में उपयोगी नहीं है।


पर्ल, 40 बाइट्स

#!perl -p
1while($b=sprintf"%b",++$i)%$_;$_=$b/$_

एक अधिक कुशल समाधान। हम बाइनरी अभ्यावेदन पर पुनरावृत्ति करते हैं, उन्हें आधार 10 के रूप में व्याख्या करते हैं, और फिर विभाज्यता की जांच करते हैं। 100 के तहत सभी मूल्यों के लिए रनटाइम्स नगण्य हैं।

नमूना उपयोग

$ echo 72|perl dec-bin.pl
1543209875

$ echo 99|perl dec-bin.pl
1122334455667789

2
अच्छा :) मैंने आज आपके पोस्ट से कुछ नई बातें सीखीं! आपके कोड के माध्यम से पढ़ते हुए, मुझे पहले कोड से बाइट के एक जोड़े को दाढ़ी बनाने का एक तरीका मिला:eval"0b".$_*++$\||redo}{
svsd

लेकिन मुझे लगता है use bigintकि ओपी को समर्थन देने के लिए जिन बड़ी संख्याओं का समर्थन करना अनिवार्य है, उन्हें शामिल करने की आवश्यकता होगी :(
svsd

1
@skmrn शानदार है। मैंने कोशिश की थी oct'0b'.++$\*$_, लेकिन यह चुपचाप अमान्य अंकों को रोक देता है। मैं evalइसके बजाय का उपयोग करने के लिए नहीं सोचा था ।
प्रिमो

11

जावास्क्रिप्ट, 43 बाइट्स

मैंने सोचा था कि यह कम रास्ता खत्म हो गया। यह मूल रूप से y1 तक वृद्धि करता है y * (input number) = (binary-looking number)। जाहिर है काफी अक्षम है।

for(x=prompt(y=0);!+('0b'+x*++y););alert(y)


जावास्क्रिप्ट (अधिक कुशल समाधान), 53 बाइट्स

यह एक yबाइनरी में वृद्धि तक y / (input number) = (number without a remainder)। फिर यह आउटपुट (number without a remainder)

for(x=prompt(y=1);(z=y.toString(2))%x;y++);alert(z/x)


जावास्क्रिप्ट (और भी कुशल समाधान), 76 बाइट्स

यह ऊपर वर्णित पिछली विधियों के दोनों को जोड़ती है। यह yतब तक वेतन वृद्धि की जाँच करता है y * (input number) = (binary-looking number)(जिसका अर्थ है कि आउटपुट है y) या y / (input number) = (number without a remainder)(जिसका अर्थ है कि आउटपुट है (number without a remainder))।

for(x=prompt(y=a=0);!a;a=+('0b'+x*++y)?y:(z=y.toString(2))%x?0:z/x);alert(a)


जब संभव हो तो इसे 1 देना चाहिए (उदाहरण इनपुट: 1)
edc65

@ edc65 फिक्स्ड - बाइट काउंट में कोई बदलाव नहीं!
मामा फन रोल

यह सफारी 9.0 क्रैश। Jussayin '। :)
एडिसन क्रम्प

1
लेकिन यह आउटपुट में छोटी संख्या तक सीमित है। जावास्क्रिप्ट संख्या में सटीकता के 17 अंक हैं, ओपी कुछ बड़ा मांग रहा है (और यह मॉड्यूलर अंकगणित का उपयोग करके किया जा सकता है)
edc65

Protip: इनपुट 72 की कोशिश न करें। फ़ायरफ़ॉक्स 41 15 मिनट के लिए जमा देता है और फिर क्रैश हो जाता है। मुझे इसका कठिन तरीका पता चला।
ETHproductions

9

हास्केल, 72 70 64 60 58 बाइट्स

main=do x<-readLn;print$[y|y<-[1..],all(<'2')$show$x*y]!!0

संपादित करें: @ जान ड्वोरक ने मुझे 4 बाइट बचाने में मदद की।

संपादित करें: @BlackCap ने doनोटेशन पर स्विच करके 2 बाइट्स बचाए । धन्यवाद!


main=print.f=<<readLn
जॉन ड्वोरक

आप एक बाइट को f main=readLn>>= \x->print$[y|y<-[1..],all(<'2')$show$x*y]!!0
inlining

2 वास्तव मेंmain=do x<-readLn;print$[y|y<-[1..],all(<'2')$show$x*y]!!0
ब्लैककैप

@ ब्लेकैप: अच्छा! आपका बहुत बहुत धन्यवाद!
nimi

7

पायथन 2, 67 65 63 60 बाइट्स

a=input();b=1
while set(`a*b`)&set('23456789'):b+=1
print b

5 बाइट के लिए 2 बाइट्स और शेबंग के लिए स्टेटस का धन्यवाद !


1
मुझे लगता है कि आपको प्रारंभ करना होगाb=1
अनातोलीग

2
आप 2 बाइट्स करके शेव कर सकते हैं any(c in`a*b`for c in'23456789')
स्थिति

1
मुझे इस पर यकीन नहीं है लेकिन not c in`a*b`for c in'10'काम करेगा ?
कोल

2
आप अपनी स्थिति को बदलकर 6 बाइट्स बचा सकते हैं set('a*b')&set('23456789')
काडे

2
`एक Lलंबे समय के लिए पैदा करता है और 'L'>'1'
user193661

6

जावास्क्रिप्ट (ईएस 6) 222 250

मनमाने ढंग से सटीक गणित का उपयोग करना (दशमलव अंकों के तार पर काम करना)

इसे थोड़ा और अधिक किया जा सकता है (किया गया), लेकिन मुझे यह तथ्य पसंद है कि यह जेएस मानक संख्या (परिशुद्धता के 17 दशमलव अंक) तक सीमित नहीं है और यह तेज है।

एक EcmaScript 6 अनुरूप ब्राउज़र में नीचे स्निपेट का परीक्षण करें। 9998 तक का समय स्वीकार्य है - 9999 का प्रयास न करें और 999 के साथ धैर्य रखें।

// As a complete program with I/O via popup  
for(n=+prompt(a=[0],q=[t=1]);t;){for(c=1,t=i=0;i<a.length;i++)a[i]=a[i]&c?0:a[i]|c?(c=0,t+=q[i],1):c=0;c&&(a[i]=c,t+=q[i]=q[i-1]*10%n);t%=n}a.reverse().map(a=>(z+=[a],d=z/n|0,z%=n,r||d?r+=d:0),r='',z=0);alert([r,a.join``])

// As a testable function
f=n=>{
  for(a=[0],q=[t=1];t;)
  {
    for(c=1,t=i=0;i<a.length;i++)
      a[i]=a[i]&c?0:a[i]|c?(c=0,t+=q[i],1):c=0
    c&&(a[i]=c,t+=q[i]=q[i-1]*10%n);
    t%=n
  }  
  a.reverse().map(a=>(z+=[a],d=z/n|0,z%=n,r||d?r+=d:0),r='',z=0)
  return [r,a.join``]
}

// Test and timing
out = x => O.innerHTML += x + '\n'

setTimeout(_=>{
;[1,2,10, 21, 23, 98, 72, 9, 99, 999]
.forEach((test,i) => { 
  var t0 = ~new Date  
  var result = f(test)
  out('n='+test+' '+result+' time(ms) ' + (t0-~new Date))
})},100)  
<pre id=O>Timing test cases ...
</pre>

अधिक पठनीय

यह पहला संस्करण है, जिसमें अलग-अलग कार्यों के रूप में मापांक और लंबे विभाजन हैं।

// function M - Modulus with arbitrary precision - a is a string of decimal digits
M = (a, b, q = 1, t = 0, j = a.length) => {
  while (j--) + a[j] ? t += q : 0, q = (q * 10) % b;
  return t % b
}

// function D - Long division with arbitrary precision - a is a string of decimal digits
D = (a, b, r = '', z = 0) => [...a].map(a => (z += a, d = z / b | 0, z %= b, r || d ? r += d : 0)) && r

// Testable function 
f = n => {
  for (i = 0; ++i < 1e7 && (z = M(v = i.toString(2), n)););
  return z ? ['big'] : [D(v, n), v]
}

मुझे यह फ़ायरफ़ॉक्स में काम करने के लिए मिला, लेकिन यह बड़ी संख्या में संभालता नहीं दिखता है, जैसे कि 999
aditsu

मैं एक नया संस्करण पेश कर रहा हूं जो 36 सेकंड में 999 को संभाल सकता है, लेकिन जावास्क्रिप्ट टाइमआउट के साथ 9999 तक पहुंचने की कोई उम्मीद नहीं है (प्रत्येक '9' को 2 ^ 9 (~ 500) समय समाप्त होने की आवश्यकता है)
edc65

@aditsu वह सबसे अच्छा है जो मैं जावास्क्रिप्ट में कर सकता हूं (लेकिन C # में यह काफी समान है)। अविश्वसनीय रूप से आप की एक व्याख्या के लिए प्रतीक्षा कर रहा है अविश्वसनीय एल्गोरिथ्म
edc65

मैंने अब एक स्पष्टीकरण जोड़ा
२१



4

PHP, 50 बाइट्स

while(preg_match('/[^01]/',$argv[1]*++$y));echo$y;

कुछ परीक्षण मामले

1 > 1
2 > 5
12 > 925
21 > 481

1
इस तरह से कुछ बनाने वाला था, यह मेरे दिमाग में आने से भी कम समय के लिए था
मार्टिज़न

4

CJam, 19 17 16 बाइट्स

li:V!{)_V*sAs-}g

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

जानवर बल समाधान, क्रमिक रूप से मूल्यों की कोशिश कर रहा है जब तक कि एक शर्त नहीं मिलती है।

नवीनतम संस्करण एक स्ट्रिंग युक्त बनाने के लिए उपयोग Asकरने के "01"लिए 2 बाइट्स को बचाता है 0और 1, जैसा कि @aditsu द्वारा सुझाया गया है। टिप्पणी में पूर्ण प्रस्तावित समाधान एक और बाइट बचाता है, लेकिन यह मेरा से काफी अलग दिखता है, इसलिए मैं इसे अपने नाम के तहत पोस्ट नहीं करना चाहता था।

और 1 और बाइट @ डेनिस ने बचाई।

स्पष्टीकरण:

li      Get input and convert to int.
:V      Save it in variable V.
!       Negate the value. Since we saved it in V, we don't need it on the stack anymore.
        But we need 0 on the stack as the start value for y. This conveniently
        accomplishes both with a single operator, since the input is guaranteed to be
        larger than 0.
{       Loop over y.
  )       Increment y.
  _       Copy it.
  V*      Multiply with input in variable V.
  s       Convert to string.
  As      Push the string "10", as the number 10 converted to a string .
  -       Remove 0 and 1 digits. This will result in an empty list if there were only
          0 and 1 digits. The empty list is falsy, and will terminate the loop.
}g      End loop.

3
16:li0{1$+_sAs-}g\/
aditsu

धन्यवाद, @aditsu। मैं वास्तव में आपके पूर्ण समाधान को मेरे नाम से कॉपी नहीं करना चाहता था। मैंने Asस्ट्रिंग का निर्माण करने के लिए लिया, क्योंकि यह एक बहुत ही स्थानीय परिवर्तन है, जो कि हेंडसाइट (जो हमेशा बहुत आसान है ...) के बारे में मुझे सोचना चाहिए था।
रेटो कोराडी

1
@RetoKoradi 16 बाइट्स, कम संशोधन: li:V!{)_V*sAs-}gइसके अलावा, 0{)_easi*sAs-}g(15 बाइट्स) जावा दुभाषिया और कमांड लाइन तर्क के साथ काम करता है।
डेनिस

4

अजगर 3 2, 101 76 बाइट्स

-25 बाइट्स @aditsu को धन्यवाद

लगभग @ aditsu के समाधान के रूप में कुशल है

99 -> 0.436 Seconds
72 -> 0.007 Seconds
b,m,n=1,1,input()
while b%n:
 b=int("{0:b}".format(m))
 m+=1
print b/n

बढ़ते क्रम में गुणकों के माध्यम से लूप करने की कोशिश करने के बजाय, मैं उन उत्पादों के माध्यम से लूप करने की कोशिश कर रहा हूं, जो मैं 'बाइनरी' रूप में उत्पन्न कर रहा हूं।


बुरा नहीं है :) 9999 के बारे में क्या?
aditsu

2
कुछ गोल्फ युक्तियाँ: अजगर 2 का उपयोग करें ( n=input()), while b%n:( b1 से आरंभ करें), कोई इंडेंटेशन न करें
aditsu

@aditsu धन्यवाद! 9999 मिमी, ऐसा लगता है कि यह कुछ दिनों के लिए ले जाएगा, अच्छी तरह से ड्राइंग बोर्ड पर वापस जाएँ -_-
Rnet

1
bin(m)[2:]प्रारूप स्ट्रिंग से कम होना चाहिए। डबल असाइनमेंट पर b=m=1कुछ बचाना चाहिए।
प्रिमो

4

जावा, 213 बाइट्स

import java.math.*;class P{public static void main(String[]a){BigInteger b=new java.util.Scanner(System.in).nextBigInteger(),c,d=c=b.ONE;while(!(b.multiply(c)+"").matches("[01]+"))c=c.add(d);System.out.print(c);}}

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

मुट्ठी भर बाइट्स को बचाने के लिए जियोबाइट्स और ypnypn को धन्यवाद।


नमस्ते, आप इसे अपनी मुख्य विधि में कैसे कहेंगे? यह कोशिश कर रहा है लेकिन सफल नहीं हो रहा है
यसिन हज १६'१५ को ०:३

आपको staticसंशोधक को विधि में जोड़ना होगा ।
SuperJedi224

1
प्रश्न कहता है कि समाधान एक पूर्ण कार्यक्रम होना चाहिए, न कि केवल एक फ़ंक्शन।
raznagul

आप 15 के साथ b.ONEऔर !(b.multiply(c)+"")(इसके बजाय toString()) काट सकते हैं ।
ज्योबिट्स

@raznagul: फिक्स्ड।
सुपरजेडी २२४

4

सी, 3675 बाइट्स

कोड गोल्फ के लिए इतनी देर ...

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>

#define min_n 1
#define max_n 10000

unsigned *mod_list; // list of mods to check
unsigned mod_list_length; // number of mods to check
char *graph; // for each mod, the power of 10 that gives it

void BuildGraph(unsigned n)
{
    unsigned mod10 = 10 % n;
    int pow = 1;

    memset(graph, 0, n);
    if (n == 1)
        return;
    mod_list[0] = 0; // mod 0 - no path coming to it yet
    mod_list[1] = 1; // mod 1 - 10^0 coming to it
    mod_list_length = 2;
    while (graph[0] == 0)
    {
        // We are going to change mod_list_length by adding new nodes.
        // This should not affect the set of nodes we check, so save its old value.
        unsigned mod_list_limit = mod_list_length;
        for (unsigned i = 0; i < mod_list_limit; ++i)
        {
            unsigned mod = mod_list[i] + mod10;
            if (mod >= n)
                mod -= n;
            if (graph[mod] == 0 && mod != 1) // new node?
            {
                graph[mod] = pow; // record the power of 10 with which we come to this node
                mod_list[mod_list_length++] = mod; // add it to the list of nodes
                if (mod == 0) // found the path to 0?
                    return; // stop calculating
            }
        }
        mod10 = (unsigned long long)mod10 * 10 % n; // go to next power of 10
        ++pow;
    }
}

void PrintPath(unsigned n, char *out)
{
    // Going to output powers of 10 in descending order
    unsigned mod = 0; // start at node 0
    int prev_pow = graph[mod] + 1; // happens to be an acceptable initialization
    do {
        int pow = graph[mod];
        while (--prev_pow > pow) // output the proper number of 0-digits
            *out++ = '0';
        *out++ = '1'; // output the digit 1, corresponding to current power of 10
        if (pow == 0)
            break;
        unsigned mod10 = 1;
        for (int p = 0; p < pow; ++p)
            mod10 = (unsigned long long)mod10 * 10 % n;
        mod = (mod + n - mod10 % n) % n; // go to the preceding node
    } while (mod != 0);
    while (--prev_pow >= 0) // output the proper number of 0-digits
        *out++ = '0';
    *out++ = 0;
}

// The long division algorithm
void DivideAndPrint(char *product, unsigned n, FILE* file)
{
    unsigned long long temp = 0;
    int print = 0;
    while (*product != '\0')
    {
        temp = temp * 10 + *product++ - '0';
        if (temp >= n)
            print = 1;
        if (print)
        {
            unsigned quotient = (unsigned)(temp / n);
            unsigned remainder = temp % n;
            fputc('0' + quotient, file);
            temp = remainder;
        }
    }
    fputc('\n', file);
    assert(temp == 0); // if not divisible, there is a bug somewhere
}

void Calc(unsigned n, FILE* file)
{
    char result[99];
    BuildGraph(n);
    PrintPath(n, result);
    DivideAndPrint(result, n, file);
}

int main(int argc, char* argv[])
{
    unsigned n;

    if (argv[1])
    {
        FILE* file = fopen(argv[1], "wt");
        mod_list = calloc(max_n, sizeof(int));
        graph = calloc(max_n, 1);
        clock_t before = clock();
        for (n = min_n; n <= max_n; ++n)
        {
            Calc(n, file);
        }
        clock_t after = clock();
        fprintf(stderr, "Time: %f\n", (after - before) / (double)CLOCKS_PER_SEC);
    }
    else
    {
        scanf("%u", &n);
        mod_list = calloc(n, sizeof(int));
        graph = calloc(n, 1);
        Calc(n, stdout);
    }
}

बिना कमांड लाइन के मापदंडों के साथ चलाएं - यह से प्राप्त nहोता है stdinऔर परिणाम को आउटपुट करता है stdout। एक फ़ाइल नाम के साथ चलाएँ - यह n = 1...10000उस फ़ाइल के लिए परिणाम लिखता है , और समय को मापता है।

1 ... 10000: 140 एमएस के लिए प्रदर्शन

यह कोड गति के लिए C में लागू किए गए aditsu द्वारा प्रस्तावित एल्गोरिथ्म का उपयोग करता है । मैंने इसे गोल्फ के लिए कोई प्रयास नहीं किया, इसलिए कोड को पढ़ना आसान होगा।

मैंने std::mapखोज के परिणामों को रिकॉर्ड करने के लिए C ++ में इसे पहले लागू किया था, और यह धीमा था। हालांकि, mapलगातार पूर्णांक की कुंजियाँ हैं (मैं उन्हें modएस कहता हूं , क्योंकि वे संख्याओं का प्रतिनिधित्व करते हैं n), इसलिए किसी सरणी का उपयोग करना स्वाभाविक है - इसलिए मैंने इसे सी में लिखा।

एक अतिरिक्त अनुकूलन मानचित्रण के मूल्यों की चिंता करता है - प्रत्येक के लिए एक बड़ा पूर्णांक संचय करने से बचने के लिए mod, मैं वहां केवल 10 की सबसे बड़ी शक्ति संग्रहीत करता हूं - यह केवल पिछले तक जाने के लिए पर्याप्त जानकारी है mod। तो सरणी वास्तव में एक खोज ट्री / ग्राफ़ है। जब खोज सामने आती है mod = 0, तो पेड़ के नोड्स को जड़ तक वापस ट्रेस करना , अवरोही क्रम में 10 की शक्ति देता है।

चूंकि खोज आमतौर पर जल्दी से रुक जाती है, केवल नोड्स के एक छोटे से हिस्से के साथ, मुझे सक्रिय नोड्स की एक सूची की आवश्यकता है। यह mod_listलंबाई के साथ एक सरणी के रूप में लागू किया गया है mod_list_length

कुछ रनटाइम आँकड़े (16 जीबी रैम के साथ एक मशीन पर, जो बड़े के लिए महत्वपूर्ण लगता है n, क्योंकि कार्यक्रम 5nमेमोरी के बाइट्स आवंटित करता है :

  • इनपुट 99999999- 2 सेकंड
  • इनपुट 999999999- 27 सेकंड (परिणाम है 111111111222222222333333333444444444555555555666666666777777777888888889- संभवतया 32-बिट पूर्णांक के लिए संभव सबसे बड़ा परिणाम)
  • इनपुट 2147483647- 26 सेकंड (परिणाम है 4661316525084584315813)
  • इनपुट 1999999998- 52 सेकंड (संभवत: 32-बिट पूर्णांक के लिए संभवतया सबसे लंबा रन समय)

2
मैं समझता हूं कि आप इनाम के बाद हैं, लेकिन फिर भी यह एक कोड-गोल्फ प्रश्न है, और साइट के नियमों के लिए आपको अपना कोड गोल्फ करने के लिए कुछ प्रयास करने की आवश्यकता होती है ।
पीटर टेलर

आपके प्रोग्राम में 3546 बाइट्स हैं।
aditsu

@aditsu I ने विंडोज में बाइट काउंट को मापा, जो CR / LF शैली का उपयोग करता है
अनातोली

4

C ++ 11, कई बाइट्स, बहुत तेज, वाह (1999999998 पर 1.5 s, 1… 10000 पर 0.2 s)

(नीचे दिया गया पायथन संस्करण)

हम एक अवधारणा के साथ शुरू करते हैं, जो कुछ हद तक एडिट्स के समाधान के समान है, जहाँ हम n चरणों में पहुंचकर मॉड्यूलर अवशेषों के संग्रह का निर्माण करते हैं। लेकिन जब तक हम शेष 0 नहीं पाते हैं, तब तक प्रतीक्षा करने के बजाय, हम दो पाए गए अवशेषों की जांच करते हैं और बी ऐसा है कि a · 10 ^ n + b = 0. यह मिलने-बीच का दृष्टिकोण खोज पेड़ की गहराई को आधा कर देता है, इसलिए यह है बड़े इनपुट पर बहुत तेजी से और बहुत कम मेमोरी का उपयोग करता है।

कुछ बेंचमार्क:

$ echo 99999999 | \time ./decbin
1111111122222222333333334444444455555555666666667777777788888889
0.18user 0.01system 0:00.20elapsed 99%CPU (0avgtext+0avgdata 69360maxresident)k
0inputs+0outputs (0major+16276minor)pagefaults 0swaps
$ echo 999999999 | \time ./decbin
111111111222222222333333333444444444555555555666666666777777777888888889
1.22user 0.04system 0:01.27elapsed 100%CPU (0avgtext+0avgdata 434776maxresident)k
0inputs+0outputs (0major+37308minor)pagefaults 0swaps
$ echo 2147483647 | \time ./decbin
4661316525084584315813
0.00user 0.00system 0:00.01elapsed 72%CPU (0avgtext+0avgdata 5960maxresident)k
0inputs+0outputs (0major+1084minor)pagefaults 0swaps
$ echo 1999999998 | \time ./decbin
555555556111111111666666667222222222777777778333333333888888889444444445
1.42user 0.08system 0:01.50elapsed 100%CPU (0avgtext+0avgdata 544140maxresident)k
0inputs+0outputs (0major+38379minor)pagefaults 0swaps
$ \time ./decbin 10000.out
0.19user 0.00system 0:00.20elapsed 100%CPU (0avgtext+0avgdata 3324maxresident)k
0inputs+264outputs (0major+160minor)pagefaults 0swaps

कोड:

#include <algorithm>
#include <boost/iterator/transform_iterator.hpp>
#include <fstream>
#include <list>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

using namespace boost;
using namespace std;

static inline bool cmp_first_partnered(pair<int, pair<int, int>> a,
                                       pair<int, pair<int, int>> b) {
  return a.first < b.first;
}
static inline bool eq_first_partnered(pair<int, pair<int, int>> a,
                                      pair<int, pair<int, int>> b) {
  return a.first == b.first;
}

static pair<int, int> retrace(int modulus, int place, pair<int, int> state,
                              list<vector<int>>::iterator i,
                              list<vector<int>>::iterator j, string &ret) {
  if (i == j)
    return state;
  state = retrace(modulus, (place * 10LL) % modulus, state, next(i), j, ret);
  int remainder = state.first;
  long long k = state.second * 10LL;
  if (!binary_search(i->cbegin(), i->cend(), remainder)) {
    remainder = ((long long)remainder + modulus - place) % modulus;
    k += 1;
  }
  int digit = k / modulus;
  if (digit != 0 || ret.size())
    ret += '0' + digit;
  return make_pair(remainder, k % modulus);
}

static void mult(int modulus, int x, int y,
                 vector<pair<int, pair<int, int>>>::iterator i,
                 vector<pair<int, pair<int, int>>>::iterator j) {
  if (y - x == 1) {
    for (auto k = i; k != j; k++)
      k->first = (k->first * 10LL) % modulus;
    return;
  }

  int z = (x + y) / 2;
  vector<pair<int, pair<int, int>>>::iterator k = lower_bound(
      i, j, make_pair(int(((long long)modulus * z + 9) / 10), make_pair(0, 0)));
  mult(modulus, x, z, i, k);
  mult(modulus, z, y, k, j);
  inplace_merge(i, k, j,
                [](pair<int, pair<int, int>> a, pair<int, pair<int, int>> b) {
                  return make_pair(a.first, a.second.second) <
                         make_pair(b.first, b.second.second);
                });
}

static string go(int modulus) {
  if (modulus == 1)
    return "1";

  int sequence = 1;
  list<vector<int>> v = {{0}};
  vector<pair<int, pair<int, int>>> partnered;
  int place = 1;
  while (true) {
    v.emplace_back(v.rbegin()->size() * 2);
    vector<int> &previous = *next(v.rbegin()), &current = *v.rbegin();

    auto offset = [modulus, place, sequence](int a) {
      return (a + (long long)place) % modulus;
    };
    auto old_mid =
        lower_bound(previous.cbegin(), previous.cend(), modulus - place),
         new_mid = lower_bound(previous.cbegin(), previous.cend(), place);
    current.resize(
        set_union(new_mid, previous.cend(),
                  make_transform_iterator(previous.cbegin(), offset),
                  make_transform_iterator(old_mid, offset),
                  set_union(previous.cbegin(), new_mid,
                            make_transform_iterator(old_mid, offset),
                            make_transform_iterator(previous.cend(), offset),
                            current.begin())) -
        current.begin());

    int place2 = modulus - (long long)place * place % modulus;
    auto offset_partnered = [modulus, place, place2,
                             sequence](pair<int, pair<int, int>> a) {
      return make_pair((a.first + (long long)place2) % modulus,
                       make_pair((a.second.first + (long long)place) % modulus,
                                 sequence + a.second.second));
    };
    auto old_mid_partnered =
        lower_bound(partnered.cbegin(), partnered.cend(),
                    make_pair(modulus - place2, make_pair(0, 0))),
         new_mid_partnered = lower_bound(partnered.cbegin(), partnered.cend(),
                                         make_pair(place2, make_pair(0, 0)));
    vector<pair<int, pair<int, int>>> next_partnered(partnered.size() * 2 + 1);
    auto i =
        set_union(partnered.cbegin(), new_mid_partnered,
                  make_transform_iterator(old_mid_partnered, offset_partnered),
                  make_transform_iterator(partnered.cend(), offset_partnered),
                  next_partnered.begin(), cmp_first_partnered);
    if (new_mid_partnered == partnered.cend() ||
        new_mid_partnered->first != place2)
      *i++ = make_pair(place2, make_pair(place, sequence));
    next_partnered.resize(
        set_union(new_mid_partnered, partnered.cend(),
                  make_transform_iterator(partnered.cbegin(), offset_partnered),
                  make_transform_iterator(old_mid_partnered, offset_partnered),
                  i, cmp_first_partnered) -
        next_partnered.begin());
    partnered.swap(next_partnered);

    sequence += previous.size();

    place = (place * 10LL) % modulus;

    mult(modulus, 0, 10, partnered.begin(), partnered.end());
    partnered.resize(
        unique(partnered.begin(), partnered.end(), eq_first_partnered) -
        partnered.begin());

    auto with_first = [](int a) { return make_pair(a, make_pair(a, 0)); };

    vector<pair<int, pair<int, int>>> hits;
    set_intersection(partnered.cbegin(), partnered.cend(),
                     make_transform_iterator(current.cbegin(), with_first),
                     make_transform_iterator(current.cend(), with_first),
                     back_inserter(hits), cmp_first_partnered);

    if (hits.size()) {
      pair<int, pair<int, int>> best = *min_element(
          hits.begin(), hits.end(),
          [](pair<int, pair<int, int>> a, pair<int, pair<int, int>> b) {
            return a.second.second < b.second.second;
          });
      string ret = "";
      pair<int, int> state =
          retrace(modulus, 1, make_pair(best.second.first, 0), v.begin(),
                  prev(v.end()), ret);
      retrace(modulus, 1, make_pair(best.first, state.second), v.begin(),
              prev(v.end()), ret);
      return ret;
    }
  }
}

int main(int argc, const char *argv[]) {
  ios_base::sync_with_stdio(false);
  if (argc >= 2) {
    ofstream ofs(argv[1]);
    for (int modulus = 1; modulus <= 10000; modulus++)
      ofs << go(modulus) << '\n';
  } else {
    int modulus;
    cin >> modulus;
    cout << go(modulus) << '\n';
  }
  return 0;
}

पायथन, 280 बाइट्स (PyPy के साथ 1999999998 पर 8.6 सेकंड)

n=input()
if n<2:print 1;exit()
d={0:0}
l=[]
k=1
b=x=y=0
while 1:
 for a in[0]+l:
  m=(a+k)%n
  if m not in d:l.append(m);d[m]=b
 k=(k*10)%n;b+=1
 for a in l:
  if(-k*a)%n in d:
   while(a-x)%n:x+=10**d[(a-x)%n]
   while(-y-k*a)%n:y+=10**d[(-y-k*a)%n]
   print(10**b*x+y)/n;exit()

2
मैं समझता हूं कि आप इनाम के बाद हैं, लेकिन फिर भी यह एक कोड-गोल्फ प्रश्न है, और साइट के नियमों के लिए आपको अपना कोड गोल्फ करने के लिए कुछ प्रयास करने की आवश्यकता होती है ।
पीटर टेलर

1
@PeterTaylor, बहुत अच्छी तरह से, मैंने पायथन में एक गोल्फ संस्करण जोड़ा।
एंडर्स केसरग

3

गणितज्ञ 115 बाइट्स

p=Drop[Union[FromDigits/@Flatten[Table[Tuples[{0,1},{k}],{k,2,12}],1]],2];
i=Input[];FirstCase[p,x_/;Divisible[x,i]]

3

जावा 156 बाइट्स

public class P{public static void main(String[]a){long x=Long.valueOf(a[0]),y;for(y=2;!(""+x*y).replaceAll("1|0","").isEmpty();y++);System.out.println(y);}}

बड़े पैमाने पर धन्यवाद के लिए धन्यवाद :)


आपको एक स्थान की आवश्यकता नहीं है [], बाद में भी yहो सकता longहै, आप x*y+""2 कार्यक्रम में चाल भूल गए , isEmptyलंबाई की जांच करने के ;बजाय उपयोग करें, इसके बजाय का उपयोग करें{}
11

वैसे भी, कोड गोल्फ में आपका स्वागत है :)
11

मुझे कहना होगा, मैं प्रभावित हूं, लेकिन y longबनाने से कोड कम नहीं होगा
जोबा

हाँ यह होगा: long x=…,y;
aditsu

y1 से शुरू करनी चाहिए, आप घोषणा में यह प्रारंभ कर सकते हैं, अपने वर्ग सार्वजनिक होने की जरूरत नहीं है, और आप ले जा सकते हैं y++करने के लिए x*y(भाग x*y++)
9

2

पायथ - 12 11 बाइट्स

पहले प्राकृतिक संख्या को पूरा करने के लिए संख्यात्मक arg के साथ फ़िल्टर का उपयोग करता है जो कि विधेय को पूरा करता है, डिफ़ॉल्ट 1 है जो हम चाहते हैं। सेटिस्फ़र केवल ज़ीरोस और वाले की जाँच करने के लिए अलग है।

f!-j*QT10U2

टेस्ट सूट


स्ट्रिंग में कनवर्ट करें और निकालें "01। एक चार बचाता है।
जकुबे १६'१५ को ४:३०

2

आर, 45 बाइट्स

x=scan();y=2;while(grepl("[2-9]",x*y))y=y+1;y

उपयोग:

> x=scan();y=2;while(grepl("[2-9]",x*y))y=y+1;y
1: 2
2: 
Read 1 item
[1] 5
> x=scan();y=2;while(grepl("[2-9]",x*y))y=y+1;y
1: 21
2: 
Read 1 item
[1] 481
> x=scan();y=2;while(grepl("[2-9]",x*y))y=y+1;y
1: 42
2: 
Read 1 item
[1] 2405

2

जावा, 198 193 181 बाइट्स

5 बाइट शेविंग करने और टेस्टेबल नंबरों की सीमा बढ़ाने के लिए @aditsu का शुक्रिया!

ध्यान दें कि कुछ मान नकारात्मक रूप से लूप करते हैं कि जावा कैसे पूर्णांक बनाता है। यह BigInteger द्वारा दरकिनार किया जा सकता है, लेकिन बोनस केवल कम मूल्यवान था।

मुझे पता है कि मैं जीतने वाला नहीं हूं, लेकिन मुझे उम्मीद है कि यह अन्य, छोटे, जवाबों को प्रेरित करेगा।

वर्ग A {सार्वजनिक स्थैतिक शून्य मुख्य (String [] a} {for (long i = 1 ;; i ++) {try {long b = Long.parseLong (a [0]); if (b * i <0) break; Long.parseLong (b * i + "", 2); System.out.println (i);} पकड़ (अपवाद e) {}}}}

Ungofled:

कक्षा {
   सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] ए) {
      for (long i = 1 ;; i ++) {// अनंत लूप 1 पर शुरू
         {// यदि बाइनरी के रूप में पार्स करने का प्रयास करके कोई त्रुटि दी गई है, तो 1 से i जोड़ते हुए पुनः आरंभ करें
            long b = Long.parseLong (एक [0]); // बाद के लिए - यह दो बार उपयोग की तुलना में घोषित करने के लिए छोटा था
            अगर (ख * मैं <0) को तोड़ने; // यदि हमने लूप किया है तो प्रोग्राम से बाहर हो जाएं।
            Long.parseLong (ख * मैं + "", 2); // बाहर गुणा करें और देखें कि क्या यह बाइनरी नंबर के रूप में पास करने योग्य है, अन्यथा, त्रुटि फेंकें और लूप के शीर्ष पर वापस जाएं
            Println (ख); // इसे मुद्रित करें
         } कैच (अपवाद e) {} // कैच पर कुछ न करें
      }
   }
}

2
यह मजाकिया है जो इससे Longछोटा है Integer:)
अनातोली

3
वहाँ सबसे शाब्दिक विडंबना है।
एडिसन क्रम्प

2

सी, 107 101 बाइट्स ( 32-बिट्स के लिए 105 99 बाइट्स)

कोड गोल्फ पर C में उत्तरों की एक अलग कमी है। वास्तव में, C सबसे छोटा संभव प्रोग्राम लिखने के लिए सबसे अच्छा विकल्प नहीं है, लेकिन यह उतना बुरा नहीं है:

main(d,b){char s[9];gets(s);for(b=atoi(s);sprintf(s,"%d",b*d),strspn(s,"01")[s];d++);printf("%d",d);}

आप बिना #includes के कर सकते हैं, लेकिन तब फ़ंक्शन की सभी परिभाषाएँ निहित होंगी। मुख्य दोष यह है कि यह इस धारणा का कारण बनता है कि सभी फ़ंक्शन ints को लौटाते हैं। यह उन कार्यों के लिए 64-बिट मशीनों पर एक समस्या है जो वास्तव में एक पॉइंटर लौटाते हैं। यदि आप 32-बिट मशीन पर हैं, तो 2 बाइट्स उपरोक्त समाधान से मुंडा जा सकता है:

main(d,b){char s[9];for(b=atoi(gets(s));sprintf(s,"%d",b*d),strspn(s,"01")[s];d++);printf("%d",d);}

कुछ अधिक पठनीय संस्करण:

int main()
{
  char s[9];
  gets(s);
  int d = 1;
  int b = atoi(s);
  for (; sprintf(s, "%d", b * d), strspn(s, "01")[s]; d++);
  printf("%d", d);
}

2

5 सेकंड (1 से 10000) के पास C # समय

जैसा कि अनुरोध किया गया है, यहां मूल चुनौती का जवाब देते हुए एक गोल्फ सी # कार्यक्रम है। कमांड लाइन तर्क के रूप में इनपुट, कंसोल के लिए आउटपुट।

using System;using System.Collections.Generic;using System.Numerics;using System.Linq;
class P{static void Main(string[] a){int m,n=int.Parse(a[0]);var d=new Dictionary<int,long>();long b;int h;
for(d[n]=0,b=h=1;;b*=2,h=(h*10)%n)foreach(int k in d.Keys.Reverse())if(!d.ContainsKey(m=(h+k)%n)){
var w=d[k]|b;if(m==0){Console.Write(BigInteger.Parse(Convert.ToString(w,2))/n);return;}d.Add(m,w);}}}

फिर, इनाम के रूप में: इनाम को एडिट्स में जाना चाहिए, क्योंकि मुझे लगता है कि उनके एल्गोरिदम को परफ्यूम के मामले में नहीं हराया जा सकता है। लेकिन अनातोलीग स्व-उत्तर भी आश्चर्यजनक है।

यहाँ C # में मेरा तेजी से कार्यान्वयन है। मुझे लगता है कि सी ++ में यह तेज हो सकता है (शायद 2x)। विजुअल स्टूडियो 2010, .NET फ्रेमवर्क 4, 64 बिट्स के साथ संकलित और परीक्षण किया गया, आउटपुट को nul पर पुनर्निर्देशित किया गया। समय: 00: 00: 05.2604315

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Numerics;
using System.Diagnostics;

class Program
{
   static BigInteger Find(int n)
   {
      var d = new Dictionary<int, long>();
      long kb;
      int km;
      d[n] = 0;
      for (kb = km = 1; ; kb *= 2, km = (km * 10) % n)
      {
         foreach (int key in d.Keys.Reverse())
         {
            int m = (km + key) % n;
            if (!d.ContainsKey(m))
            {
               long w = d[key] | kb;
               if (m == 0)
               {
                  return BigInteger.Parse(Convert.ToString(w, 2));
               }
               d.Add(m, w);
            }
         }
      }
   }

   static void Exec(int n, out string sq, out string sa)
   {
      var v = Find(n);
      sq = (v/n).ToString();
      sa = v.ToString();
   }  

   static void Main(string[] args)
   {
      // string n = Console.ReadLine();
      int limit = int.Parse(args[0]);
      string q ="", a = "";
      Stopwatch x = new Stopwatch();
      x.Start();
      for (int n = 1; n <= limit; n++)
      {
         Exec(n, out q, out a);
         Console.WriteLine("{0} {1} {2}", n, q, a);
      }
      x.Stop();
      Console.Error.WriteLine("{0}", x.Elapsed);
   }
}

टाइम्स 4.1s। मुझे इनाम में याद आती है। PyPy के नवीनतम संस्करण के साथ, aditsu का तेज संस्करण लगभग 8 गुना है, इसलिए यह दोगुना तेज़ है।
प्रिमो

मैं समझता हूं कि आप इनाम के बाद हैं, लेकिन फिर भी यह एक कोड-गोल्फ प्रश्न है, और साइट के नियमों के लिए आपको अपना कोड गोल्फ करने के लिए कुछ प्रयास करने की आवश्यकता होती है ।
पीटर टेलर

मैं इनाम के बाद नहीं हूं, यह केवल कार्यान्वयन का एक उदाहरण है। लेकिन तुम सही हो, मैं एक गोल्फ संस्करण जोड़ देंगे।
edc65

@PeterTaylor क्या अब जा सकता है?
edc65

वैसे, क्यों Keys.Reverse? क्या आदेश महत्वपूर्ण है? यदि यह सिर्फ संगामिति मुद्दों से बचने के लिए है, ToListतो कम है।
पीटर टेलर

2

C जीएमपी के साथ (621 बाइट्स, तेज)

मैंने तेज और छोटा होने की कोशिश की है, लेकिन तेजी से पसंदीदा है। यह कार्यान्वयन विज्ञापन- प्रसार के उत्तर पर टिप्पणी में उल्लेखित संख्या-सिद्धांतिक गति के थोड़े बेहतर संस्करण का उपयोग करता है ।

के रूप में सहेजें pseudobinary.cऔर संकलित करें gcc pseudobinary.c -lgmp -o pseudobinary। ध्यान दें कि यह बड़े इनपुट के लिए इतनी मेमोरी आवंटित करता है कि आपको इसे 64-बिट प्लेटफॉर्म के लिए संकलित करने की आवश्यकता होगी।

#include <gmp.h>
int main(int y,char*z[]){int i,n,b,c,e,f,m,*j,*k,*l,*r,*h;char *d,*s;mpz_t
B,I,Q;i=atoi(z[1]);n=i;for(b=0;n%10<1;++b)n/=10;for(;n%2<1;++b)n/=2;for(;n%5<1;++b)n/=5;if(n<2)--b;d=calloc(n,1);j=calloc(n,sizeof(int));r=calloc(99,sizeof(int));c=2;d[1]=1;*j=r[1]=e=1;l=j+1;for(s=0;!s;++c){r[c]=e=e*10%n;k=l;for(h=j;h<k;h++){f=*h;m=(e+f)%n;if(d[m]<1){*l++=m;if(m<1){s=malloc(99);memset(s,48,99);for(f=c;f;f=d[m=(m+n-r[f])%n])s[c-f]++;s[c]=0;h=k;}d[m]=c;}}}f=strlen(s);s[f]=48;s[f+b]=0;mpz_init_set_str(B,s,10);mpz_init_set_si(I,i);mpz_init(Q);mpz_divexact(Q,B,I);d=mpz_get_str(0,10,Q);printf("%s\n",d);return 0;}

समय के लिए लूप संस्करण (751 बाइट्स)

#include <gmp.h>
char **v;int main(){int i,n,b,c,e,f,m,*j,*k,*l,*r,*h;char *d,*s;mpz_t
B,I,Q;v=calloc(10001,sizeof(char*));v[1]=s=malloc(99);memset(s,48,99);*s=49;s[1]=0;for(i=0;++i<10001;){n=i;for(b=0;n%10<1;++b)n/=10;for(;n%2<1;++b)n/=2;for(;n%5<1;++b)n/=5;d=calloc(n,1);j=calloc(n,sizeof(int));r=calloc(99,sizeof(int));c=2;d[1]=1;*j=r[1]=e=1;l=j+1;for(;!v[n];++c){r[c]=e=e*10%n;k=l;for(h=j;h<k;h++){f=*h;m=(e+f)%n;if(d[m]<1){*l++=m;if(m<1){v[n]=s=malloc(99);memset(s,48,99);for(f=c;f;f=d[m=(m+n-r[f])%n])s[c-f]++;s[c]=0;h=k;}d[m]=c;}}}free(d);free(j);free(r);s=v[n];f=strlen(s);s[f]=48;s[f+b]=0;mpz_init_set_str(B,s,10);mpz_init_set_si(I,i);mpz_init(Q);mpz_divexact(Q,B,I);d=mpz_get_str(0,10,Q);printf("%s\n",d);free(d);s[f+b]=48;s[f]=0;}return 0;}

अनगुल्ड लूप संस्करण

#include <gmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **cache;

int main() {
    int i,n,shift,_kb,km,key,m,*ks,*ksi,*nksi,*res,*ii;
    char *d,*s;
    mpz_t B,I,Q;

    cache = calloc(10001,sizeof(char*));
    if (!cache) { printf("Failed to malloc cache\n"); return 1; }
    cache[1]=s = malloc(99);
    memset(s,48,99);
    *s=49;
    s[1]=0;
    for (i=0;++i<10001;) {
        n=i;
        for(shift=0;n%10<1;++shift)n/=10;
        for(;n%2<1;++shift)n/=2;
        for(;n%5<1;++shift)n/=5;

        d = calloc(n,1);
        if (!d) { printf("Failed to malloc d\n"); return 1; }

        ks = calloc(n,sizeof(int));
        if (!ks) { printf("Failed to malloc ks\n"); return 1; }

        res = calloc(99,sizeof(int));
        if (!res) { printf("Failed to malloc res\n"); return 1; }

        _kb = 2;
        d[1] = 1;
        *ks = res[1] = km = 1;
        nksi = ks + 1;

        for(;!cache[n];++_kb) {
            res[_kb] = km = km*10%n;
            ksi = nksi;
            for (ii = ks; ii < ksi; ii++) {
                key = *ii;
                m = (km + key) % n;
                if (d[m] < 1) {
                    *nksi++ = m;
                    if (m < 1) {
                        cache[n] = s = malloc(99);
                        if (!s) { printf("Failed to malloc s\n"); return 1; }
                        memset(s,48,99);
                        for(key=_kb;key;key = d[m = (m + n - res[key]) % n])s[_kb-key]++;
                        s[_kb]=0;
                        ii = ksi; // break
                    }
                    d[m] = _kb;
                }
            }
        }

        free(d);
        free(ks);
        free(res);

        // Add shift * '0'
        s=cache[n];
        key=strlen(s);
        s[key]=48;
        s[key+shift]=0;

        // convert to big integer, divide, print
        mpz_init_set_str(B,s,10);
        mpz_init_set_si(I,i);
        mpz_init(Q);
        mpz_divexact(Q,B,I);
        d = mpz_get_str(0,10,Q);
        if (!s) { printf("Failed to malloc quotient\n"); return 1; }
        printf("%s\n", d);
        free(d);

        // Remove shift * '0'
        s[key+shift]=48;
        s[key]=0;
    }
    return 0;
}

2

सी + जीएमपी, 669

यह वास्तव में छोटी संख्या के लिए तेज़ है; जब परिणाम 64 अंकों से अधिक हो जाता है तो यह चोक होने लगता है।

#include<gmp.h>
#define B(x)(int)((x*(long)k)%n);
int*M,*H,P[99],n,x,p,q=2,e=1,k=10,y,f,z;char*E,C[99];int b(int k,int t){int
j=E[k],a=1<<(j-2);if(j<2){C[t]=49;return 1;}x=(int)((k+n-P[j]*(long)H[k]%n)%n);if(x)b(x,t);return a+b(H[k],t-a);}int
main(){scanf("%d",&n);E=calloc(n+1,1);M=calloc(n+1,4);H=malloc(n*4);M[1]=E[1%n]=P[1]=1;while(!E[0]){P[++e]=k;p=q;for(x=0;++x<p;){y=B(M[x])if(E[n-y]){E[0]=e;H[0]=M[x];break;}}if(!E[x=0])while(++x<p){y=B(M[x])for(z=0;z<p;++z){f=y+M[z];if(f>=n)f-=n;if(!E[f]){E[f]=e;H[f]=M[x];M[q++]=f;}}}k=B(k)}memset(C,48,98);C[99]=0;x=b(0,97);mpz_t
m,r;mpz_init(r);mpz_init_set_str(m,C+98-x,10);mpz_fdiv_q_ui(r,m,n);puts(mpz_get_str(C,10,r));}

संस्करण जो लूप्स 10000 (671 बाइट्स) के लिए है:

#include<gmp.h>
#define B(x)(int)((x*(long)k)%n);
#define N 10001
int M[N],H[N],P[99],n=0,x,p,q,e,k,y,f,z;char E[N],C[99];int b(int k,int t){int
j=E[k],a=1<<(j-2);if(j<2){C[t]=49;return 1;}x=(int)((k+n-P[j]*(long)H[k]%n)%n);if(x)b(x,t);return a+b(H[k],t-a);}int
main(){while(++n<N){memset(E,M[0]=0,n);M[1]=E[1%n]=P[1]=e=1;q=2;k=10;while(!E[0]){P[++e]=k;p=q;for(x=0;++x<p;){y=B(M[x])if(E[n-y]){E[0]=e;H[0]=M[x];break;}}if(!E[x=0])while(++x<p){y=B(M[x])for(z=0;z<p;++z){f=y+M[z];if(f>=n)f-=n;if(!E[f]){E[f]=e;H[f]=M[x];M[q++]=f;}}}k=B(k)}memset(C,48,98);C[99]=0;x=b(0,97);mpz_t
m,r;mpz_init(r);mpz_init_set_str(m,C+98-x,10);mpz_fdiv_q_ui(r,m,n);puts(mpz_get_str(C,10,r));}}

यहां मेरे कोड के साथ-साथ मेरे प्रतियोगियों के परीक्षण के लिए कुछ आदेश दिए गए हैं, और मेरे लैपटॉप पर परिणाम:

ls -l *.c*       
-rw-r--r-- 1 aditsu aditsu  669 Oct 27 15:01 mult-aditsu-single.c
-rw-r--r-- 1 aditsu aditsu  671 Oct 27 15:01 mult-aditsu.c
-rw-r--r-- 1 aditsu aditsu 3546 Oct 27 15:01 mult-anatoly.c
-rw-r--r-- 1 aditsu aditsu 6175 Oct 27 15:01 mult-anders.cpp
-rw-r--r-- 1 aditsu aditsu  621 Oct 27 15:01 mult-peter-single.c
-rw-r--r-- 1 aditsu aditsu  751 Oct 27 15:01 mult-peter.c

gcc -w -march=native -O3 mult-aditsu-single.c -lgmp -o mult-aditsu-single
gcc -w -march=native -O3 mult-aditsu.c -lgmp -o mult-aditsu
gcc -w -march=native -O3 mult-peter-single.c -lgmp -o mult-peter-single
gcc -w -march=native -O3 mult-peter.c -lgmp -o mult-peter
gcc -w -march=native -O3 --std=c99 mult-anatoly.c -o mult-anatoly
g++ --std=c++11 -march=native -O3 mult-anders.cpp -o mult-anders

for i in {1..5}; do time ./mult-anders mult-anders.txt; done
./mult-anders mult-anders.txt  0.34s user 0.00s system 99% cpu 0.344 total
./mult-anders mult-anders.txt  0.36s user 0.00s system 99% cpu 0.358 total
./mult-anders mult-anders.txt  0.34s user 0.00s system 99% cpu 0.346 total
./mult-anders mult-anders.txt  0.35s user 0.00s system 99% cpu 0.347 total
./mult-anders mult-anders.txt  0.34s user 0.00s system 99% cpu 0.344 total

for i in {1..5}; do ./mult-anatoly mult-anatoly.txt; done
Time: 0.254416
Time: 0.253555
Time: 0.245734
Time: 0.243129
Time: 0.243345

for i in {1..5}; do time ./mult-peter > mult-peter.txt; done
./mult-peter > mult-peter.txt  0.14s user 0.00s system 99% cpu 0.137 total
./mult-peter > mult-peter.txt  0.15s user 0.00s system 97% cpu 0.153 total
./mult-peter > mult-peter.txt  0.15s user 0.00s system 99% cpu 0.149 total
./mult-peter > mult-peter.txt  0.15s user 0.00s system 99% cpu 0.150 total
./mult-peter > mult-peter.txt  0.14s user 0.00s system 99% cpu 0.138 total

for i in {1..5}; do time ./mult-aditsu > mult-aditsu.txt; done
./mult-aditsu > mult-aditsu.txt  0.06s user 0.00s system 95% cpu 0.058 total
./mult-aditsu > mult-aditsu.txt  0.05s user 0.00s system 97% cpu 0.055 total
./mult-aditsu > mult-aditsu.txt  0.06s user 0.00s system 99% cpu 0.056 total
./mult-aditsu > mult-aditsu.txt  0.05s user 0.00s system 99% cpu 0.054 total
./mult-aditsu > mult-aditsu.txt  0.05s user 0.00s system 98% cpu 0.055 total

md5sum *.txt
6eef8511d3bc5769b5d9218be2e00028  mult-aditsu.txt
6eef8511d3bc5769b5d9218be2e00028  mult-anatoly.txt
6eef8511d3bc5769b5d9218be2e00028  mult-anders.txt
6eef8511d3bc5769b5d9218be2e00028  mult-peter.txt

जवाब एक इनाम के योग्य। मैं, इस समस्या को (और अपने प्रारंभिक समाधान) में विशेष रुचि लेते हैं, क्योंकि यह की एक विशेष मामला है सबसेट योग समस्या है, जो एन पी-सम्पूर्ण माना जाता है (के अवशेषों की एक सूची दी 10ⁱ आधुनिक n , जल्द से जल्द सबसेट को खोजने जो s को n )।
प्रिमो

@primo धन्यवाद :) मेरा दृष्टिकोण यहां अलग है - मैं इसे बढ़ाने के बजाय प्रत्येक चरण पर अंकों की संख्या को दोगुना करता हूं, और मैं पहले (बहुत जल्दी) जांच करता हूं कि क्या कोई नया नंबर वास्तव में गणना करने से पहले एक समाधान होगा। उन्हें। और मुझे यकीन है कि अभी भी गोल्फ के लिए जगह है।
aditsu

दिलचस्प। जब मैंने प्रत्येक चरण में अंकों की संख्या को दोगुना करने की कोशिश की तो यह धीमा हो गया। हो सकता है कि समाधानों के लिए पूर्व जांच एक बड़ा अंतर बनाती है।
पीटर टेलर

@PeterTaylor यह संभव है .. ऐसा लगता है कि आप एक लूप में भी कॉलक को बुला रहे हैं, जो इसे धीमा कर सकता है। वैसे भी, मैं कुछ समय मिलने पर अपने कोड का अनगुल्ड संस्करण जोड़ना चाहूंगा, और मुझे यह भी पता है कि इसे बड़े / नास्टियर संख्याओं के लिए तेज़ी से कैसे बनाया जाए।
aditsu

2

टी-एसक्यूएल, 164 156 155 154 154 बाइट्स

(-1 बाइट। धन्यवाद जोनाथन!)

(-1 और क्योंकि मैं लाइनों पर अनुगामी स्थान क्यों रखता हूं? SMH)

(+5 ने महसूस किया कि मेरी गोल्फ को तोड़ दिया है)

create function b(@ int)
returns int
as begin
declare @b varchar(max)='',@i int=@
while @>0SELECT @b=cast(@%2 as varchar)+@b,@/=2
return cast(@b as int)/@i
end

मुझे नहीं पता कि मैं इन सवालों पर वापस क्यों आता हूं, जहां मैं बाइनरी में बदलने वाला हूं ... टी-एसक्यूएल यह नहीं जानता कि यह कैसे करना है।

किसी भी मामले में, यहाँ एक SQLFiddle है

संयुक्त राष्ट्र के golfed:

create function binarySquare(@id int)
returns int 
as BEGIN

जहां तक ​​मुझे पता है, इस सामान को टी-एसक्यूएल में एक फ़ंक्शन लिखने के लिए आवश्यक है।

    declare @bin nvarchar(max) = ''

एक रिक्त स्ट्रिंग बनाएं जिसे हम अपने बाइनरी नंबर के रूप में संग्रहीत करने जा रहे हैं।

    declare @id2 int = @id

अंत में उपयोग के लिए इनपुट मूल्य को बचाएं। ऐसा लगता है कि मूल इनपुट का उपयोग करने का एक तरीका होना चाहिए, भले ही हम मूल्य को बदल दें, लेकिन मुझे एक नहीं मिल सकता है।

    while @id>0
      BEGIN
        SET @bin = cast(@id%2 as varchar(1)) + @bin

इसलिए हम अपने मूल इनपुट को लेते हैं, शेष को खोजने के लिए इसे 2 के साथ MOD करते हैं, और यह हमारा अगला सबसे छोटा अंक होने वाला है। उदाहरण के लिए, 5% 2 = 1

        SET @id = @id/2

फिर हम अपना नंबर लेते हैं, और इसे आधे में विभाजित करते हैं। क्योंकि यह एक intप्रकार है, यह इसे पूरी तरह से निकटतम पूर्णांक तक ले जाता है, इसलिए 5/2 = 2. END तब हम इसके माध्यम से लूप करते हैं जब तक कि वैल्यू 0. है, इसलिए हम 5% 2 = 1 5/2 = 2 2 के साथ समाप्त होते हैं। % 2 = 0 2/2 = 1 1% 2 = 1 1/2 = 0 जो हमें हमारे बाइनरी स्ट्रिंग मान का 101 देता है।

    declare @binNum int = (SELECT cast(@bin as int))

हम अपने बाइनरी स्ट्रिंग लेते हैं और इसे फिर से परिवर्तित intकरते हैं।

    return @binNum/@id2

हम intसवाल के मूल के अनुसार, हमारे मूल मूल्य से विभाजित बाइनरी स्ट्रिंग लौटाते हैं ।

END

क्या अंतरिक्ष @>0 SELECTअचूक नहीं है?
जोनाथन फ्रेच

अच्छा पकड़ा! मैं कभी नहीं याद कर सकता कि कौन सी जगहें
ओट

अधिकांश समय आप शाब्दिक और चर / कीवर्ड के बीच रिक्त स्थान छोड़ सकते हैं, क्योंकि वे एक अंक से शुरू नहीं हो सकते हैं।
जोनाथन फ्रीच

1

रूबी, 46 बाइट्स

मुझे वास्तव में वैकल्पिक लूप के साथ लूप को समाप्त करना चाहिए।

n,k=gets,0;$_="#{n.to_i*k+=1}"while/[^01]/;p k

संपादित करें: 1 बाइट शेविंग के लिए धन्यवाद @manatwork!

Edit2: धन्यवाद 9 बाइट्स के लिए @histocraft!

संपादित करें: 7 बाइट्स बंद करने के लिए @manatwork फिर से धन्यवाद!


z!=z[/[01]+/]छोटा है। z[/[^01]/]और भी छोटा है।
पुरुषार्थ

@manatwork धन्यवाद! 1 बाइट कम!
पीटर लेनकेफी

2
सिंगल-लाइन जबकि लूप्स सबसे कम होते हैं:z="#{n.to_i*k+=1}"while z[/[^01]/]
histocrat

@ हिस्टोक्रेट 9 बाइट्स है! और मुझे यह भी पता नहीं था कि माणिक इसके लिए सक्षम है। धन्यवाद!
पीटर लेनकेफी

दिलचस्प है कि आपने परीक्षण को न तो नकारात्मक चरित्र सेट में बदल दिया और न ही 2 बार सुझाए जाने के बाद। कोई कारण?
मैनटवर्क

1

स्काला, 114 बाइट्स

val i=scala.io.StdIn.readInt;Stream.from(1).foreach{x=>if((i*x+"").map{_.asDigit}.max<2){print(x);System.exit(0)}}

पठनीय संस्करण

val i=scala.io.StdIn.readInt
Stream.from(1).foreach{x => 
    if((i*x+"").map{_.asDigit}.max<2) {
        print(x)
        System.exit(0)
    }
}

1

gawk4 brute बल, 28 + 2 = 30 बाइट्स

{while(++n*$0~/[2-9]/);}$0=n

-Mबड़ी संख्या का उपयोग करने के लिए विकल्प के साथ बुलाया जाना चाहिए । बेशक, यह हास्यास्पद रूप से धीमा है, बड़ी संख्या का उपयोग इसे और भी धीमा कर देता है, लेकिन सैद्धांतिक रूप से इनपुट सीमित नहीं है, और रैम का उपयोग नगण्य है।

उपयोग का उदाहरण (यदि आपको समय बर्बाद करना है ;))

echo 27 | awk -M '{while(++n*$0~/[2-9]/);}$0=n'

gawk4 अनुकूलित, 69 + 2 = 71 बाइट्स

{for(;!a[0];NR*=10)for(i in a)a[j=(s=a[i]+NR)%$0]?0:a[j]=s}$0=a[0]/$0

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

अजीब सरणी तत्वों में (अजीब?) व्यवहार होता है कि अगर आप किसी गैर-मौजूदा तत्व की तुलना किसी चीज से करते हैं तो इसे किसी भी तरह से खाली किया जाता है तुलना करने से पहले (मैं मानता हूं कि मैं वहां क्या हो रहा है इसके बारे में निश्चित नहीं हूं)। इसलिए जांच !a[0]के बादfor(i in a) भी आरंभ बिना पाश शुरू होता है a[$0]के लिए 0के रूप में aditsu किया था।

बेशक -M इसके लिए भी विकल्प का इस्तेमाल करना होगा।

हालांकि यह तेजी से है लेकिन यह अजगर की तुलना में अभी भी काफी धीमी है। इसके लिए 79992मेरे 2GHz Core2Duo पर लगभग 14 सेकंड लगते हैं। और मैं यह नहीं कहूंगा कि यह 2 ^ 31 तक के इनपुट के लिए काम करता है, क्योंकि सबसे खराब स्थिति में इसे बड़ी संख्याओं की एक सरणी का निर्माण करना होगा (gawk4 इसके लिए GMP का उपयोग करता है), जिसमें इनपुट नंबर का आकार है। एक 'बोनस' के रूप में बड़े सरणियों में बहुत धीमी है awk ...


1

दिल्लोग ए.पी.एल. , 25

यह एक उचित कार्यक्रम "P" को परिभाषित करता है (केवल एक अनाम फ़ंक्शन नहीं):

P←2∘{0::⍵∇⍨1+⍺⋄⍺⊣~⍎¨⍕⍺×⍵}

2∘2 के साथ शुरू करें
0::यदि कोई त्रुटि है तो बाएं तर्क के
⍵∇⍨1+⍺साथ ... अपने आप को एक बढ़े हुए बाएं तर्क के साथ कॉल करें
⍺×⍵बाएं और दाएं तर्क
स्ट्रिंग में
⍎¨बनाते हैं प्रत्येक वर्ण को संख्या
~प्रयास में तार्किक बनाते हैं (यदि यह विफल हो जाता है, तो त्रुटि से निपटने के लिए ऊपर जाएं, और ...)
⍺⊣वर्तमान बाएँ तर्क को लौटाएँ।

      P 2
50
      P 21
481
      P¨⍳8    ⍝ 1 through 8
10 5 37 25 2 185 143 125
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.