পুনরাবৃত্তি কোলাটজ অনুমান


21

Collatz অনুমান স্বীকার্য যে আপনি যদি কোন ধনাত্মক পূর্ণসংখ্যা নিতে, তারপর নিম্নলিখিত অ্যালগরিদম যথেষ্ট বার পুনরাবৃত্তি:

if number is odd, then multiply by three and add one
if number is even, then divide by two

আপনি শেষ পর্যন্ত 1 এ শেষ করবেন এটি সর্বদা কাজ করে বলে মনে হয় তবে এটি কখনও প্রমাণিত হয় নি যে এটি সর্বদা হয়।

আপনি 1 পেতে কতক্ষণ সময় নেয় তা গণনা করে ইতিমধ্যে গল্ফ করেছেন , তাই আমি ভেবেছিলাম যে আমি জিনিসগুলিকে কিছুটা স্যুইচ করব।

প্রদত্ত ধনাত্মক পূর্ণসংখ্যার সাথে শুরু করে গণনা করুন যে এটি 1 (এটির "থামার সময়") পেতে কত সময় নেয়। তারপরে সেই নম্বরটির থামার সময়টি সন্ধান করুন।

আপনি 1 এ না হওয়া পর্যন্ত বা 100 পুনরাবৃত্তির সম্পূর্ণ স্বেচ্ছাসেবী সীমাতে না আসা পর্যন্ত পুনরাবৃত্তি করুন। পূর্ববর্তী ক্ষেত্রে, এটি কতগুলি পুনরাবৃত্তি নিয়েছিল তা মুদ্রণ করুন। পরবর্তী ক্ষেত্রে, "ব্যর্থ" বা আপনার পছন্দসই কিছু অন্যান্য ধারাবাহিক আউটপুট মুদ্রণ করুন, যতক্ষণ না এটি পূর্ণসংখ্যা নয় 1≤n≤100। আপনি এই বিকল্পের জন্য খালি স্ট্রিং আউটপুট নাও পেতে পারেন। [1, 100] ব্যাপ্তির বাইরে একটি পূর্ণসংখ্যা আউটপুট করার অনুমতি রয়েছে।

উদাহরণ:

Input: 2
2->1
Output: 1

Input: 5
5->5->5->5->5->...
Output: Fail

Input: 10
10->6->8->3->7->16->4->2->1
Output: 8

Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13

Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13

Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11

Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6

আমি যেমন গণনা করেছি 10^100এবং 12345678901234567890এমন একটি ভাষা ব্যবহার করছি যা কেবলমাত্র সেই আকারের জন্য বাস্তবকে সমর্থন করে, যদি আপনার ভাষা আরও নির্ভুল হয় তবে আপনি সেগুলির জন্য বিভিন্ন ফলাফল পেতে পারেন।

স্কোরিং

এটি , বাইটের স্বল্পতম পরিমাণের সাথে উত্তর।


উত্তর:




6

সংযুক্তি , 40 বাইট

`-&3@`#@PeriodicSteps[CollatzSize@Max&1]

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

এটি আমি তৈরি একটি নতুন ভাষা। আমি একটি উপযুক্ত ইনফিক্স ভাষা তৈরি করতে চেয়েছিলাম, এবং এটি ফলাফল: একটি গণিতের নক-অফ। হুররে?

ব্যাখ্যা

এটি কয়েকটি ফাংশনের একটি সংমিশ্রণ। এই ফাংশনগুলি হ'ল:

  • PeriodicSteps[CollatzSize@Max&1]এটি এমন কোনও ফাংশন দেয় যা ফলাফলগুলিতে সদৃশ উপাদান না হওয়া পর্যন্ত তার যুক্তি প্রয়োগ করে। এই ফাংশনটি, কল্টসাইজে অবৈধ ইনপুট এড়াতে ইনপুটটির বৃহত্তর ক্ষেত্রে এবং CollatzSize@Max&1প্রয়োগ করছে।CollatzSize10
  • `#একটি উদ্ধৃত অপারেটর; যখন এই অর্থে monadically প্রয়োগ করা হয়, এটি তার যুক্তির আকার প্রাপ্ত করে
  • `-&3একটি জোড়া ফাংশন, যা বন্ড যুক্তি 3ফাংশন `-, যা হিসাবে "বিয়োগ 3" পড়া হয়। এটি কারণ, পিরিওডিকস্টেপস অ্যাপ্লিকেশনটি 0s দেয়, যার জন্য অ্যাকাউন্টিং করা দরকার। (এটি খুব সুন্দরভাবে সীমাবদ্ধতার বাইরে সংখ্যাগুলিও পরিচালনা করে 5, কোন মানচিত্রটিতে -1)

1
আপনার নিজের ভাষা ব্যবহার করা কি সত্যই অনুমোদিত? আপনি কেবলমাত্র কিছু বাইট ব্যবহার করে প্রতিটি কোডগল্ফের জন্য একটি ল্যাঙ্গেজ তৈরি করতে পারবেন না?
টুইটকিম্প

2
@ তুইয়াকিম্প অবশ্যই আপনার নিজের ভাষা তৈরি করার (এবং ব্যবহার করার) অনুমতি রয়েছে। তবে এটিকে সংশোধন করা যাতে কোনও কাজটি একটি একক কমান্ড হয় (চ্যালেঞ্জ পোস্ট হওয়ার পরে) এটি একটি মান ফাঁক।
কেয়ার্ড কোইনরিঙ্গিংহিংহ

2
@ তুইয়াকিম্প যদি এটি আপনাকে আরও ভাল বোধ করে, এই চ্যালেঞ্জটি দেখার আগে আমি এই ফাংশনটি তৈরি করেছিলাম। আমি ল্যাঙ্গুয়েজ ডিজাইনার, তাই আমি এটাই করি।
কনর ওব্রায়ান

এটি আরও সাধারণ প্রশ্ন ছিল যা অন্যের নিজের তৈরি ভাষা অনুমোদিত, এমন কোনও নেতিবাচক বিবৃতি নয় যা আপনি নিজের ব্যবহার করেছেন।
টুইটকিম্প

4

জে , 49 45 বাইট

-4 বাইটস এখানে @ র্যান্ডমরার মন্তব্য থেকে নেওয়া সংক্ষিপ্ত কোলাটজ সিকোয়েন্স কোডকে ধন্যবাদ ।

(2-~[:#(>&1*-:+2&|*+:+>:@-:)^:a:)^:(<101)i.1:

আউটপুট 101অবৈধ ফলাফলের জন্য।

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

ব্যাখ্যা

আশ্চর্যজনকভাবে, এই ব্যাখ্যাটি দ্রুত পুরানো হয়ে উঠেছে। আমি এটি পুরানো 49 বাইট উত্তরগুলির সাথে রেখে যাচ্ছি, যা আমি নীচে অন্তর্ভুক্ত করছি। আপনি যদি আপডেট চান, তবে আমাকে জানান। যেভাবে এটি পুনরাবৃত্তির ক্রমটির দৈর্ঘ্যটি সন্ধান করে একইভাবে রয়ে গেছে, আমি একটি সংক্ষিপ্ত কোলাটজ সিকোয়েন্স পদ্ধতিটি ব্যবহার করেছি।

(1-~[:#%&2`(1+3&*)@.(2&|)^:(1&<)^:a:)^:(<101)i.1:

কোলাটজ সিকোয়েন্সের দৈর্ঘ্য সন্ধান করা

কোডটির এই বিভাগটি নিম্নলিখিত is

(1-~[:#%&2`(1+3&*)@.(2&|)^:(1&<)^:a:)

এখানে ব্যাখ্যা:

(1 -~ [: # %&2`(1+3&*)@.(2&|) ^: (1&<) ^: a:)  Given an input n
                                       ^: a:   Apply until convergence, collecting
                                                each result in an array.
                              ^: (1&<)         If n > 1 do the following, else
                                                return n.
                        (2&|)                  Take n mod 2.
           %&2                                 If n mod 2 == 0, divide by 2.
               (1+3&*)                         If n mod 2 == 1, multiply by 3 
                                                and add 1.
         #                                     Get the length of the resulting
                                                array.
 1 -~                                          Subtract 1.

দুর্ভাগ্যক্রমে, ^:ফল ক্রিয়াকলাপ ( ) প্রয়োগ করার সময় ফলাফলটি প্রাথমিক মানটিও সংরক্ষণ করে, তাই এর অর্থ আমরা (সর্বদা পছন্দ) এক এক করে বন্ধ করে দিই। সুতরাং আমরা কেন 1 বিয়োগ।

পুনরাবৃত্তির ক্রমের দৈর্ঘ্য সন্ধান করা

(1-~[:#%&2`(1+3&*)@.(2&|)^:(1&<)^:a:) ^: (< 101) i. 1:  Given an input n.
                                      ^: (< 101)        Apply 100 times,
                                                         collecting results
                                                         in an array.
(1-~[:#%&2`(1+3&*)@.(2&|)^:(1&<)^:a:)                   Collatz sequence length.
                                                 i. 1:  Index of first 1 (returns
                                                         101, the length of the
                                                         array if 1 not found).

1
যদি আপনি শিরোনাম বিভাগটি ব্যবহার করতে আপত্তি করেন না, তবে এটি সম্ভবত আপনার উত্তরটি আরও সঠিকভাবে প্রদর্শন করবে
কনর ওব্রায়ান

@ কনরোও ব্রায়েন আমি মোটেও তা করি না - এটিকে কীভাবে ফরম্যাট করা যায় তা আমি সত্যিই জানতাম না (তবে আমি এখন থেকে আপনাকে চুরি করব)। ধন্যবাদ
কোল

1
একটি এন ওয়াই টি আমি ই আছি!
কনর ওব্রায়ান

1
38 বাইট সহ *i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]সমান হতে হবে
মাইল

4

সি (জিসিসি) , 75 বাইট

i,j;f(n){for(j=0;(i=n)&&j++<100;)for(n=0;i-1;++n)i=i&1?i*3+1:i/2;i=!i*j-1;}

পুনরাবৃত্তির -1জন্য ফিরে আসে n>=100

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

সি (জিসিসি) , 73 বাইট

i,j;f(n){for(j=-1;(i=n)&&j++<99;)for(n=0;i-1;++n)i=i&1?i*3+1:i/2;i=!i*j;}

পুনরাবৃত্তির 0জন্য ফিরে আসে n>=100

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


3

জাভাস্ক্রিপ্ট (ES6), 57 বাইট

ফেরত পাঠায় trueযখন এটি ব্যর্থ। রিটার্নস 0জন্য 1

f=(n,k=i=0)=>n>1?f(n&1?n*3+1:n/2,k+1):k?i>99||f(k,!++i):i

পরীক্ষার মামলা


যদি আপনার প্রোগ্রামটি ওভারফ্লো / অসম্পূর্ণতা বাদে সঠিক ফলাফল গণনা করে বা এর পরিবর্তে ওপি অনুরূপ সংখ্যক বাস্তবায়ন সহ একটি ভাষা ব্যবহার করে তাদের ফলাফল প্রাপ্ত করে (তবে আমি ধরে নিই যে তারা সমস্ত পরীক্ষার কেস হাতে হাতে গণনা করেনি) তবে আমি সন্দেহবাদী ।
জোনাথন ফ্রেচ 8'18

পুনঃটুইট দেখা যাচ্ছে উভয় ফলাফলই সমানভাবে অবৈধ।
আর্নৌলদ

3

এপিএল (ডায়ালগ ইউনিকোড) , 39 60 53 52 49 বাইট

-৩ বাইটস @ জিএনএনকে ধন্যবাদ

0∘{99<⍺:⋄1=⍵:01+(⍺+1)∇{1=⍵:01+∇⊃⍵⌽0 1+.5 3×⍵}⍵}

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

কোলাটজ এর জন্য @ জিএন কোড ব্যবহার করে তবে আগে ইউরিয়েলের কোড ব্যবহার করা হয়েছে।

এখানে পুরানো সংস্করণ যা স্পেসিফিকেশনটি পূরণ করে নি:

{1=⍵:01+∇{1=⍵:02|⍵:1+∇1+3×⍵⋄1+∇⍵÷2}⍵}

2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2->1+∇⊃⍵⌽0 1+.5 3×⍵
এনজিএন


2

হুশ , 21 বাইট

←€1↑101¡ȯ←€1¡?½o→*3¦2

এটি অনলাইন চেষ্টা করুন! ইনপুটে -1ব্যর্থতায় ফিরে আসে ।01

ব্যাখ্যা

←€1↑101¡ȯ←€1¡?½o→*3¦2  Implicit input (a number).
             ?½o→*3¦2  Collatz function:
             ?     ¦2   if divisible by 2,
              ½         then halve,
               o→*3     else multiply by 3 and increment.
        ȯ←€1¡?½o→*3¦2  Count Collatz steps:
            ¡           iterate Collatz function and collect results in infinite list,
          €1            get 1-based index of 1,
        ȯ←              decrement.
       ¡               Iterate this function on input,
   ↑101                take first 101 values (initial value and 100 iterations),
←€1                    get index of 1 and decrement.

2

সি (জিসিসি) , 70 73 বাইট

g(x){x=x-1?g(x%2?3*x+1:x/2)+1:0;}f(x,m){for(m=0;(x=g(x))&&100>m++;);x=m;}

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

101পুনরাবৃত্তির সংখ্যা 100 ছাড়িয়ে গেলে ফিরে আসে।


1
পিপিসিজিতে আপনাকে স্বাগতম! এই উত্তরটি নয় বেশ কারণ, বৈধ সব ফাংশন জমা পুনর্ব্যবহারযোগ্য হতে হবে । আমি তোমাদের ঢোকাতে এটিকে ঠিক করতে পারেন মনে m=0আপনার মধ্যে f(বর্তমানে খালি সম্ভবত উপার্জন ব্যবহার forintiailiser একজন সংরক্ষণ করতে ;)।
মার্টিন এন্ডার

2

পরিষ্কার , 146 ... 86 বাইট

-11 বাইট ধন্যবাদ আর্জন জোহানসেনকে ধন্যবাদ

import StdEnv
?f l n=hd[u\\1<-iterate f n&u<-l]

?(?(\b|isOdd b=3*b+1=b/2)[0..])[0..99]

আংশিক ফাংশন আক্ষরিক হিসাবে।

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

সঙ্গে aborts hd of []যদি পুনরাবৃত্তিও সংখ্যা 100 ছাড়িয়ে গেছে
সঙ্গে প্রস্থান Heap Fullজন্য ~ উপরে ইনপুট 2^23যদি না আপনি একটি বৃহত্তর গাদা আকার উল্লেখ করুন।


1
আমি আপনার উত্তরগুলি থেকে কিছু ক্লিন সিনট্যাক্স (যেমন এটি হাস্কেলের চেয়ে পৃথক) বুঝতে শুরু করছি ... আপনি কোনও সহায়ক ফাংশন দিয়ে এটি সংক্ষিপ্ত করতে পারেন j f l n=hd[u\\1<-iterate f n&u<-l]
janrjan জোহানসেন

@ আরজান জোহানসেন ধন্যবাদ!
5urous

আপনার \a=...aঅংশের দরকার নেই , এটি কারি করে। (অথবা ETA হ্রাস করা হয়।)
Orjan Johansen

@ আরজান জোহেনসেন ওহ, মিস করেছেন, ধন্যবাদ!
4urous

1

পাইথন 2 , 99 98 97 বাইট

  • এর c and t or fপরিবর্তে ব্যবহার করে একটি বাইট সংরক্ষণ করা হয়েছে t if c else f
  • আউটপুট -1পরিবর্তে fবা 'f'অ-থামানো ইনপুটগুলির জন্য একটি বাইট সংরক্ষণ করা হয়েছে ।
exec"f,F="+"lambda n,i=0:n<2and i or %s"*2%("f([n/2,3*n+1][n%2],-~i),","i>99and-1or F(f(n),-~i)")

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



1

আর , 119 107 বাইট

আংশিকভাবে এখান থেকে জারকো ডাবল্ডামের কোলাটজ কোডটি ব্যবহার করে । রিটার্নস 0> 100 পুনরাবৃত্তিও (ব্যর্থতা) জন্য।

pryr::f(x,{N=n=0
while(x-1){while(x-1){x=`if`(x%%2,3*x+1,x/2);n=n+1}
x=n
n=0
N=N+1
if(N==100)return(0)}
N})

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


1

এপিএল NARS, 115 বাইট, 63 টি অক্ষর rs

{d←0⋄{⍵=1:d⋄99<d+←1:¯1⋄∇{c←0⋄{1=⍵:c⋄c+←1⋄2∣⍵:∇1+3×⍵⋄∇⍵÷2}⍵}⍵}⍵}

সম্ভবত লুপগুলি ব্যবহার করা এটি আরও স্পষ্ট হবে ... এখানে 4 টি ফাংশন রয়েছে, 2 নেস্টেড এবং রিসরসিভ, এবং প্রথমটি কেবলমাত্র 0 = সংজ্ঞায়িত করা এবং আরম্ভ করার জন্য, পরিবর্তনশীল ডি, 2 তম ফাংশন থেকে গ্লোবাল ভেরিয়েবল কাউন্টার হিসাবে দেখা হয়।

q←{c←0⋄{1=⍵:c⋄c+←1⋄2∣⍵:∇1+3×⍵⋄∇⍵÷2}⍵}

এই 3 তম ফাংশনটি এমন ফাংশন হবে যা তার আর্গের জন্য কোলাটজ অনুমানের সমাধানের জন্য কতগুলি কল রয়েছে তা ফিরিয়ে দেবে

{⍵=1:d⋄99<d+←1:¯1⋄∇q⍵}

এটি 2 তম ফাংশন, যদি এর আরগ = 1 থাকে তবে এটির পুনরাবৃত্তি বন্ধ করে ফিরে আসবে এবং যাকে নিজেকে -1 বলা হয় সেই সময়ের সংখ্যা; অন্যথায় যদি নিজেকে 99 বারের বেশি বলা হয় তবে এটির পুনরাবৃত্তি বন্ধ করুন এবং ফিরে আসা -1 (ব্যর্থ) অন্যথায় তার আরগের জন্য কোলাটজ অনুমান গণনা করুন এবং কোলাটজ সিকোয়েন্স দৈর্ঘ্যের মানটির জন্য নিজেকে কল করুন। আমার জন্য এমনকি যদি এই সমস্তটি চালানো একটি বড় সমস্যা হতে পারে যদি গ্লোবাল ভেরিয়েবল এবং একই নামের একটি ফাংশনে একটি ভেরিয়েবল সংজ্ঞায়িত করা হয়, যখন প্রোগ্রামার এটিকে কেবল স্থানীয় ভেরিয়েবল হিসাবে দেখায়।

  f←{d←0⋄{⍵=1:d⋄99<d+←1:¯1⋄∇{c←0⋄{1=⍵:c⋄c+←1⋄2∣⍵:∇1+3×⍵⋄∇⍵÷2}⍵}⍵}⍵}     
  f 2
1
  f 3
5
  f 5
¯1
  f 10
8
  f 100
13
  f 12313
7
  f 1
0

1

(ইমাস, সাধারণ, ...) লিস্প, 105 বাইট

পুনরাবৃত্তি> 100 এর জন্য টি প্রদান করে

(defun f(n k c)(or(> c 100)(if(= n 1)(if(= k 0)c(f k 0(1+ c)))(f(if(oddp
n)(+ n n n 1)(/ n 2))(1+ k)c))))

সম্প্রসারিত:

(defun f (n k c)
  (or (> c 100)
      (if (= n 1)
          (if (= k 0) c
            (f k 0 (1+ c)))
        (f (if (oddp n) (+ n n n 1) (/ n 2))
           (1+ k) c))))
(f (read) 0 0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.