R और n को देखते हुए, x की पहली n संख्याएँ ज्ञात करें जहाँ x के अंतिम अंक को अंतिम स्थान पर ले जाने से x / r = y मिलता है


11

उद्देश्य

दिए गए इनपुट rऔर nपहले nप्राकृतिक संख्याओं को xऐसे खोजें कि अगर हम पहले अंक को उस अंतिम स्थान पर घुमाएं जो हम प्राप्त करते हैं x/r

आपको लगता है कि यह मान सकते हैं 2 <= r <= 9और 1 <= n <= 65535

आप एक प्रोग्राम लिख सकते हैं जो स्टडिन या कमांड-लाइन तर्कों से इनपुट लेता है; या आप एक फ़ंक्शन लिख सकते हैं जो पैरामीटर के रूप में rऔर लेता है n। आउटपुट, हालांकि, स्टडआउट होना चाहिए। उत्पादन में वृद्धि के क्रम में x, प्रति स्वरूप एक पंक्ति , के रूप में स्वरूपित किया जाना चाहिए ।x/r=yx

आपका समाधान उचित डेस्कटॉप कंप्यूटर पर एक मिनट के भीतर सभी वैध मामलों को संभालने में सक्षम होना चाहिए।

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

इनपुट: 4 5
आउटपुट:

102564/4=25641  
205128/4=51282  
307692/4=76923  
410256/4=102564  
512820/4=128205

इनपुट: 5 1
आउटपुट:714285/5=142857

यह कोड-गोल्फ है, इसलिए कम से कम बाइट्स जीतते हैं। जीत का जवाब अब से 4 सप्ताह (2014-09-19) के लिए स्वीकार किया जाएगा।

इस प्रश्न का श्रेय मेरे सहयोगी को जाता है, जिसने मुझे इस प्रश्न को यहाँ पोस्ट करने की अनुमति दी :)


आवश्यक उत्पादन की मात्रा के साथ समय का प्रतिबंध कठिन है। के अनुसार gprof, मेरे कार्यक्रम के लिए एक इनपुट मामले मेरी कोड में दूसरी छमाही की तुलना में कम एक खर्च करता है, लेकिन लगभग 80 सेकंड कुल लेता है, जो मैं ज्यादातर उत्पादन पर अवरुद्ध होना चाहिए मान।
aschepler 23'14

आह, मैं टाल-मटोल करके उसके चारों ओर हो गया printf
19

जवाबों:


7

हास्केल, 182 179

दूसरा संस्करण, शायद आगे गोल्फ है, लेकिन इस बार "उचित" एल्गोरिदम के साथ। विशेष रूप से, यह कुछ ही मिनटों में समाप्त हो जाता है r=4और n=65535, लेकिन फिर से मेरा कंप्यूटर न तो उचित है और न ही डेस्कटॉप है, इसलिए संभावना है कि यह अन्य मशीनों पर एक मिनट के भीतर बना रहे।

n#r=take n$[s(10^k*a+d)++'/':s r++'=':s d++s a|k<-[0..],a<-[1..9],let(d,m)=divMod(a*(10^k-r))(10*r-1),m<1]
s=show
main=interact$unlines.(\(r:n:_)->n#fromIntegral r).map read.words

यह इस विचार पर आधारित है कि x=10^k*a + m, जहां इसका पहला अंक 0≤a≤9प्राप्त करने के लिए अंत में ले जाया जाता है y=10*m+a। थोड़ा गणित से पता चलता है कि mइसे प्राप्त किया जा सकता है a*(10^k-r)/(10*r-1), इसलिए हम बस 0 से अनंत तक प्रत्येक के लिए स्कैन aकरते हैं , और पहले परिणाम जिसके लिए उपरोक्त अभिव्यक्ति अभिन्न है , को बनाए रखते हैं और प्रिंट करते हैं ।[1..9]knm

fromIntegralआवश्यकता है क्योंकि readके साथ एक सूची ing nमें अपनी तत्वों में से एक के रूप में main, के उपयोग के साथ संयोजन में nमें take, मजबूर होना पड़ा rको Intभर में, सवाल में बड़ी संख्या के साथ बुरा अतिप्रवाह में जो परिणाम है। मैं इस्तेमाल कर सकता था genericTake, लेकिन इसके लिए ए की जरूरत है import

इस कोड को 10 के अलावा अन्य आधारों तक विस्तार करने के लिए लगभग तुच्छ होने का लाभ भी है।

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


यदि आपको बैकस्टिक्स से छुटकारा मिलता है तो आपका कोड छोटा होना चाहिए
गर्वित हैकेलर

@proudhaskeller: सुनिश्चित नहीं हैं क्योंकि रिक्त स्थान की आवश्यकता के बिना ऑपरेटर और ऑपरेटर को अलग करने के लिए उनके आसपास कोई कोष्ठक नहीं हैं।
theSpanishInquisition

मैं हास्केल नहीं पढ़ सकता, इसलिए मुझे पूरी तरह से यकीन नहीं है कि आप क्या कर रहे हैं। क्या यह r = 5; n = 65535एक मिनट में हल हो जाएगा ?
मार्टिन एंडर

@ मार्टिनबटनर: मैं उस टिप्पणी की प्रतीक्षा कर रहा था। हां, यह शायद होगा, लेकिन मेरे कंप्यूटर पर नहीं (या किसी और का अभी, वास्तव में)। मुझे लगता है कि समस्या को और अधिक उन्नत एल्गोरिदम की आवश्यकता है। :(
TheSpanishInquisition

@TheSpanishInquisition लेकिन आप को बदलने के लिए सक्षम हो ahould y`mod`10साथ mod y10है, जो एक चार कम है
गर्व haskeller

1

शुद्ध बैश (कोई बाहरी उपयोगिताओं) नहीं, 80 बाइट्स

for((;++x,c<$2;));{
y=$[10#${x:1}${x:0:1}]
((y*$1==x))&&echo $x/$1=$y&&((c++))
}

नोट बैश केवल पूर्णांक अंकगणित करता है और फ़्लोटिंग पॉइंट नहीं, इसलिए हम जांचते हैं कि x == y * rइसके बजाय क्या है x / r == y। इसके अलावा गुणन आमतौर पर तेज होना चाहिए। फिर भी, यह प्रदर्शन की आवश्यकता को पूरा करने के लिए कहीं नहीं है।

आउटपुट:

$ ./rotdiv.sh 4 5
102564/4=25641
205128/4=51282
307692/4=76923
410256/4=102564
512820/4=128205
$ ./rotdiv.sh 5 1
714285/5=142857
$ 

1

सी 468

#include <stdlib.h>
#include <stdio.h>
#define a(s)fputs(s,stdout);
#define b(c)putchar(c);
int r;int z(char*s,int m){for(int i=0;i++<=m;)a(s)b(47)b(r+48)b(61)char*t=s;
while(*++t==48);a(t)while(m--)a(s)b(*s)b(10)}char x[10][60];
int main(int c,char**v){r=atoi(v[1]);int n=atoi(v[2]),q=10*r-1,d=0,p;
while(d++<9){p=r*d;char*y=x[d];do{p*=10;*y++=p/q+48;p%=q;}while(p!=r*d);}
d=1;p=q=0;while(n--){r==5&p<6?z(x[7],7*q+p++):(z(x[d],(r==5&d==7)?7*q+6:q),
++d>9?q+=d=1,p=0:0);}}

(बाइट गिनती में गिने नहीं गए कुछ नए किस्में ऊपर स्क्रॉल पट्टियों को खत्म करने के लिए जोड़े गए हैं। हां, अंतिम नई पंक्ति को गिना गया है।)

कमांड लाइन पर तर्क की अपेक्षा करता है, और मान लेता है कि मानक आउटपुट ASCII स्वीकार करता है। रनटाइम O (बाइट्स आउटपुट की संख्या) = O (n * n) है।

नहीं, मैं उपयोग नहीं कर सकता printf। यह बहुत अधिक समय लेता है और मेरे डेस्कटॉप पर मिनट सीमा पर कार्यक्रम को आगे बढ़ाता है। जैसा कि यह है, कुछ परीक्षण मामलों में लगभग 30 सेकंड लगते हैं।

एल्गोरिदम आउटपुट को स्ट्रिंग्स के रूप में मानता है, न कि संख्याओं के कारण, क्योंकि वे जल्दी से विशाल हो जाते हैं, और आउटपुट में मजबूत पैटर्न होते हैं।

कुछ असम्बद्ध:

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

/* r is as in the problem description */
int r;

void show_line(const char* num, int repeats) {
    for (int i=0; i <= repeats; ++i)
        fputs(num, stdout);
    printf("/%c=", '0'+r);

    /* Assume the repeated num is a solution. Just move the first
       digit and skip any resulting leading zeros. */
    const char* num_tail = num;
    ++num_tail;
    while (*num_tail=='0')
        ++num_tail;
    fputs(num_tail, stdout);
    while (repeats--)
        fputs(num, stdout);
    printf("%c\n", *num);
}

/* sol[0] is unused. Otherwise, sol[d] is the repeating digits in the
   decimal representation of (r*d)/(10*r-1). */
char sol[10][60];

int main(int argc, char** argv) {
    r = atoi(argv[1]);
    int n = atoi(argv[2]);
    int q = 10*r-1;
    int d = 0;

    /* Populate the strings in sol[]. */
    while (d++<9) {
        int p = r*d;
        char* sol_str = sol[d];

        /* Do the long division p/q in decimal, stopping when the remainder
           is the original dividend. The integer part is always zero. */
        do {
            p *= 10;
            *sol_str++ = p/q + '0';
            p %= q;
        } while (p != r*d);
    }

    /* Output the answers. */
    d = 1;
    int repeats = 0;
    int r5x7_repeats = 0;
    while (n--) {
        if (r==5 && r5x7_repeats<6) {
            show_line(x[7], 7*repeats + r5x7_repeats);
        } else {
            if (r==5 && d==7)
                show_line(x[d], 7*repeats + 6);
            else
                show_line(x[d], repeats);
            if (++d > 9) {
                d = 1;
                ++repeats;
                r5x7_repeats = 0;
            }
        }
    }
}

सबूत

यह समस्या हल करती है:

(सबूत में, सभी ऑपरेटरों और कार्यों को वास्तविक गणितीय कार्य होने के लिए लें, न कि कंप्यूटर संचालन जो उन्हें अनुमानित करते हैं। ^घातांक को दर्शाते हैं, बिटवाइज़ एक्सर नहीं।)

स्पष्टता के लिए, मैं ToDecएक संख्या का उपयोग दशमलव अंकों के अनुक्रम के रूप में संख्या लिखने की सामान्य प्रक्रिया का वर्णन करने के लिए करूँगा । इसकी सीमा क्रमबद्ध टुपल्स का सेट है {0...9}। उदाहरण के लिए,

ToDec(2014) = (2, 0, 1, 4).

एक सकारात्मक पूर्णांक के लिए n, L(n)दशमलव प्रतिनिधित्व में अंकों की संख्या को परिभाषित करें n; या,

L(n) = 1+floor(log10(n)).

एक सकारात्मक पूर्णांक kऔर एक गैर-नकारात्मक पूर्णांक nके लिए L(n)<k, Rep_k(n)दशमलव अंकों के सामने शून्य जोड़कर प्राप्त वास्तविक संख्या को परिभाषित करें n, यदि आवश्यक हो kतो कुल अंक प्राप्त करें , और फिर kदशमलव बिंदु के बाद उन अंकों को दोहराते हुए । उदाहरण के लिए

Rep_4(2014) = .201420142014...
Rep_5(2014) = .020140201402...

गुणा करना दशमलव बिंदु Rep_k(n) * 10^kसे nपहले के अंक और (शून्य-पेड) अंकों nको दशमलव बिंदु के बाद अनंत रूप से दोहराया जाता है। इसलिए

Rep_k(n) * 10^k = n + Rep_k(n)
Rep_k(n) = n / (10^k - 1)

एक सकारात्मक पूर्णांक को देखते हुए r, मान लीजिए xकि समस्या का समाधान है, और

ToDec(x) = ( x_1, x_2, ..., x_k )

जहां x_1 != 0और k = L(x)

एक समाधान होने के लिए, xका एक बहु है r, और

ToDec(x/r) : ( x_2, x_3, ..., x_k, x_1 ).

Rep_kफ़ंक्शन को लागू करना एक अच्छा समीकरण देता है:

10*Rep_k(x) = x_1 + Rep_k(x/r)

ऊपर से इसके बंद रूप का उपयोग करना,

10x / (10^k - 1) = x_1 + x / r / (10^k - 1)
x = x_1 * r * (10^k-1) / (10r - 1)

x_1सेट में होना चाहिए {1 ... 9}rसेट में होना निर्दिष्ट किया गया था {2 ... 9}। अब एकमात्र प्रश्न यह है कि सकारात्मक पूर्णांक देने के kलिए उपरोक्त सूत्र किन मूल्यों के लिए है x? हम rव्यक्तिगत रूप से प्रत्येक संभावित मूल्य पर विचार करेंगे ।

जब r= 2, 3, 6, 8, या 9 10r-1, क्रमशः 19, 29, 59, 79 या 89 है। सभी मामलों में, भाजक p = 10r-1प्रमुख है। अंश में, केवल 10^k-1एक ही हो सकता है p, जो तब होता है

10^k = 1 (mod p)

समाधानों के सेट को अतिरिक्त और घटाव के तहत बंद किया जाता है जिसके परिणामस्वरूप नकारात्मक संख्या नहीं होती है। तो सेट में कुछ सामान्य कारक के सभी गुणक शामिल हैं, जो कम से कम सकारात्मक समाधान भी है k

कब r = 4और 10r-1 = 39कहां; या जब r = 7और 10r-1 = 69, हर 3 बार एक अलग प्राइम है p=(10r-1)/310^k-1हमेशा 3 का एक गुणक होता है, और फिर से अंश में कोई अन्य कारक एक से अधिक नहीं हो सकता है p, इसलिए फिर से समस्या कम हो जाती है

10^k = 1 (mod p)

और फिर समाधान सभी के लिए कम से कम सकारात्मक समाधान के गुणक हैं k

[तैयार नहीं...]


0

अजगर - 91 90

यहाँ पहला शॉट है:

r,n=input();i=1
while n:
 if int(`i`[1:]+`i`[0])*r==i:print'%d/%d=%d'%(i,r,i/r);n-=1
 i+=1

संपादित करें: ठीक है, यह 65K संख्या के लिए आवश्यक 1 मिनट की समय सीमा को पूरा करने के लिए धीमा करने का तरीका है।


1
क्या आपने प्रदर्शन आवश्यकता के विरुद्ध इसका परीक्षण किया है?
पीटर टेलर

2
मुझे इस बात पर संदेह है कि सूरज के फटने से पहले यह संख्या 65k होगी।
मार्टिन एंडर

0

जावास्क्रिप्ट - 145

function f(a,b){for(d=0;d<b;d++)for(i=1;;i++){c=i/a;if(c==parseInt(i.toString().substring(1)+i.toString().charAt(0)))console.log(i+'/'+a+'='+c)}}

गोल्फ नहीं:

function f(a,b){
    for(d=0;d<b;d++) //loop for the right amount
        for(i=1;;i++){ //iterating loop
            c=i/a; //actual result of the division
            if(c==parseInt(i.toString().substring(1)+i.toString().charAt(0)))
                console.log(i+'/'+a+'='+c)
        }
}

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

@ मार्टिनबटनर यह मेरे लिए पूरी तरह से ठीक काम करता है। यह हो सकता है कि यह प्रदर्शन की आवश्यकताओं को पूरा नहीं करता है, लेकिन मैं अभी जो कंप्यूटर हूं वह बहुत कमजोर है ... आपने इस कोड के काम को करने के लिए क्या किया?
आर्मिन

1
इसे कंसोल में कॉपी किया और जोड़ा गया (5,4)। यह काम नहीं करेगा कारण यह है कि संख्या बहुत बड़ी हो जाती है। क) जेएस में एक संख्या की तुलना में बहुत बड़ा सटीक और बी) मार्ग का प्रतिनिधित्व कर सकता है, क्योंकि वहां पहुंचने के लिए सभी नंबरों के माध्यम से पुनरावृति करना संभव होगा।
मार्टिन एंडर

0

पायथन 3 - 223 179 बाइट्स

TheSpanishInquisition के समाधान का पायथन कार्यान्वयन:

r,n=map(int,input().split());k=0
while 1:
 for a in range(1,10):
  D,M=divmod(a*(10**k-r),10*r-1)
  if M==0:
   print("%d/%d=%d"%(a*10**k+D,r,10*D+a));n-=1
   if n==0:exit()
 k+=1

Daud:

  • python3 <whatever you named it>.py
  • स्टड पर इनपुट लेता है
  • इनपुट स्पेस अलग हो गया

आउटपुट:

$python3 <whatever you named it>.py
4 8
102564/4=25641
205128/4=51282
307692/4=76923
410256/4=102564
512820/4=128205
615384/4=153846
717948/4=179487
820512/4=205128

जाँच - परिणाम:

https://oeis.org/A092697 प्रत्येक आर के लिए पहला मूल्य है।

ऐसा लगता है कि कश्मीर के केवल कुछ मूल्य उत्तर देते हैं, और यह कि अंतराल नियमित है। उदाहरण के लिए r = 4:

Form: k [a, a, ...]
0 []
1 []
2 []
3 []
4 []
5 [1, 2, 3, 4, 5, 6, 7, 8, 9]
6 []
7 []
8 []
9 []
10 []
11 [1, 2, 3, 4, 5, 6, 7, 8, 9]
12 []
13 []
14 []
15 []
16 []
17 [1, 2, 3, 4, 5, 6, 7, 8, 9]
18 []
19 []
20 []
21 []
22 []
23 [1, 2, 3, 4, 5, 6, 7, 8, 9]

अंतराल हैं:

  • २ = १ 18
  • ३ = २ 28
  • ४ = ६
  • 5 = 6 (5 एक विसंगति प्रतीत होता है, जैसे कि r के अधिकांश मानों में 9 के क्लैंप होते हैं, 9 और 1 के 5 फॉर्म क्लैंप होते हैं (केवल a = 7 वर्किंग के साथ), नीचे देखें)
  • ६ = ५ 6
  • = २२
  • = १३
  • ९ = ४४

यह https://oeis.org/A094224 है

इन मूल्यों का उपयोग करके, एक अधिक कुशल संस्करण बनाया जा सकता है:

import math

def A094224(n):
    return [18,28,6,6,58,22,13,44][n-2]


r,n=map(int,input().split());k=A094224(r)-1
H={}
while 1:
    for a in range(1,10):
        D,M=divmod(a*10**k-a*r,10*r-1)
        if M==0:
            print("%d/%d=%d"%(a*10**k+D,r,10*D+a));n-=1
            if n==0:exit()
    k+=A094224(r)

हालाँकि, मैं (अभी तक) यह साबित नहीं कर सकता कि यह गणितीय रूप से जारी है।

आर = 5 के लिए परिणाम:

0 []
1 []
2 []
3 []
4 []
5 [7]
6 []
7 []
8 []
9 []
10 []
11 [7]
12 []
13 []
14 []
15 []
16 []
17 [7]
18 []
19 []
20 []
21 []
22 []
23 [7]
24 []
25 []
26 []
27 []
28 []
29 [7]
30 []
31 []
32 []
33 []
34 []
35 [7]
36 []
37 []
38 []
39 []
40 []
41 [1, 2, 3, 4, 5, 6, 7, 8, 9]

2
क्या आपने इसे इनपुट के साथ परीक्षण किया है 9 65535?
पीटर टेलर

मुझे शायद इसके लिए उपयोग करना चाहिए unsigned long long, और इसे एक मिनट में करने के लिए मल्टीकोर बनाना चाहिए।
matsjoyce

1
अगर unsigned long long64 बिट्स है, तो यह काफी बड़ा नहीं है।
पीटर टेलर

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