বিশুদ্ধ সংখ্যা


27

আজ আমরা একটি ক্রম তাকান করব একটি , Collatz ফাংশন এর সাথে সম্পর্কিত :

এখানে চিত্র বর্ণনা লিখুন

আমরা z, f (z), f (f (z)) ফর্মের একটি অনুক্রম বলি ... একটি কোলাটজ ক্রম

আমাদের ক্রম প্রথম সংখ্যা , একটি (1) , 0 হয়চ এর পুনরাবৃত্ত প্রয়োগের অধীনে , এটি 0 → 0 → একটি চক্রের মধ্যে পড়ে ...

এখনও আমরা যে ছোটখাটো সংখ্যা দেখিনি সেগুলি হ'ল 1, একটি (2) = 1 তৈরি করেচ এর পুনরাবৃত্ত প্রয়োগের অধীনে , এটি একটি চক্রের মধ্যে পড়ে 1 → 4 → 2 → 1 falls

এখন আমরা উপরের চক্রটিতে 2 নম্বরটি দেখেছি , সুতরাং পরবর্তী ক্ষুদ্রতম সংখ্যাটি একটি (3) = 3 , চক্রের মধ্যে পড়ে 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 →…

উপরের সমস্ত চক্রগুলিতে আমরা ইতিমধ্যে 4 এবং 5 দেখেছি , সুতরাং পরবর্তী সংখ্যাটি একটি (4) = 6

এতক্ষণে আপনার ধারণাটি পাওয়া উচিত। a (n) হ'ল সর্বকনিষ্ঠ সংখ্যা যা সমস্ত a (1),…, a (n - 1) এর জন্য কোনও কোলাটজ সিকোয়েন্সের অংশ ছিল না ।

একটি প্রোগ্রাম বা ফাংশন লিখুন যা ধনাত্মক পূর্ণসংখ্যার n প্রদান করে , একটি (এন) প্রদান করে । বাইটস মধ্যে সংক্ষিপ্ত কোড।


Testcases:

1  -> 0
2  -> 1
3  -> 3
4  -> 6
5  -> 7
6  -> 9
7  -> 12
8  -> 15
9  -> 18
10 -> 19
50 -> 114

(এটি OEIS ক্রম A061641 )


1
বাধ্যতামূলক OEIS
FryAmTheEggman

3
ইনপুট n0-ভিত্তিক হতে পারে?
লুইস মেন্ডো

a(n+1) = a(n) odd: 3*a(n)+1, or a(n) even: a(n)/2
কার্ল ন্যাপফ

@ লুইসেমেন্ডো দুঃখিত, আমি আপনার বার্তাটি কোনওভাবে মিস করেছি। না, চ্যালেঞ্জের মতো সঠিক ক্রমটি পুনরুত্পাদন করুন।
orlp

যদি a0-ভিত্তিক না হয় তবে আমি বুঝতে পারি না কেন আপনি এখানে "0-ভিত্তিক কথা বলছেন" বলে মনে করছেন:a(n) is the smallest number that was not part of any Collatz sequences for all a(0), …, a(n − 1).
ড্যানিরো

উত্তর:


5

জেলি , 20 19 বাইট

ḟ@JḢ×3‘$HḂ?ÐĿ;Ṛ
Ç¡Ṫ

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

Ç¡Ṫ              Main link. No explicit arguments. Default argument: 0
 ¡               Read an integer n from STDIN and do the following n times.
Ç                  Call the helper link.
  Ṫ              Tail; extract the last element of the resulting array.


ḟ@JḢ×3‘$HḂ?ÐĿ;Ṛ  Helper link. Argument: A (array)

  J              Yield all 1-based indices of A, i.e., [1, ..., len(A)]. Since 0
                 belongs to A, there is at least one index that does belong to A.
ḟ@               Filter-false swapped; remove all indices that belong to A.
   Ḣ             Head; extract the first index (i) that hasn't been removed.
           ÐĿ    Call the quicklink to the left on i, then until the results are no
                 longer unique. Collect all unique results in an array.
         Ḃ?      If the last bit of the return value (r) is 1:
       $           Apply the monadic 3-link chain to the left to r.
    ×3‘              Yield 3r + 1.
        H        Else, halve r.
              Ṛ  Yield A, reversed.
             ;   Concatenate the results array with reversed A.

N পুনরাবৃত্তির পরে , একটি (n + 1) এর মান অ্যারের শুরুতে হবে। যেহেতু আমরা পুরানোটির বিপরীত অনুলিপি সহ নতুন অ্যারেটিকে সংবিধানিত করছি, এর অর্থ হ'ল একটি (এন) শেষে থাকবে।


9

হাস্কেল, 93 92 বাইট

c x|x<2=[[0,2]!!x]|odd x=x:c(3*x+1)|1<2=x:c(div x 2)
([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!)

ব্যবহারের উদাহরণ: ([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!) 10-> 19

c xxকিছুটা প্রতারণার জন্য কোলাটজ চক্র x == 1। প্রধান কার্যাবলী সব পূর্ণসংখ্যার মাধ্যমে loops এবং ঐ যে হয় না রাখে c xজন্য xমধ্যে [0..y-1]। খুব সংজ্ঞা সংজ্ঞা সরাসরি বাস্তবায়ন। যেহেতু হাস্কেল সূচক অপারেটর !!0-ভিত্তিক, আমি -1সূচকটি ঠিক করার জন্য একটি (অন্যথায় অকেজো) নম্বরটি প্রেন্ডিং করতে শুরু করি ।


4

এমএটিএল , 46 40 বাইট

Oiq:"tX>Q:yX-X<`t0)to?3*Q}2/]h5M1>]Pv]0)

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

কোডটির একটি বহিরাগত forলুপ রয়েছে যা nকোল্টজ সিকোয়েন্সগুলি তৈরি করে , প্রতিটি পুনরাবৃত্তির মধ্যে একটি করে। প্রতিটি ক্রম ইনার দ্বারা উৎপন্ন হয় do...whileলুপ করে একটি নতুন মান এবং তাদের দোকানে নির্ণয় ক্রম ভেক্টর একটি পর্যন্ত 1বা 0প্রাপ্ত হয়। যখন আমরা সিকোয়েন্সটি সম্পন্ন করি তখন ভেক্টরটি বিপরীত হয় এবং একটি বৈশ্বিক ভেক্টরের সাথে সংযুক্ত হয় যা পূর্ববর্তী সমস্ত ক্রমগুলির মানগুলি অন্তর্ভুক্ত করে। এই ভেক্টরটিতে বারবার মান থাকতে পারে। সিকোয়েন্স ভেক্টরের বিপরীতকরণ নিশ্চিত করে যে বাইরের লুপের শেষে কাঙ্ক্ষিত ফলাফল (শেষ সিকোয়েন্সির শুরুর মান) বিশ্বব্যাপী ভেক্টরের শেষে থাকবে।

সিউডো কোড :

1  Initiallization
2  Generate n sequences (for loop):
3    Compute initial value for the k-th sequence
4    Generate the k-th sequence (do...while loop)
5      Starting from latest value so far, apply the Collatz algorithm to get next value
6      Update sequence with new value 
7      Check if we are done. If so, exit loop. We have the k-th sequence
8    Update vector of seen values
9  We now have the n sequences. Get final result

মন্তব্য করা কোড :

O           % Push 0                                                          1
iq:         % Input n. Generate [1 2 ... n-1]                                 ·
"           % For loop: repeat n-1 times. Let k denote each iteration         2
  t         %   Duplicate vector of all seen values                           · 3
  X>Q       %   Take maximum, add 1                                           · ·
  :         %   Range from 1 to that: these are potential initial values      · ·
  y         %   Duplicate vector of all seen values                           · ·
  X-X<      %   Set difference, minimum: first value not seen                 · ·
  `         %   Do...while: this generates the k-th Collatz sequence          · 4
    t0)     %     Duplicate, push last value of the sequence so far           · · 5
    to      %     Duplicate, parity: 1 if odd, 0 if even                      · · ·
    ?       %     If odd                                                      · · ·
      3*Q   %       Times 3, plus 1                                           · · ·
    }       %     Else                                                        · · ·
      2/    %       Half                                                      · · ·
    ]       %     End if                                                      · · ·
    h       %     Concatenate new value of the sequence                       · · 6
    5M      %     Push the new value again                                    · · 7
    1>      %     Does it exceed 1? This is the loop condition                · · ·
  ]         %   End do...while. The loops ends when we have reached 0 or 1    · ·
  P         %   Reverse the k-th Collatz sequence                             · 8
  v         %   Concatenate with vector of previously seen values             · ·
]           % End for                                                         ·
0)          % Take last value. Implicitly display.                            9


3

পাইথন 2, 97 96 বাইট

r,=s={-1}
exec'n=r=min({r+1,r+2,r+3}-s)\nwhile{n}-s:s|={n};n=(n/2,3*n+1)[n%2]\n'*input()
print r

আসলে যে সব গুণিতক সুবিধা নেয় 3 বিশুদ্ধ হয়। আইডিয়নে এটি পরীক্ষা করুন ।

কিভাবে এটা কাজ করে

প্রথম লাইন অন, r,=s={-1}সেট গুলি = {-1} (সেট) এবং দ = -1

এরপরে আমরা STDIN থেকে একটি পূর্ণসংখ্যা পড়ি, একটি নির্দিষ্ট স্ট্রিং পুনরাবৃত্তি করি যা বহুবার, তারপরে এটি কার্যকর করে। এটি নিম্নলিখিত পাইথন কোডের সমতুল্য।

for _ in range(input())
    n=r=min({r+1,r+2,r+3}-s)
    while{n}-s:
        s|={n}
        n=(n/2,3*n+1)[n%2]

প্রতিটি পুনরাবৃত্তির, আমরা ক্ষুদ্রতম সদস্য খোঁজার করে শুরু {R + 1 টি, R +2, R + + 3} যে অন্তর্গত নয় গুলি । প্রথম পুনরাবৃত্তিতে, এটি r হিসাবে 0 হিসাবে আরম্ভ করে ।

পরবর্তী সমস্ত রানগুলিতে, এস এর মধ্যে কিছু r + 1 , r + 2 এবং r + 3 থাকতে পারে তবে সেগুলি কখনই নয়, যেহেতু 3 এর সমস্ত গুণক শুদ্ধ। এই বিবৃতি যাচাই করতে, মান্য যে কোন একাধিক মিটার এর 3 ফর্ম হল 3k + 1 টি । এটি 2 মি একমাত্র সম্ভাব্য প্রাক-চিত্র হিসাবে ছেড়ে যায় যা 3 এর একাধিকও । সুতরাং, মি কোন সংখ্যা কম হয় Collatz ক্রম থাকতে পারে না মি , সেইজন্য এবং বিশুদ্ধ হয়।

চিহ্নিতকরণের পর এবং আরম্ভের এন , আমরা সঙ্গে Collatz ফাংশন প্রয়োগ n=(n/2,3*n+1)[n%2], প্রতিটি মাধ্যমিক মান যোগ এন সেটে গুলি দিয়ে s|={n}। একবার আমরা একটি এন এর মুখোমুখি হলাম যা ইতিমধ্যে এস এর মধ্যে রয়েছে , {n}-sএকটি খালি সেট দেবে এবং পুনরাবৃত্তি বন্ধ হয়ে যায়।

শেষ মান ক্রম পছন্দসই উপাদান।


1
এটি যুক্ত করতে, একটি প্রমাণ যে 3 টির সমস্ত গুণক খাঁটি। যে কোনও কোলাটজ সিক্যুয়েন্স মডুলোটি দেখুন the. 3x + ১ নিয়মের যে কোনও প্রয়োগের পরে, মডুলোটি ১ হয়। এক্স / ২ নিয়মের প্রয়োগের পরে, Mod 1 2 হয়, এবং Mod 2 হয় 1. 3 এর, যদি না শুরু মানটি ইতিমধ্যে 3 এর বৃহত্তর একাধিক হয় যা অর্ধেক হয়ে যায়। তবে এগুলি বৃহত্তর মানগুলি এখনও উত্পন্ন হয়নি, সুতরাং এন = 0 (মডেল 3) => এন খাঁটি।
orlp


1

জাভা, 148 বাইট

int a(int n){if(n<2)return 0;int f=a(n-1),b,i,c;do{f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}while(b<1);return f;}

আইডিয়ন! (সতর্কতা: শূন্য অপ্টিমাইজেশনের কারণে ঘৃণ্য জটিলতা))

এটিকে একটি do...whileলুপ থেকে একটি লুপে রূপান্তর forকরা গল্ফিয়ার হবে, তবে এটি করতে আমার সমস্যা হচ্ছে।

গল্ফিং পরামর্শ যথারীতি স্বাগত।


অনেক না, কিন্তু আপনি যা করতে পারেন গলফ 1 পরিবর্তন করে বাইট বন্ধ for(b=1,i=1;i<n;i++)করার for(b=1,i=0;++i<n;)। বিটিডব্লিউ, আমি বুঝতে পেরেছি কেন আপনার আইডিয়োন 50 টির জন্য পরীক্ষার কেস মিস করছে, তবে কেন এটি 10 ​​টি মিস করে না? এটি কোনও সমস্যা ছাড়াই এটি পরিচালনা করতে পারে।
কেভিন ক্রুইজসেন

@ কেভিন ক্রুইজসেন কারণ ফরম্যাটটি খারাপ হবে।
লিকি নুন

সেরা উন্নতি নয় তবে আমি খুব বেশি সময় ব্যয় করিনি ... (147 বাইট)int a(int n){if(n<2)return 0;int f=a(n-1),b=0,i,c;for(;b<1;){f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}return f;}
পোকে

1

পার্ল 6, 96

my @s;my $a=0;map {while ($a=@s[$a]=$a%2??3*$a+1!!$a/2)>1 {};while @s[++$a] {}},2..slurp;$a.say;

পার্ল 5 উত্তরের উপর ভিত্তি করে । পার্ল 6 সিনট্যাক্স পার্ল 5 সিনট্যাক্সের চেয়ে কম ক্ষমা করার পরে কিছুটা দীর্ঘ, তবে আমি আপাতত এটির সাথে বন্দোবস্ত করব।


0

পিএইচপি, 233 124 বাইট

<?$n=$argv[1];for($c=[];$n--;){for($v=0;in_array($v,$c);)$v++;for(;$n&&!in_array($v,$c);$v=$v&1?3*$v+1:$v/2)$c[]=$v;}echo$v;

কার্যকারিতা জন্য +4:

function a($n){for($c=[];$n--;){for($v=0;in_array($v,$c);)$v++;for(;$n&&!in_array($v,$c);$v=$v&1?3*$v+1:$v/2)$c[]=$v;}return$v;}

0

পার্ল 5 - 74 বাইট

map{0 while 1<($a=$c[$a]=$a%2?$a*3+1:$a/2);0 while$c[++$a]}2..<>;print$a+0

এটি একটি দুর্দান্ত সোজা সমাধান। এটি বারবার কোলাটজ ফাংশনটি ভেরিয়েবলের সাথে প্রয়োগ করে $aএবং অ্যারেতে @cযে মানটি দেখা গেছে সেগুলি সংরক্ষণ করে, তারপরে 0 বা 1 পৌঁছানোর পরে এটি বৃদ্ধি পায় $aযতক্ষণ না এটি এখনও দেখা যায় নি। এটি ইনপুট বিয়োগ 2 এর সমান বহুবার পুনরাবৃত্তি হয় এবং অবশেষে এর মান আউটপুট $aহয়।


0

গণিত, 134 বাইট

f=If[EvenQ@#,#/2,3#+1]&;a@n_:=(b={i=c=0};While[i++<n-1,c=First[Range@Max[#+1]~Complement~#&@b];b=b~Union~NestWhileList[f,c,f@#>c&]];c)

সহজেই পঠনযোগ্য ফর্ম্যাট:

f = If[EvenQ@#, #/2, 3#+1] &;                        Collatz function
a@n_ := (                                            defines a(n)
  b = {i = c = 0};                                   initializations
                                                       b is the growing sequence
                                                       of cycles already completed
  While[i++ < n - 1,                                 computes a(n) recursively
    c = First[Range@Max[# + 1]~Complement~# & @b];   smallest number not in b
    b = b~Union~NestWhileList[f, c, f@# > c &]       apply f to c repeatedly
                                                       until the answer is smaller
                                                       than c, then add this new
                                                       cycle to b
    ]
  ; c)                                                 output final value of c
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.