অ্যাকারম্যান ফাংশন


35

একারম্যান ফাংশনটি মোট, গণনাযোগ্য ফাংশনের অন্যতম সহজ উদাহরণ হিসাবে উল্লেখযোগ্য যা আদিম পুনরাবৃত্তিযোগ্য নয়।

আমরা A(m,n)যেখানে দুটি নন-নেগেটিভ পূর্ণসংখ্যার গ্রহণের সংজ্ঞাটি ব্যবহার করব

A(0,n) = n+1
A(m,0) = A(m-1,1)
A(m,n) = A(m-1,A(m,n-1))

আপনি বাস্তবায়ন করতে পারেন

  • ইনপুট হিসাবে দুটি পূর্ণসংখ্যা গ্রহণ করে একটি নামযুক্ত বা বেনামে ফাংশন, কোনও পূর্ণসংখ্যা ফেরত দেয়, বা
  • STDIN- এ দুটি স্পেস- বা নিউলাইন-বিভাজিত পূর্ণসংখ্যক গ্রহণ করা একটি প্রোগ্রাম, STDOUT এ ফলাফল মুদ্রণ করে।

আপনি যদি কোনও লাইব্রেরি থেকে অ্যাকারম্যান ফাংশন বা হাইপার এক্সপেনসিয়েশন ফাংশন ব্যবহার করতে না পারেন তবে এটি উপস্থিত থাকলে আপনি অন্য কোনও লাইব্রেরি থেকে অন্য কোনও ফাংশন ব্যবহার করতে পারেন। নিয়মিত খণ্ডন অনুমোদিত allowed

আপনার ফাংশনটি অবশ্যই A(m,n)এক মিনিটেরও কম সময়ে m ≤ 3 এবং n ≤ 10 এর মান সন্ধান করতে সক্ষম হবে । এটি কমপক্ষে তাত্ত্বিকভাবে অন্য যে কোনও ইনপুটগুলিতে সমাপ্ত হতে হবে: প্রদত্ত অসীম স্ট্যাক স্পেস, একটি নেটিভ বিগিন্ট টাইপ এবং একটি নির্বিচারে দীর্ঘ সময়, এটি উত্তরটি ফিরিয়ে দেবে। সম্পাদনা: আপনার ভাষার যদি ডিফল্ট পুনরাবৃত্তি গভীরতা থাকে যা খুব সীমাবদ্ধ হয়, আপনি কোনও অক্ষর ব্যয় ছাড়াই এটি পুনরায় কনফিগার করতে পারেন।

সংক্ষিপ্ত সংখ্যক অক্ষরের সাথে জমা দেওয়া জেতা।

আপনার উত্তরটি যাচাই করার জন্য এখানে কিছু মান রয়েছে:

  A  | n=0     1     2     3     4     5     6     7     8     9    10
-----+-----------------------------------------------------------------
 m=0 |   1     2     3     4     5     6     7     8     9    10    11
   1 |   2     3     4     5     6     7     8     9    10    11    12
   2 |   3     5     7     9    11    13    15    17    19    21    23
   3 |   5    13    29    61   125   253   509  1021  2045  4093  8189
   4 |  13 65533   big   really big...

15
এর আগে কীভাবে জিজ্ঞাসা করা হয়নি ??
ক্যালভিনের

9
আমি মনে করি এই দ্রুততম কোডটি
Sp3000

22
ডাউনভোটিং কারণ এখানে কোনও চ্যালেঞ্জ নেই। সুস্পষ্ট উত্তর - কেবল নির্বোধভাবে ঠিক তার সংজ্ঞা অনুযায়ী ফাংশন বাস্তবায়ন - সর্বদা সেরা উত্তর হতে চলেছে। সুতরাং প্রশ্নটি কেবল "একারম্যানের কার্যকারিতার সুস্পষ্ট প্রকাশে কোন ভাষার কমপক্ষে অক্ষর রয়েছে?" সত্যিকারের বিজয়ী হ'ল প্রোগ্রামিং ভাষা, যে ব্যক্তি এতে স্পষ্ট প্রোগ্রামটি লিখেছিল তা নয়।
ডেভিড রিচার্বি

1
আমার ভাষার পুনরাবৃত্তি সীমাটি যদি কমের তুলনায় খুব কম হয় A(3,8)এবং অন্যদের মতো নির্লজ্জভাবে উপরে থাকে তবে কী হবে ? আমাকে কী পুনঃবিবর্তন সমাধান নিয়ে আসতে হবে, অথবা আমি এই ক্ষেত্রে কেবল "অসীম স্ট্যাক স্পেস ধরে নিতে" পারি? আমি মোটামুটি নিশ্চিত, এটি এক মিনিটের মধ্যেই শেষ হয়ে যাবে।
মার্টিন ইন্ডার

5
@ ডেভিডরিচার্বি "সুস্পষ্ট উত্তর [...] সর্বদা সেরা উত্তর হতে চলেছে।" এটি সব ভাষার ক্ষেত্রেই সত্য নয়। আমি কেবল নিজের ঘরের ভাষায় উদাহরণ রাখার জন্য আমি কিছুটা নোংরা অনুভব করি তবে একারম্যানকে প্রকাশ করার একাধিক উপায় রয়েছে এবং কিছু ভাষায় আপনি সেই সত্যটি ব্যবহার করে সঞ্চয় পেতে পারেন। এই চ্যালেঞ্জ জন্য আমার উদ্দেশ্য ছিল।
অ্যালগরিদমশর্ক

উত্তর:


7

পাইথ , 19

DaGHR?atG?aGtHH1GhH

সংজ্ঞায়িত করে a, যা অ্যাকারম্যান ফাংশন হিসাবে কাজ করে। নোট করুন যে এটির জন্য আজ অবধি সরকারী পাইথ সংকলককে গণনা করার অনুমতি দেওয়া হয়েছে তার চেয়ে বেশি সংখ্যক পুনরাবৃত্তির গভীরতা প্রয়োজন a 3 10, তাই আমি পুনরাবৃত্তির গভীরতা বাড়িয়েছি। এটি ভাষার সংশোধন নয়, কেবল সংকলক।

টেস্ট:

$ time pyth -c "DaGHR?atG?aGtHH1GhH           ;a 3 10"
8189

real    0m0.092s
user    0m0.088s
sys     0m0.000s

ব্যাখ্যা:

DaGH                     def a(G,H):
    R                    return
    ?          G                (if G:
     atG                              (a(G-1,
        ?    H                               (if H:
         aGtH                                      a(G,H-1)
              1                               else:1)
                hH               else:H+1)

মূলত, এটির সত্য মানের উপর প্রথম শর্ত G H + 1 পুনরাবৃত্তি করতে হবে বা ফেরত দেওয়া উচিত কিনা । যদি এটি পুনরাবৃত্তি হয় তবে প্রথম যুক্তিটি সর্বদা জি -1 থাকে এবং এটি দ্বিতীয় যুক্তি হিসাবে ব্যবহার করতে হবে বা দ্বিতীয় যুক্তি হিসাবে Hব্যবহার করা উচিত কিনা তার সত্যিকারের মানটির উপর শর্ত দেয় ।a(G,H-1)1


আধুনিক Pyth আমি আপনাকে বেশী বা কম পরিবর্তন করতে পারেন মনে (আমি এই চ্যালেঞ্জ পরে যোগ করা হয়েছিল অনুমান) DaGHRথেকে Mএবং aথেকে g। ( ?পরিবর্তনের জন্য আর্গুমেন্টের ক্রম কি হয়েছে ?)
লিন

@ মরিস হ্যাঁ, আপনি Mপরিবর্তে ব্যবহার করতে পারেন , এবং হ্যাঁ, ?যুক্তির ক্রম পরিবর্তন হয়েছে। এটি এখন অবস্থা, সত্য, মিথ্যা। এটা সত্য, শর্ত, মিথ্যা ছিল।
isaacg

@ লিন ফান পাইথের ইতিহাসের তথ্য: এই প্রশ্নটি আসলে পাইথ সম্পর্কে দুটি জিনিস (কমপক্ষে) পরিবর্তন করতে আইস্যাককে প্রভাবিত করেছিল: পুনরাবৃত্তি সীমা এবং এতে পরিবর্তনM !
FryAmTheEggman

23

হাস্কেল, 35

0%n=1+n
m%n=iterate((m-1)%)1!!(n+1)

এটি অপারেটর ফাংশন সংজ্ঞায়িত করে %

যে ঠাহর করে এই কাজ m%n(যেখানে aআকারম্যান ফাংশন) অশূন্য জন্য mকরা হয় (m-1)%প্রয়োগ n+1বার 1। উদাহরণস্বরূপ, যা 3%2হিসাবে সংজ্ঞায়িত করা 2%(3%1)হয় 2%(2%(3%0)), এবং এটি হয়2%(2%(2%1))


অগ্রাধিকারের 0%nবদলে আমি খুব খারাপ ব্যবহার করতে পারি নাn+1
গর্বিত হাসেলেলার


বাহ, এত দিন ধরে এটি ভুল ছিল, এবং আমি সহ কেউই খেয়াল করেনি? ভাল কাজ. সুতরাং দেখে মনে হচ্ছে আমি ভুল করে উত্তরটির প্রথম সংস্করণটি অনুলিপি করেছিলাম, যা ত্রুটিযুক্ত ছিল, সম্ভবত ভুল করে বা কারণ আমি ভেবেছিলাম এটি কার্যকর হয়েছে।
গর্বিত হাসেল্লার

12

গল্ফস্ক্রিপ্ট (30)

{1$1>{1\){1$(\A}*\;}{+)}if}:A;

অনলাইন ডেমো

1>(কোন বিশেষ-ক্ষেত্রে A(1, n)) ছাড়াই এটি গণনা করতে 9 মিনিট সময় নেয়A(3, 10) কম্পিউটারটি পরীক্ষা করে দেখার জন্য এটি । এই বিশেষ ক্ষেত্রে এটি এত দ্রুত যে অনলাইন ডেমোটি 10 ​​সেকেন্ডেরও কম সময় নেয়।

মনে রাখবেন যে এটি সংজ্ঞাটির একটি নিখুঁত অনুবাদ নয় । পুনরাবৃত্তির গভীরতা দ্বারা আবদ্ধ m

ব্যবচ্ছেদ

{             # Function boilerplate
  1$          # Get a copy of m: stack holds m n m
  1>{         # (Optimisation): if m is greater than 1
    1         #   Take this as the value of A(m, -1)
    \){       #   Repeat n+1 times:
              #     Stack: m A(m, i-1)
      1$(\    #     Stack: m m-1 A(m, i-1)
      A       #     Stack: m A(m, i)
    }*
    \;        #   Lose that unwanted copy of m
  }{          # Else
    +)        #   A(m in {0, 1}, n) = m + n + 1
  }if
}:A;          # Function boilerplate

সিজেমে আপনার প্রয়োজন হবে না 1>। অপসারণ (এবং পরিবর্তন করার পরে ifকরতে ?), কম্পিউটিং 3 10 Aজাভা ব্যাখ্যাকারী সঙ্গে ছয় সেকেন্ড অনলাইন অনুবাদক সঙ্গে 110 সেকেন্ড এবং সময় লাগে।
ডেনিস

7

বাইনারি ল্যাম্বদা ক্যালকুলাস , 54 বিট = 6.75 বাইট

Hexdump:

00000000: 1607 2d88 072f 68                        ..-../h

বাইনারি:

000101100000011100101101100010000000011100101111011010

এটি মিmg । λ ng ( n g 1)) (λ n । λ f । λ xf ( n f x )), যেখানে সমস্ত সংখ্যা চার্চ সংখ্যা হিসাবে প্রতিনিধিত্ব করা হয় ।


6

জাভাস্ক্রিপ্ট, ES6, 41 34 বাইট

f=(m,n)=>m?f(m-1,!n||f(m,n-1)):n+1

এটি সর্বশেষতম ফায়ারফক্স কনসোলে চালান এবং এটি এমন একটি ফাংশন তৈরি করবে fযা আপনি বিভিন্ন মান mএবং nপছন্দ মতো কল করতে পারেন

f(3,2) // returns 29

অথবা

একটি সর্বশেষতম ফায়ারফক্সে নীচের কোডটি ব্যবহার করে দেখুন

f=(m,n)=>m?f(m-1,!n||f(m,n-1)):n+1

B.onclick=_=>alert(f(+M.value, +N.value))
#M,#N{max-width:15px;border: 1px solid;border-width:0 0 1px 0}
<div>f(<input id=M />,<input id=N />)</div><br><button id=B>Evaluate</button>


Chrome এ 0,1 দিয়ে এটি পরীক্ষা করা কোনও ফল দেয় না।
Nzall

3
অনুগ্রহ করে পড়ুন, এটি কেবলমাত্র ES6 এর কারণে সর্বশেষতম ফায়ারফক্সে কাজ করে
অপ্টিমাইজার

বাহ ... আমাদের 34 টি বাইটে প্রায় 4 টি কার্যত অভিন্ন জেএস সমাধান রয়েছে। আমি এর আগে কখনও দেখিনি।
ETH প্রোডাকশনস

6

পাইথন 2.7.8 - 80, 54, 48, 46 45

A=lambda m,n:m and A(m-1,n<1or A(m,n-1))or-~n

(ক্রেডিটস xnor!)

আরও পাঠযোগ্য, তবে আরও 1 টি অক্ষর সহ:

A=lambda m,n:n+(m<1or A(m-1,n<1or A(m,n-1))-n)

এমন নয় যে এর sys.setrecursionlimit(10000)ফলাফল পাওয়ার জন্য আমাকে সেট করতে হয়েছিল A(3,10)। লজিক্যাল ইনডেক্সিং ব্যবহার করে আরও গল্ফিং নাটকীয়ভাবে ক্রমবর্ধমান পুনরাবৃত্তির গভীরতার কারণে কাজ করে না।


আমি এর উপর একটি সিনট্যাক্স ত্রুটি পেয়েছি 1else। শুরুর চিঠিটি eপার্সারের জন্য সমস্যা সৃষ্টি করে কারণ সংখ্যাগুলি যেমন লেখা যায় 1e3
xnor

এতে কয়েকটি চর স্যুইচ করা হয়েছে and/or:A=lambda m,n:m and A(m-1,n<1or A(m,n-1))or-~n
xnor

@ এক্সনর: টিপটির জন্য ধন্যবাদ! পার্সিং ইস্যু ইস্যু জন্য এই আলোচনা দেখুন । পাইথন ২.7.৮ গ্রহণ করে 1else, বেশিরভাগ অন্যান্য সংস্করণ তা গ্রহণ করে না।
ফালকো

সম্পর্কে পয়েন্টার জন্য ধন্যবাদ 1else; এটি আমাকে এখানে একটি চর এবং সম্ভবত অন্যান্য জায়গাগুলি চেপে ধরতে দেয়। কিন্তু এটির সংস্করণ নির্দিষ্ট কি! পাইথন 2.7.4 এটি অনুমতি দেয় না। আপনি কি ২.7.৮ সহ একটি অনলাইন সংস্করণ ব্যবহার করছেন বা আমাকে এটি ডাউনলোড করতে হবে?
xnor

@ এক্সনর: এটি একটি অফলাইন ইনস্টলেশন। আইডোন.কম , যেমন, পার্স করতে ব্যর্থ 1else
ফালকো

6

জে - 26 চর

($:^:(<:@[`]`1:)^:(0<[)>:)

একারম্যানের একটি বিকল্প, আরও কার্যকরী সংজ্ঞা রয়েছে:

Ack 0 n = n+1
Ack m n = Iter (Ack (m-1)) n
Iter f 0 = f 1
Iter f n = f (Iter f (n-1))

যদি এমন হয় যে Iterজে লিখতে করা খুব সহজ, কারণ জে কথা প্রসঙ্গে একটি উপায় আছে m-1করতে Ackএবং প্রাথমিক মান নির্ধারণ করতে Iter1. বিস্ফোরণ দ্বারা ব্যাখ্যা করা হবে:

(                      >:)  NB. increment n
                ^:(0<[)     NB. if m=0, do nothing to n+1; else:
   ^:                       NB. iterate...
($:                      )  NB.   self ($: is recursion)
     (<:@[     )            NB.   with left arg m-1
          `]                NB.   n+1 times
            `1:             NB.   starting on 1

এটি জে ^:জরান্দ রূপকে কী বলে - তার উপর নির্ভর করে — মূলত একটি সারণী (বিন্দু মুক্ত) ফ্যাশনে সমস্ত সীমাতে আরও নিয়ন্ত্রণের উপায়।

REPL এ:

   3 ($:^:(<:@[`]`1:)^:(0<[)>:) 3
61
   ack =: ($:^:(<:@[`]`1:)^:(0<[)>:)
   (i.4) ack"0 table (i.11)
+-----+------------------------------------------+
|ack"0|0  1  2  3   4   5   6    7    8    9   10|
+-----+------------------------------------------+
|0    |1  2  3  4   5   6   7    8    9   10   11|
|1    |2  3  4  5   6   7   8    9   10   11   12|
|2    |3  5  7  9  11  13  15   17   19   21   23|
|3    |5 13 29 61 125 253 509 1021 2045 4093 8189|
+-----+------------------------------------------+
   6!:2 '3 ($:^:(<:@[`]`1:)^:(0<[)>:) 10'  NB. snugly fits in a minute
58.5831

ackএটি একটি টেবিলের মধ্যে রাখতে সক্ষম হওয়ার জন্য আমাদের নাম দিয়ে সংজ্ঞা দেওয়া দরকার , কারণ $:এটি একটি ভয়ঙ্কর, কুরুচিপূর্ণ জন্তু এবং যে কেউ এটি বোঝার চেষ্টা করে তাকে আঘাত করে। এটি স্ব-রেফারেন্স, যেখানে স্বটি এটি সংবলিত বৃহত্তম ক্রিয়া বাক্যাংশ হিসাবে সংজ্ঞায়িত করা হয়। tableএকটি বিশেষণ এবং তাই আপনি যদি এটি সুযোগ দেন তবে ক্রিয়াপদের বাক্যাংশের অংশ হয়ে উঠতে পছন্দ করেন, সুতরাং $:এটি ব্যবহারের জন্য আপনাকে একটি নামী সংজ্ঞায় আটকাতে হবে।


সম্পাদনা: 24 চর?

বছরগুলি পরে, আমি একটি সমাধান পেয়েছি যা দুটি চরিত্রের চেয়ে কম।

(0&<~(<:@#~$:/@,1:^:)>:)

এটি অনেক ধীরে ধীরে: যদিও 3 ack 8আমার মেশিনে এক মিনিট সময় নেয়। এটি কারণ (1) আমি /পুনরাবৃত্তির পরিবর্তে একটি ভাঁজ ব্যবহার করি , সুতরাং জে সম্ভবত স্বাভাবিকের চেয়ে আরও বেশি কিছু মনে রাখতে হবে এবং (2) 0&<~একই গণনা সম্পাদন করার সময় (0<[), যখন অনুরোধ করা হয় তখন পুনরাবৃত্ত পদক্ষেপ নেওয়ার আগে এটি সম্পাদিত n+1সময়ে ঘটে - ঘটে যায় আদর্শবান হতে, সুতরাং এটি গণনাটি নষ্ট করে না, তবে বড় দ্রুত হয় এবং অত্যন্ত পুনরাবৃত্ত হয়।m ack n0&<nack

আমি সন্দেহবাদী যে আরও শক্তিশালী মেশিনটি নতুন কোডটি এক মিনিটের মধ্যে চাপ দিতে পারে, কারণ এটি এমন একটি কম্পিউটার যেখানে পুরানো কোডটি 3 ack 1015 সেকেন্ডেরও কম সময়ে খুঁজে পেতে পারে ।


5

সি - 41 বাইট

এটি কিছুই নয় - ছোট সীমা মানে এই যে সমস্ত প্রয়োজনীয় মানগুলি নির্বিঘ্নে ফাংশন সংজ্ঞা অনুসরণ করে 1 সেকেন্ডেরও কম সময়ে গণনা করা যায়।

A(m,n){return!m?n+1:A(m-1,n?A(m,n-1):1);}


int main()
{
    int m,n;
    for(m = 0; m <= 3; m++)
    for(n = 0; n <= 10; n++)
    printf("%d %d %d\n", m,n,A(m,n));
    return 0;
}

5

জাভাস্ক্রিপ্ট ES6 (34)

a=(m,n)=>m?a(m-1,n?a(m,n-1):1):n+1

বাস্তবায়ন:

a=(m,n)=>m?a(m-1,n?a(m,n-1):1):n+1
td[colspan="2"] input{width: 100%;}
<table><tbody><tr><td>m=</td><td><input id="m" type="number" value="0" /></td></tr><tr><td>n=</td><td><input id="n" type="number" value="0" /></td></tr><tr><td colspan="2"><input type="button" value="Calculate!" onclick="document.getElementById('out').value=a(document.getElementById('m').value, document.getElementById('n').value)" /></td></tr><tr><td colspan="2"><input id="out" disabled="disabled" type="text" /></td></tr></tbody></table>


4

জাভাস্ক্রিপ্ট (ES6) - 34

A=(m,n)=>m?A(m-1,!n||A(m,n-1)):n+1

এবং একটি পরীক্ষা:

> A=(m,n)=>m?A(m-1,!n||A(m,n-1)):n+1;s=new Date().getTime();console.log(A(3,10),(new Date().getTime() - s)/1000)
8189 16.441

3

কক, 40

nat_rec _ S(fun _ b n=>nat_iter(S n)b 1)

এটি টাইপ একটি ফাংশন nat -> nat -> nat। যেহেতু কক কেবলমাত্র মোট ফাংশনগুলি তৈরির অনুমতি দেয় তাই এটি একটি আনুষ্ঠানিক প্রমাণ হিসাবেও কাজ করে যে একারম্যান পুনরাবৃত্তিটি সুপ্রতিষ্ঠিত।

ডেমো:

Welcome to Coq 8.4pl6 (November 2015)

Coq < Compute nat_rec _ S(fun _ b n=>nat_iter(S n)b 1) 3 10.
     = 8189
     : nat

দ্রষ্টব্য: এই চ্যালেঞ্জের পরে প্রকাশিত কক 8.5, এর নতুন নামকরণ nat_iterহয়েছে Nat.iter



2

গণিত, 46 বাইট

0~a~n_:=n+1
m_~a~n_:=a[m-1,If[n<1,1,a[m,n-1]]]

এক মিনিটের জন্য ঠিক অনেক সময় নেয় a[3,10]। নোট করুন যে ম্যাথামেটিকার ডিফল্ট পুনরাবৃত্তি সীমাটি এর a[3,8]বাইরে বা তার বাইরে খুব কম (কমপক্ষে আমার মেশিনে), তবে এটি কনফিগার করে স্থির করা যেতে পারে

$RecursionLimit = Infinity

1
বাহ, সুতরাং আপনি কি বলছেন যে জেএস ম্যাথমেটিকার চেয়ে 25 গুণ বেশি দ্রুত?
অপ্টিমাইজার

@ অপ্টিমাইজারটি অন্তত যখন পুনরাবৃত্তি করার কথা আসে ... আমার মনে হয় অংশটি যদি এটি হয় যে এটি প্রতিবার ব্যবহার করা উচিত যা সংজ্ঞাটি ব্যবহার করা উচিত, এবং Ifএকটি ফাংশন হওয়া আরও ধীর হয় is
মার্টিন ইন্ডার

1
স্মৃতিচারণের সাথে, এটি 0.07 সেকেন্ড সময় নেয়। অর্থ m_~a~n_:=m~a~n=...
মার্ক অ্যাডলার

@ মার্কএডলার ম্যাথমেটিকায় স্মৃতিচারণ করার সত্যিই দুর্দান্ত উপায়!
মার্টিন ইন্ডার

2

ল্যাম্বডাস সহ জাভাস্ক্রিপ্ট, 34

A=(m,n)=>m?A(m-1,n?A(m,n-1):1):n+1

একটি টিপিক্যাল উত্তর, কিছু ছোট করা যায় না।


2

Haskell,, 48 44 টি অক্ষর (তালিকার জন্য 36)

অন্যান্য হাস্কেল সমাধানের মতো সংক্ষিপ্ত না হলেও এটি একটি উল্লেখযোগ্য কারণ এটি একারম্যান ফাংশনটিকে একটি অসীম তালিকা হিসাবে প্রকাশ করে, যা আমি মনে করি যে এটি খুব পরিষ্কার ne ফলাফলটি একটি অসীম তালিকা (অসীম তালিকার) যেমন অবস্থানে [এম, এন] এটি এ (এম, এন) এর মান ধারণ করে ।

অসীম তালিকা নিজেই:

iterate(tail.(`iterate`1).(!!))[1..]

একটি ফাংশন হিসাবে (স্পেসিফিকেশন মেনে চলার জন্য):

i=iterate;m%n=i(tail.(`i`1).(!!))[1..]!!m!!n

অ্যাকারম্যান ফাংশনটির জন্য সাধারণ / সাধারণ ক্ষেত্রে উপরের সারিতে সূচক হিসাবে বাম দিকের মানটি ব্যবহার করা হয় তা পর্যবেক্ষণ করে সূত্রটি তৈরি করা হয়েছিল। এই পুনরাবৃত্তির জন্য বেস কেস (অর্থাত্ একটি সারির বামতম কলাম, অর্থাৎ A (মি, 0) ) উপরের সারিতে দ্বিতীয় বাম-সর্বাধিক মানটি ব্যবহার করতে হবে। জন্য বেস কেস যে পুনরাবৃত্তির হয় একটি (0, এন) = ঢ + 1 টি মামলা, অর্থাত প্রথম সারিতে রয়েছে [1..]

সুতরাং, আমরা পেতে

let a0 = [1..]
let a1 = tail $ iterate (a0 !!) 1  -- 'tail' because iterate starts by applying
let a2 = tail $ iterate (a1 !!) 1  -- the function 0 times
-- etc

তারপরে আমরা কেবল সেই প্যাটার্নের ভিত্তিতে পুনরাবৃত্তির আরও একটি স্তর যুক্ত করি এবং কিছু অর্থহীন জাগলিং করি।


আপনি উপনাম করতে পারেন iterate একটি একক অক্ষরের নাম দিতে পারেন যেমনi=iterate;ack=i ...
গর্বিত হাসেলেলার

@ প্রফেসহেস্কিলার ওহ হ্যাঁ, সে সম্পর্কে ভাবেন নি। ধন্যবাদ! আপনার অপারেটর-নাম ব্যবহারও ধার করা।
ফায়ার

2

টিন লিস্প , 70 (প্রতিযোগিতার বাইরে)

এটি প্রতিযোগিতার বাইরে চলে যায়, কারণ ভাষা প্রশ্নের চেয়ে নতুন এবং এটি (A 3 10)একটি স্ট্যাক ওভারফ্লোর কারণে প্রশ্নে প্রয়োজনীয়ভাবে চালাতেও সফল হয় না ।

(d A(q((m n)(i m(i n(A(s m 1)(A m(s n 1)))(A(s m 1)1))(s n(s 0 1))))))

এটি এমন একটি ফাংশন সংজ্ঞায়িত করে Aযা অ্যাকারম্যান ফাংশন গণনা করে। বিন্যাসকৃত:

(d A
   (q( (m n)
       (i m
          (i n
             (A (s m 1)
                (A m
                   (s n 1)
                 )
              ) 
             (A (s m 1)
                1
              )
           )
          (s n
             (s 0 1)
           )
        )
    ) )
 )

আমরা এখানে সমস্ত বিল্টিন ম্যাক্রো ( d(সংজ্ঞায়িত) এবং q(উদ্ধৃতি) এবং i(যদি)) এবং একটি বিল্টিন ফাংশন ( s- বিয়োগ) ব্যবহার করছি।

i যখন শর্তটি একটি সংখ্যা> 0 (এবং অন্যথায় মিথ্যা অংশ) হয় তখন এর আসল অংশটি সম্পাদন করে, সুতরাং আমাদের এখানে একটি সুস্পষ্ট তুলনা করতে হবে না।

sএকমাত্র গাণিতিক অপারেশন উপলব্ধ, আমরা এটি n-1/ / তে m-1পাশাপাশি ব্যবহার করি(s n (s 0 1)) ব্যবহার করি n+1

ক্ষুদ্র লিপ্প টেল রিকার্সন অপটিমাইজেশন ব্যবহার করছে তবে এটি কেবল বাইরের জন্য সহায়তা করে A ফলাফলের মধ্যে কলের A(m, n-1)জন্য সহায়তা করে, পরামিতিগুলির জন্য ব্যবহৃত কলটির জন্য নয় ।

জেভিএম-এ সিলেনে আমার ছোট্ট লিস্প প্রয়োগের সাথে সাথে এটি কাজ করে (A 3 5) = 253তবে গণনা করার চেষ্টা করার সময় তা ভেঙে যায় বলে মনে হয়(A 2 125) সরাসরি (যা একই ফলাফল দেয়)। যদি তার পরে গণনা করা হয়(A 3 4) = 125 , জেভিএম মনে হয় আমার ইন্টারপ্রেটারে কিছু ইন্টারমিডিয়েট ফাংশন কলগুলি ইনলাইন করার জন্য ফাংশনগুলিকে পর্যাপ্ততর করতে পারে যা আরও পুনরাবৃত্তির গভীরতা দেয়। স্ট্রেঞ্জ।

রেফারেন্স বাস্তবায়ন পর্যন্ত পায় (A 3 5) = 253এবং (A 2 163) = 329, কিন্তু সফল না(A 2 164) এমনকি কম, সেইজন্য এবং (A 3 6) = (A 2 253)


এটি হোয়াইট স্পেস এবং প্রথম বন্ধনের জন্য প্রতিযোগিতামূলক হতে পারে;)
বিড়াল

2

যান, 260 243 240 122 বাইট

আমি দেখতে পেলাম না যে প্রশ্নটি আনন ফানকে অনুমতি দিয়েছে।

প্রতিযোগিতা থেকে অনেক দূরে তবে আমি এই ভাষাটি শিখছি এবং আমি এটি পরীক্ষা করে দেখতে চাই।

func (m,n int)int{r:=0
switch{case m==0&&n!=0:r=n+1
case m!=0&&n==0:r=a(m-1,1)
case m!=0&&n!=0:r=a(m-1,a(m,n-1))}
return r}

এটির মতো ব্যবহার করুন go run ack.goএবং তারপরে দুটি সংখ্যা সরবরাহ করুন,m এবংn । যদি এম> 4 বা n> 30 হয়, কার্যকর করার সময়টি আধ মিনিটের বেশি হতে পারে।

জন্য m=3 n=11:

$ time go run ack
16381
real    0m1.434s
user    0m1.432s
sys     0m0.004s

সম্পাদনা করুন : switchওভার if/elseএবং ডট-আমদানিতে স্যুইচ করে মোট 17 বাইট সংরক্ষণ করা হয়েছে


1
আপনি আরও ভাল করতে পারেন! switch 0 {case m:r=n+1 case n:r=a(m-1,1) default:r=a(m-1,a(m,n-1))}গোয়ের switchবক্তব্যটি এত সুন্দরভাবে নমনীয়!
এমবিলেম

@ এমবেলম ধন্যবাদ, আমি গোয়ের একটি লাইন লিখেছি এতদিন হয়ে গেছে, তবে অন্যান্য গো-গল্ফারদের সম্পর্কে দেখে আমি আনন্দিত: ডি
বিড়াল

1

হাস্কেল: 81 69 বাইট

a::Int->Int->Int
a 0 n=n+1
a m 0=a (m-1) 1
a m n=a (m-1) a m (n-1)

a 3 10 প্রায় 45 সেকেন্ড সময় নেয়।


1
এটি কোড গল্ফ, সুতরাং আপনার সংক্ষিপ্ততম কোডটি চেষ্টা করার চেষ্টা করা উচিত। উদাহরণস্বরূপ, অপ্রয়োজনীয় জায়গাগুলি এবং সুস্পষ্ট প্রকারটি অপসারণ করুন
অভিমানী হাসেলেলার

আপনি চতুর্থ লাইনে
পেরেনগুলিও



1

জুলিয়া, 34 31 28 বাইট

m\n=m>0?~-m\(n<1||m\~-n):n+1

এটি একটি নামবিহীন ফাংশন। জুলিয়ার অপারেটরদের নতুন করে সংজ্ঞায়িত করার ক্ষমতাকে অপব্যবহার করে এটি পুনরাবৃত্ত সংজ্ঞাটির একটি সরল বাস্তবায়ন

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


1

আর - 54 52

আমি এটি আর এর উপরে মাথা পেতে চেষ্টা করার অজুহাত হিসাবে ব্যবহার করেছি, সুতরাং এটি সম্ভবত খারাপভাবে করা হয়েছে :)

a=function(m,n)"if"(m,a(m-1,"if"(n,a(m,n-1),1)),n+1)

উদাহরণ রান

> a(3,8)
[1] 2045

এর বাইরে যে কোনও কিছুর জন্য আমি স্ট্যাক ওভারফ্লো পেয়েছি

টি এসকিউএল- 222

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

DECLARE @m INT=4,@n INT=1;WITH R AS(SELECT 2 C, 1 X UNION ALL   SELECT POWER(2,C),X+1FROM R)SELECT IIF(@m=0,@n+1,IIF(@m=1,@n+2,IIF(@m=2,2*@n+3,IIF(@m=3,POWER(2,@n+3)-3,IIF(@m=4,(SELECT TOP(1)C FROM R WHERE x= @n+3)-3,-1)))))

আপনার আর সাবমিসনের জন্য, দেখে মনে হচ্ছে আপনার প্রয়োজন {}নেই যদিও স্ট্যাকের ওভারফ্লো সীমাটি কোনও সহায়তা করছে না, যেহেতু আর টিসিও নেই ...
জিউসেপ্পে

@ জিউসেপ ধন্যবাদ ... আমার প্রতিরক্ষার জন্য, আমি তখন এটিতে নতুন ছিলাম :)
মিকিটি

1

ব্রেনফাক , 90 বাইট

>>>>+>,>,<<[>[>[-[->>>+<<<]<[->+>>+<<<]>-[-<+>]>+>>>>>]<[->+>>]]<[>>+[-<<<+>>>]<<-]<<<]>>.

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

সংখ্যা হিসাবে আইও সহ নির্বিচারে আকারের কক্ষের আকারের সাথে একটি বাস্তবায়ন অনুমান করে। -Negative বাইটস যদি আপনার নেতিবাচক কক্ষগুলি ব্যবহার করতে আপত্তি না থাকে।

সংযুক্ত ইন্টারপ্রেটারে 3,8 এর জন্য প্রায় 30 সেকেন্ডের মধ্যে শেষ হয়, আপনি সঠিক সেটিংসটিকে টিক দিন। সঙ্গে prepended ইনপুট সংখ্যা টাইপ করুন \গুলি, যেমন 3,9হয় \3\9


1

Tcl , 67 বাইট

proc tcl::mathfunc::A m\ n {expr {$m?A($m-1,$n?A($m,$n-1):1):$n+1}}

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


Tcl , 77 বাইট

proc A m\ n {expr {$m?[A [expr $m-1] [expr {$n?[A $m [expr $n-1]]:1}]]:$n+1}}

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

অনলাইন সংকলকটিতে এটি সময় আউট হওয়ার কারণে চলতে ব্যর্থ হয় তবে স্থানীয় টিসিএল দোভাষীতে এটি ভাল চলে runs আমি প্রতিটি রুট কলটির Aকার্যকারিতা করতে প্রোফাইল করেছি , প্রতিটি জোড়া {m,n}বিষয় পরীক্ষা করার জন্য গণনা কতটা সময় নিয়েছিল তা দেখার জন্য :

m=0, n=0, A=1, time=3.5e-5 seconds
m=0, n=1, A=2, time=2e-6 seconds
m=0, n=2, A=3, time=8e-6 seconds
m=0, n=3, A=4, time=1e-6 seconds
m=0, n=4, A=5, time=2e-6 seconds
m=0, n=5, A=6, time=1e-6 seconds
m=0, n=6, A=7, time=1e-6 seconds
m=0, n=7, A=8, time=1e-6 seconds
m=0, n=8, A=9, time=1e-6 seconds
m=0, n=9, A=10, time=0.0 seconds
m=0, n=10, A=11, time=1e-6 seconds
m=1, n=0, A=2, time=4e-6 seconds
m=1, n=1, A=3, time=6e-6 seconds
m=1, n=2, A=4, time=1e-5 seconds
m=1, n=3, A=5, time=1.2e-5 seconds
m=1, n=4, A=6, time=1.5e-5 seconds
m=1, n=5, A=7, time=2e-5 seconds
m=1, n=6, A=8, time=2e-5 seconds
m=1, n=7, A=9, time=2.6e-5 seconds
m=1, n=8, A=10, time=3e-5 seconds
m=1, n=9, A=11, time=3e-5 seconds
m=1, n=10, A=12, time=3.3e-5 seconds
m=2, n=0, A=3, time=8e-6 seconds
m=2, n=1, A=5, time=2.2e-5 seconds
m=2, n=2, A=7, time=3.9e-5 seconds
m=2, n=3, A=9, time=6.3e-5 seconds
m=2, n=4, A=11, time=9.1e-5 seconds
m=2, n=5, A=13, time=0.000124 seconds
m=2, n=6, A=15, time=0.000163 seconds
m=2, n=7, A=17, time=0.000213 seconds
m=2, n=8, A=19, time=0.000262 seconds
m=2, n=9, A=21, time=0.000316 seconds
m=2, n=10, A=23, time=0.000377 seconds
m=3, n=0, A=5, time=2.2e-5 seconds
m=3, n=1, A=13, time=0.000145 seconds
m=3, n=2, A=29, time=0.000745 seconds
m=3, n=3, A=61, time=0.003345 seconds
m=3, n=4, A=125, time=0.015048 seconds
m=3, n=5, A=253, time=0.059836 seconds
m=3, n=6, A=509, time=0.241431 seconds
m=3, n=7, A=1021, time=0.971836 seconds
m=3, n=8, A=2045, time=3.908884 seconds
m=3, n=9, A=4093, time=15.926341 seconds
m=3, n=10, A=8189, time=63.734713 seconds

এটি শেষ জুটির জন্য ব্যর্থ {m,n}={3,10} , কারণ এটি এক মিনিটেরও বেশি সময় নেয়।

উচ্চতর মানগুলির জন্য m, এটির recursionlimitমান বাড়ানো দরকার ।


আমি এটিকে 65 বাইটে সংক্ষিপ্ত করে তুলতে পারি, তবে এটি প্রশ্নের প্রয়োজনীয়তা পূরণ করতে পারে না "আপনার ফাংশনটি অবশ্যই এক মিনিটেরও কম সময়ের মধ্যে m ≤ 3 এবং n ≤ 10 এর জন্য এ (এম, এন) এর মান সন্ধান করতে সক্ষম হবে।" ছাড়া{}এটি টিআইওর সময়সীমা শেষ হবে এবং শেষ দুটি এন্ট্রিগুলির ডেমো করবে না।

Tcl , 65 বাইট

proc tcl::mathfunc::A m\ n {expr $m?A($m-1,$n?A($m,$n-1):1):$n+1}

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


0

জে: 50

>:@]`(1$:~<:@[)`(<:@[$:[$:_1+])@.(0>.[:<:@#.,&*)M.

0 ... 3 বনাম 0 ... 10 এর জন্য একটি সেকেন্ডের ভগ্নাংশে ফিরে আসে

   A=:>:@]`(1$:~<:@[)`(<:@[$:[$:_1+])@.(0>.[:<:@#.,&*)M.
   timespacex 'res=:(i.4) A"0 table (i.11)'
0.0336829 3.54035e6
   res
┌───┬──────────────────────────────────────────┐
│A"0│0  1  2  3   4   5   6    7    8    9   10│
├───┼──────────────────────────────────────────┤
│0  │1  2  3  4   5   6   7    8    9   10   11│
│1  │2  3  4  5   6   7   8    9   10   11   12│
│2  │3  5  7  9  11  13  15   17   19   21   23│
│3  │5 13 29 61 125 253 509 1021 2045 4093 8189│
└───┴──────────────────────────────────────────┘

পিএস: "0 প্রতিটি বাম এবং ডান অ্যারে গব্বল করার পরিবর্তে এবং দৈর্ঘ্যের ত্রুটিগুলি উত্পন্ন করার পরিবর্তে প্রতিটি একক উপাদানের উপর কাজ করার জন্য পরিবেশন করে But তবে এটির প্রয়োজন নেই যেমন 9 = 2 এ 3।


codegolf.stackexchange.com/a/40174/48934 আপনাকে মারধর করা হয়েছে!
ফাঁস নুন

0

এপিএল, 31

{⍺=0:⍵+1⋄⍵=0:1∇⍨⍺-1⋄(⍺-1)∇⍺∇⍵-1}

অনেকটাই অকপট. যুক্তিগুলি বিপরীত করে একবার বাইট সংরক্ষণ করতে ⍨ চরিত্রটি একবার ব্যবহার করে। বাম আর্গুমেন্ট হিসাবে m এবং ডান আর্গুমেন্ট হিসাবে গ্রহণ করে।

TryAPL.org


0

রুবি, 65

h,a={},->m,n{h[[m,n]]||=m<1?(n+1):(n<1?a[m-1,1]:a[m-1,a[m,n-1]])}

ব্যাখ্যা

সমস্যা বর্ণনায় প্রদত্ত অ্যালগরিদমের এটি একটি সহজ সরল অনুবাদ।

  • ইনপুটটিকে ল্যাম্বডায় আর্গুমেন্ট হিসাবে নেওয়া হয়। দুইInteger আশা করা হচ্ছে।
  • গতি এবং স্ট্যাক-ওভারফ্লো ত্রুটিগুলি এড়ানোর জন্য, উত্তরগুলি মেমোমাইজ করা হয় Hash h||=অপারেটর একটি মান যা পূর্বে গণনা করা হয় নি নিরূপণ করতে ব্যবহৃত হয়।

a[3,10] আমার মেশিনে ~ 0.1 সেকেন্ডে গণনা করা হয়।

এখানে একটি অবারিত সংস্করণ

h = {}
a = lambda do |m,n|
  h[[m,n]] ||= if m < 1 
    n + 1
  elsif n < 1
    a[m-1,1]
  else
    a[m-1,a[m,n-1]]
  end
end

a[3,10]আমার মেশিনে একটি সিস্টেমস্ট্যাকেরর ফেলে দিন ...
TuxCraftting

গল্ফের নিটপিক্স: আপনি এতে পরিবর্তন m<1?(n+1):(n<1?a[m-1,1]:a[m-1,a[m,n-1]])করতে পারেনm<1?n+1:a[m-1,n<1?1:a[m,n-1]]
কেবল সুন্দর আর্ট


0

জাভা, 274 বাইট

import java.math.*;class a{BigInteger A(BigInteger b,BigInteger B){if(b.equals(BigInteger.ZERO))return B.add(BigInteger.ONE);if(B.equals(BigInteger.ZERO))return A(b.subtract(BigInteger.ONE),BigInteger.ONE);return A(b.subtract(BigInteger.ONE),A(b,B.subtract(BigInteger.ONE)));}}

এটি A(3,10)কয়েক সেকেন্ডে গণনা করে , এবং অসীম স্মৃতি এবং স্ট্যাক স্পেস দিয়ে দেওয়া হয়, এটি যেকোন সংমিশ্রণের গণনা করতে পারে bএবং Bফলাফল যতক্ষণ না 2147483647 -1 এর নীচে থাকে ।


আমি জানি এটি কিছুক্ষণ হয়েছে, তবে আপনি 185 বাইটে এটি গল্ফ করতে পারেন :import java.math.*;BigInteger A(BigInteger b,BigInteger B){return b.equals(B.ZERO)?B.add(B.ONE):B.equals(B.ZERO)?A(b.subtract(B.ONE),B.ONE):A(b.subtract(B.ONE),A(b,B.subtract(B.ONE)));}
কেভিন ক্রুইজসেন

0

সিলোন, 88 87 85

alias I=>Integer;I a(I m,I n)=>m<1then n+1else(n<1then a(m-1,1)else a(m-1,a(m,n-1)));

এটি একটি সরল বাস্তবায়ন। বিন্যাসকৃত:

alias I => Integer;
I a(I m, I n) =>
        m < 1
        then n + 1
        else (n < 1
            then a(m - 1, 1)
            else a(m - 1, a(m, n - 1)));

ওরফে মাত্র একটি বাইট সংরক্ষণ করে, এটি ছাড়াই ( Integerপরিবর্তে লেখার মাধ্যমে I) আমরা 86 বাইটে উঠতে পারি। প্রতিস্থাপন == 0করে আরও দুটি বাইট সংরক্ষণ করা যায়< 1 দুইবার ।

এর ডিফল্ট সেটিংস সহ ceylon runএটি A(3,12) = 32765(এবং A(4,0) = 13) পর্যন্ত কাজ করবে তবে A(3,13)(এবং তাইও A(4,1)) স্ট্যাক ওভারফ্লো ত্রুটি নিক্ষেপ করবে। ( A(3,12)প্রায় 5 সেকেন্ড সময় লাগে,A(3,11) আমার কম্পিউটারে প্রায় 3।)

ব্যবহার ceylon run-js(অর্থাত Node.js জাভাস্ক্রিপ্ট করতে সংকলন ফল চলমান) হয় অনেক ধীর (1 মিনিট দরকার জন্য 19 গুলি A(3,10)জন্য ইতিমধ্যে), এবং বিরতিA(3, 11) 1 চলমান পরে একটি »সর্বোচ্চ কল স্ট্যাক আকারকে ছাড়িয়ে সঙ্গে« (ডিফল্ট সেটিংস ব্যবহার করে) মিনিট 30 এস।


পুনরাবৃত্তি ছাড়াই সিলোন, 228

বোনাস হিসাবে, এখানে একটি পুনরাবৃত্তিযোগ্য সংস্করণ রয়েছে (অবশ্যই দীর্ঘতর, তবে ওভারফ্লোগুলি স্ট্যাকের প্রতিরোধ ক্ষমতা - কোনও সময়ে স্মৃতি ছাড়িয়ে যেতে পারে)।

import ceylon.collection{A=ArrayList}Integer a(Integer[2]r){value s=A{*r};value p=s.addAll;while(true){if(exists m=s.pop()){if(exists n=s.pop()){if(n<1){p([m+1]);}else if(m<1){p([n-1,1]);}else{p([n-1,n,m-1]);}}else{return m;}}}}

বিন্যাসকৃত:

import ceylon.collection {
    A=ArrayList
}

Integer a(Integer[2] r) {
    value s = A { *r };
    value p = s.addAll;
    while (true) {
        if (exists m = s.pop()) {
            if (exists n = s.pop()) {
                if (n < 1) {
                    p([m + 1]);
                } else if (m < 1) {
                    p([n - 1, 1]);
                } else {
                    p([n - 1, n, m - 1]);
                }
            } else {
                // stack is empty
                return m;
            }
        }
    }
}

এটি আমার কম্পিউটারে পুনরাবৃত্ত সংস্করণের তুলনায় বেশ ধীর: A(3,11)9.5 সেকেন্ড A(3,12)সময় নেয়, 34 সেকেন্ড A(3,13)সময় নেয়, 2:08 মিনিট সময় নেয়,A(3,14) সময় নেয়, 8:25 মিনিট সময় নেয়। (আমার কাছে বর্তমানে আমার টিউপসগুলির পরিবর্তে অলস পুনরাবৃত্ত ব্যবহার করে একটি সংস্করণ ছিল যা একই আকার সহ আরও ধীর ছিল)।

কিছুটা দ্রুত (21 সেকেন্ডের জন্য A(3,12)) এর পরিবর্তে (তবে আরও একটি বাইট আরও দীর্ঘ) হ'ল একটি সংস্করণ , s.pushপরিবর্তে এটি ব্যবহার করে s.addAllতবে এটি একাধিক সংখ্যা যুক্ত করতে বেশ কয়েকবার কল করা প্রয়োজন, কারণ এতে প্রতিটি মাত্র একটি পূর্ণসংখ্যার প্রয়োজন। অ্যারেলিস্টের পরিবর্তে লিংকডলিস্ট ব্যবহার করা অনেক ধীর।

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