প্রদত্ত r এবং n, x এর প্রথম এন সংখ্যাগুলি সন্ধান করুন যেখানে সর্বশেষে 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

এটি কোড-গল্ফ, তাই কমপক্ষে বাইটস জিত। জয়ের উত্তর এখন থেকে (সপ্তাহে 2014-09-19) গৃহীত হবে accepted

এই প্রশ্নের ক্রেডিট আমার সহকর্মীর কাছে যায়, যিনি আমাকে এই প্রশ্নটি এখানে পোস্ট করার অনুমতি দিয়েছিলেন :)


প্রয়োজনীয় পরিমাণ আউটপুট সহ সময়ের সীমাবদ্ধতা শক্ত। মতে gprof, আমার প্রোগ্রামের জন্য একটি ইনপুট কেস আমার কোডের চেয়ে অর্ধেক সেকেন্ডেরও কম সময় ব্যয় করে তবে মোট প্রায় ৮০ সেকেন্ড সময় লাগে, যা আমি অনুমান করি যে বেশিরভাগই আউটপুটটিতে অবরুদ্ধ থাকতে হবে।
aschepler

আহা, এড়িয়ে আমি এটিকে ঘিরে ফেলেছিলাম printf
aschepler

উত্তর:


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। একটু গণিতশাস্ত্র যে reveals mহিসাবে প্রাপ্ত করা যাবে a*(10^k-r)/(10*r-1), তাই আমরা কেবল স্ক্যান aউপর [1..9]যে জন্য k0 থেকে অনন্ত, এবং রাখা এবং প্রথম মুদ্রণ nফলাফল, যার জন্য জন্য উপরে অভিব্যক্তি mঅবিচ্ছেদ্য হয়।

fromIntegralপ্রয়োজন বোধ করা হয় কারণ readএর সাথে একটি তালিকা ing nতার উপাদানের এক হিসাবে main, ব্যবহার সঙ্গে একযোগে nমধ্যে take, জোর দেবে rকরার Intসর্বত্র, প্রশ্নে বড় সংখ্যার কদর্য উপচে যা ফলাফল নেই। আমি ব্যবহার করতে পারে genericTake, কিন্তু এটি একটি প্রয়োজন import

এই কোডটি 10 ​​টি ব্যতীত অন্যান্য ঘাঁটিতে প্রসারণ করতে প্রায় তুচ্ছ হওয়ার সুবিধাও রয়েছে।

ইনপুটটি পড়া হয় stdin, দুটি মান যে কোনও সাদা স্থান দ্বারা পৃথক করা যায়।


আপনি যদি ব্যাকস্টিকগুলি থেকে মুক্তি পান তবে আপনার কোডটি আরও খাটো হওয়া উচিত
গর্বিত হাসেলেলার

@ প্রফাসহেস্কিলার: নিশ্চিত না কারণ তাদের চারপাশে কোনও স্থানের প্রয়োজন ছাড়াই অপারেটর এবং অপারেন্ড করার জন্য কোনও বন্ধনী নেই।
দ্যস্প্পিশনকিউজিশন

আমি হাস্কেল পড়তে পারি না, তাই আপনি কী করছেন তা আমি পুরোপুরি নিশ্চিত নই। এটি কি r = 5; n = 65535এক মিনিটের মধ্যে সমাধান হবে ?
মার্টিন ইন্ডার

@ মার্টিনবাটনার: আমি সেই মন্তব্যের জন্য অপেক্ষা করছিলাম। হ্যাঁ, এটি সম্ভবত হবে, তবে আমার কম্পিউটারে নেই (বা অন্য কারও মুহূর্তে, বাস্তবে)। আমি মনে করি সমস্যার আরও উন্নত অ্যালগরিদম দরকার। :(
TheSpanishInquisition

@ দ্য স্পেনিশ ইনকুইজিশন তবে আপনি যে জায়গাটি আরও কম খাটোy`mod`10mod y10
গর্বিত হাসেল্লার

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);}}

(বাইট গণনায় গণনা করা হয়নি এমন কয়েকটি নিউলাইনগুলি উপরে স্ক্রোল বারগুলি নির্মূল করার জন্য যুক্ত করা হয়েছে Yes হ্যাঁ, চূড়ান্ত নতুন লাইনটি গণনা করা হয়েছে))

কমান্ড লাইনে যুক্তি প্রত্যাশা করে এবং ধরে নেয় মানক আউটপুট ASCII কে গ্রহণ করে। রানটাইম হ'ল ও (বাইট আউটপুট সংখ্যা) = ও (এন * এন)।

না, আমি ব্যবহার করতে পারবেন না 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;
            }
        }
    }
}

প্রমাণ

প্রোগ্রামটি সমস্যার সমাধান করে:

(প্রমাণ হিসাবে, সমস্ত অপারেটর এবং ফাংশনগুলিকে আসল গাণিতিক ফাংশন হিসাবে ^ধরুন, কম্পিউটার অপারেশনগুলি যা তাদের আনুমানিক হয় না bit

স্পষ্টতার জন্য, আমি 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)। এটি কাজ না করার কারণ হ'ল সংখ্যাগুলি খুব বড় হয়। ক) জেএসের সংখ্যার চেয়ে অনেক বড় নির্ভুলভাবে উপস্থাপন করতে পারে এবং খ) উপায়টি এত বড় যে এটি সমস্ত সংখ্যার মধ্য দিয়ে পুনরাবৃত্তি করা সম্ভব হবে there
মার্টিন এন্ডার

0

পাইথন 3 - 223 179 বাইট

থস্প্পিশআইঙ্কুইজিশনের সমাধানটির পাইথন বাস্তবায়ন:

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

চালান:

  • 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]

অন্তরগুলি হ'ল:

  • 2 = 18
  • 3 = 28
  • 4 = 6
  • 5 = ((5 টি বিসংগম বলে মনে হচ্ছে, আর এর বেশিরভাগ মানের হিসাবে 9 এর ক্লাম্প রয়েছে, 9 এবং 1 এর 5 টি ফর্ম ক্লাম্প রয়েছে (কেবলমাত্র একটি = 7 কাজ করে), নীচে দেখুন)
  • 6 = 58
  • 7 = 22
  • 8 = 13
  • 9 = 44

এটি 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এটির জন্য ব্যবহার করা উচিত এবং এটি এক মিনিটে এটি করতে মাল্টিকোর করা উচিত।
ম্যাটসজয়স

1
যদি unsigned long long64 বিট হয় তবে এটি যথেষ্ট বড় নয়।
পিটার টেলর

সত্য, আমি @ স্পেনিশ ইনকুইজিশনের সমাধানটিতে স্যুইচ করেছি এবং পরিবর্তে অজগর ব্যবহার করেছি।
মাতসয়জাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.