সংক্ষিপ্ত সংযোজন চেইন


23

সংযোজন শৃঙ্খলা 1 দিয়ে শুরু হওয়া পূর্ণসংখ্যার ক্রম, যেখানে প্রাথমিক 1 বাদে প্রতিটি পূর্ণসংখ্যার পূর্ববর্তী দুটি সংখ্যার যোগফল।

উদাহরণস্বরূপ, এখানে একটি সংযোজন শৃঙ্খলা রয়েছে:

[1, 2, 3, 4, 7, 8, 16, 32, 39, 71]

এখানে যোগফলগুলি এটি একটি সংযোজন শৃঙ্খলা তৈরি করে:

1 + 1 = 2
1 + 2 = 3
1 + 3 = 4
3 + 4 = 7
1 + 7 = 8
8 + 8 = 16
16 + 16 = 32
7 + 32 = 39
32 + 39 = 71

এই চ্যালেঞ্জে আপনাকে একটি ইতিবাচক পূর্ণসংখ্যা দেওয়া হবে nএবং আপনাকে অবশ্যই সংক্ষিপ্ত সংযোজনের একটি চেইন আউটপুট করতে হবে যা শেষ হবে n

উদাহরণ - নোট করুন যে এখানে অনেকগুলি সম্ভাব্য আউটপুট রয়েছে, আপনার যে সমস্ত সন্ধানের প্রয়োজন তা হ'ল একটি সংযোজন শৃঙ্খলা যা কেবল সংক্ষিপ্ত:

1: [1]
2: [1, 2]
3: [1, 2, 3]
4: [1, 2, 4]
5: [1, 2, 3, 5]
6: [1, 2, 3, 6]
7: [1, 2, 3, 4, 7]
11: [1, 2, 3, 4, 7, 11]
15: [1, 2, 3, 5, 10, 15]
19: [1, 2, 3, 4, 8, 11, 19]
29: [1, 2, 3, 4, 7, 11, 18, 29]
47: [1, 2, 3, 4, 7, 10, 20, 27, 47]
71: [1, 2, 3, 4, 7, 8, 16, 32, 39, 71]

স্ট্যান্ডার্ড আই / ও বিধি, ইত্যাদি স্ট্যান্ডার্ড লুফোল নিষিদ্ধ। কোড গল্ফ: সবচেয়ে কম বাইট জিতেছে।




1
আমাদের কি বিপরীত ক্রমে চেইন আউটপুট করার অনুমতি দেওয়া হচ্ছে?
আর্নৌল্ড

@ আরনাউল্ড না, এই নির্দিষ্ট আদেশটি।
isaacg

উত্তর:


6

হাস্কেল , 57 বাইট

c=[1]:[x++[a+b]|x<-c,a<-x,b<-x]
f n=[x|x<-c,last x==n]!!0

একটি নিষ্ঠুর শক্তি সমাধান। এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

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

c=            -- c is the list of lists
 [1]:         -- containing [1] and
 [x           -- each list x
  ++[a+b]     -- extended with a+b
 |x<-c,       -- where x is drawn from c,
  a<-x,       -- a is drawn from x and
  b<-x]       -- b is drawn from x.
f n=          -- f on input n is:
 [x           -- take list of those lists x
 |x<-c,       -- where x is drawn from c and
  last x==n]  -- x ends with n,
 !!0          -- return its first element.

4

ব্র্যাচল্যাগ , 14 বাইট

∧≜;1{j⊇Ċ+}ᵃ⁽?∋

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

একটি ব্রুট-ফোর্স সাবমিশন যা পুনরাবৃত্তি গভীরতর ব্যবহার করে সমস্ত সম্ভাব্য সংযোজন চেইন তৈরি করে, যখন তার ডান যুক্তিযুক্ত চেইনটি পাওয়া যায় তখন থামবে। বেশিরভাগ ব্র্যাচেলগ সাবমিশনের বিপরীতে, এটি একটি ফাংশন সাবমিশন যা তার ডান আর্গুমেন্টের মাধ্যমে প্রবেশ করে (প্রচলিতভাবে আউটপুট নামে পরিচিত) এবং বাম আর্গুমেন্টের মাধ্যমে আউটপুট (প্রচলিতভাবে ইনপুট নামে পরিচিত); এটি করা কিছুটা বিতর্কিত, তবে এই বিষয়ে সর্বাধিক ভোট প্রাপ্ত মেটা উত্তরটি বলেছে যে এটি আইনী (এবং এটি করা আমাদের কার্যকারিতার জন্য সাধারণ I / O ডিফল্টের সাথে সামঞ্জস্যপূর্ণ)। যদি আমরা আরও প্রচলিত উপায়ে ইনপুট এবং আউটপুট ব্যবহার করি তবে এটি 16 বাইট (∧≜;1{j⊇Ċ+}ᵃ⁽.∋?∧), কারণ প্রোগ্রামের ডান হাতটি অন্তর্নিহিত বাধা ব্যবহার করতে সক্ষম হবে না (এইভাবে 2 বাইট ব্যয়ে এই প্রতিবন্ধী এবং একটি নতুন স্পষ্ট বাধা দেওয়া হবে)।

ব্যাখ্যা

∧≜;1{j⊇Ċ+}ᵃ⁽?∋
∧               Disable implicit constraint to read the left argument
 ≜;        ⁽    Evaluation order hint: minimize number of iterations
    {    }ᵃ     Repeatedly run the following:
   1      ᵃ       From {1 on the first iteration, results seen so far otherwise}
     j            Make {two} copies of each list element
      ⊇           Find a subset of the elements
       Ċ          which has size 2
        +         and which sums to {the new result for the next iteration}
             ∋    If the list of results seen so far contains {the right argument}
            ?     Output it via the left argument {then terminate}

এখানে একটি আকর্ষণীয় সূক্ষ্মতা হল প্রথম পুনরাবৃত্তির ক্ষেত্রে কী ঘটে, যেখানে ইনপুটটি অন্য পুনরাবৃত্তির মতো তালিকার চেয়ে একটি সংখ্যা হয়; আমরা 1 নম্বর দিয়ে শুরু করি, প্রতিটি অঙ্কের দুটি অনুলিপি তৈরি করি (11 নম্বর তৈরি করে), তারপরে এটির 2-সংখ্যার উপসূচি (এছাড়াও 11 নম্বর) সন্ধান করুন। তারপরে আমরা এর অঙ্কের যোগফলটি নিয়ে যাই, যা 2 হয় এবং এর মতো ক্রমটি [1,2]আমরা চাইলে শুরু হয় । ভবিষ্যতে পুনরাবৃত্তিও, আমরা মত একটি তালিকা দিয়ে শুরু করছি [1,2], এর এটা দ্বিগুন [1,2,1,2](পরে দুই উপাদান subsequence গ্রহণ, [1,1], [1,2], [2,1], অথবা [2,2]); স্পষ্টতই, এগুলির প্রত্যেকের যোগফল যোগ শৃঙ্খলার পরবর্তী উপাদানগুলির জন্য বৈধ হবে।

এখানে কিছুটা হতাশার কারণ এখানে মূল্যায়ন আদেশের ইঙ্গিতটি প্রয়োজন, বিশেষত উপাদানটি (এটি প্রদর্শিত হয় যে মূল্যায়ন আদেশের ইঙ্গিতটি বাইরে থেকে ডিফল্টর পরিবর্তে অভ্যন্তর থেকে নেয় , সুতরাং বিষয়টি জোর করার জন্য বরং অপরিশোধিত ব্যবহারের প্রয়োজন হয় )।


আমি এই চ্যালেঞ্জটি করার জন্য একটি ছোট উপায় খুঁজতে প্রায় 30 মিনিটের জন্য চেষ্টা করেছি। আমার সমাধানটি এর চেয়ে দীর্ঘতর ছিল।
17:44 তে মারামারি করুন

1
@ ফ্যাটালাইজ: সেই বিল্টিনগুলির মধ্যে একটি যা খুব কমই আসে, তবে যখন আপনার এটি প্রয়োজন হয়, আপনার সত্যিই এটি প্রয়োজন, কারণ অন্যান্য নিয়ন্ত্রণ নির্মাণ ব্যবহার করে এটি বাস্তবায়নের কোনও দূরবর্তী উপায় নেই। একবার যখন বুঝতে পারলাম এটি একটি চ্যালেঞ্জ, তখন বাকীগুলি সরাসরি সেখান থেকে এসেছিল।

2

জেলি , 17 বাইট

’ŒP;€µ+þ;1Fḟ@µÐḟḢ

ক্ষতিকারক সময়ে অভিধানের প্রথম সমাধানটি আউটপুট করে।

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

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

’ŒP;€µ+þ;1Fḟ@µÐḟḢ  Main link. Argument: n (integer)

’                  Decrement; n-1.
 ŒP                Powerset; generate all subarrays of [1, ..., n-1], sorted first
                   by length, then lexicographically.
   ;€              Append n to all generate subarrays.
     µ       µÐḟ   Filterfalse; keep only subarrays for which the chain between the
                   two chain separators (µ) returns a falsy value.
     µ             Monadic chain. Argument: A (array of integers)
      +þ               Add table; compute the sums of all pairs of elements in x,
                       grouping the results by the right addend.
        ;1             Append 1 to the resulting 2D array.
          F            Flatten the result.
           ḟ@          Filterfalse swapped; remove all elements of A that appear in
                       the result. This yields an empty list for addition chains.
                Ḣ  Head; select the first result.

2

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

সম্পাদনা করুন: বিপরীত ক্রমে তালিকার আউটপুট স্থির করা হয়েছে

n=>(g=(s,a=[1])=>s-n?s>n||a.map(v=>g(v+=s,a.concat(v))):r=1/r|r[a.length]?a:r)(r=1)&&r

ডেমো


2

পিএইচপি, 195 বাইট

function p($a){global$argn,$r;if(!$r||$a<$r)if(end($a)==$argn)$r=$a;else foreach($a as$x)foreach($a as$y)in_array($w=$x+$y,$a)||$w>$argn||$w<=max($a)?:p(array_merge($a,[$w]));}p([1]);print_r($r);

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


দুর্ভাগ্যবশত, এই অ্যালগরিদম 15. জন্য অনুকূল উত্তর, যেমন দেয় না
নিল

@ নিল এটি এখন দীর্ঘ তবে এটি কার্যকর। উভয় উপায়ের মধ্যে কোনটি সঠিক তা কীভাবে সিদ্ধান্ত নেবেন এই মুহূর্তে আমার কোনও ধারণা নেই। হতে পারে প্রাইমগুলির গণনা একটি ভূমিকা পালন করে
জার্গ হালসারম্যান

এই কোডটি 149 পরীক্ষায় পাস করে না। দৈর্ঘ্য 11 নয়, 10 হওয়া উচিত
J42161217

@ জেনি_ম্যাথি সংশোধন করেছেন
জার্গ হালসারম্যান

1

গণিত, 140 বাইট

t={};s={1};(Do[While[Last@s!=#,s={1};While[Last@s<#,AppendTo[s,RandomChoice@s+Last@s]]];t~AppendTo~s;s={1},10^4];First@SortBy[t,Length@#&])&

আপনি যখনই এটি চালান ততবারে একটি স্বল্পতম সংযোজন শৃঙ্খলা উত্পাদন করে

অনলাইনে
কোডটি সিটিআরএল + ভি দিয়ে পেস্ট করুন, ইনপুট রাখুন অর্থাৎ [71] কোডের শেষে এবং শিফট + এন্টার টিপুন


যেহেতু আমার গাণিতিক অ্যাক্সেস নেই, 15 এর একটি ইনপুট জন্য এই চেইনের কত দৈর্ঘ্য দেয়?
নিল

ডান এক {1, 2, 3, 5, 10, 15}
J42161217

3
ইনপুট 149 এর জন্য, আমি আপনার প্রোগ্রাম থেকে 11 দৈর্ঘ্যের একটি চেইন পেয়েছি, তবে 10 ( [1,2,4,5,9,18,36,72,77,149]) দৈর্ঘ্যের একটি রয়েছে । দেখে মনে হচ্ছে আপনার প্রোগ্রামটি এলোমেলো নমুনা ব্যবহার করে এবং সর্বোত্তম সমাধানটি খুঁজে পাওয়ার গ্যারান্টিযুক্ত নয়।
Zgarb

সংশোধন করা হয়েছে! তবে এটি বেশি সময় নেয়
J42161217

1

পাইথ, 13 বাইট

h-DsM^N2/#QyS

পরীক্ষা স্যুট

অভিধানের প্রথম সংক্ষিপ্ততম চেইন দেয়। এটি মোটামুটি ধীর, তবে এটি খারাপ নয় - 19পাইপি ব্যবহার করে প্রায় 30 সেকেন্ডে সম্পূর্ণ হয়।

@ ডেনিসের সমাধান থেকে কিছু ধারণা।

আমি সত্যিই এটি পছন্দ করি - জড়িত আছে এক টন ঝরঝরে কৌশল।

ব্যাখ্যা:

h-DsM^N2/#QyS
h-DsM^N2/#QySQ    Implicit variable introduction
            SQ    Inclusive range, 1 to input.
           y      Subsets - all subsets of the input, sorted by length then lexicographically
                  Only sorted subsets will be generated.
                  Our addition chain will be one of these.
        /#Q       Filter for presence of the input.
  D               Order by
 -                What's left after we remove
     ^N2          All pairs of numbers in the input
   sM             Summed
h                 Output the list that got sorted to the front.

এটি এখনও বুঝতে কিছুটা শক্ত, তবে আমাকে আরও কিছুটা বিশদে ব্যাখ্যা করার চেষ্টা করা যাক।

আমরা শুরু করি ySQ, যা সমস্ত সম্ভাব্য অর্ডারযুক্ত সাবসেট দেয়[1, 2, ... Q] আকারের ক্রমবর্ধমান অনুসারে । সংক্ষিপ্ত সংযোজন চেইন অবশ্যই এর মধ্যে একটি, তবে আমাদের এটি সন্ধান করা দরকার।

প্রথম জিনিস আমরা চেষ্টা করবো ফিল্টার তালিকা শুধুমাত্র তালিকা যা একটি ধারণ রাখা Q। আমরা এটি দিয়ে করি /#Q

এর পরে, আমরা একটি নির্দিষ্ট ফাংশনের ফলাফল সরিয়ে দেওয়ার পরে কী বাকী রয়েছে তার দ্বারা আমরা তালিকাটি অর্ডার করি। -Dকিছু অপসারণের পরে অবশিষ্ট দ্বারা অর্ডার।

জিনিস আমরা সরান sM^N2, যেখানে Nতালিকা আমরা থেকে কিছু সরানোর করছি। ^N2কারটিশিয়ান পণ্যটিকে Nনিজের সাথে দেয়, দুটি উপাদানের সমস্ত সম্ভাব্য জোড়া NsMতারপরে প্রতিটি জোড়ার যোগফল।

আমরা এই অপসারণটি করার পরে, সম্ভাব্যতম ক্ষুদ্রতম ফলাফলটি কী? ঠিক আছে, ইনপুট তালিকার ক্ষুদ্রতম উপাদানটি অবশ্যই থাকবে, কারণ সমস্ত সংখ্যা ইতিবাচক, সুতরাং দুটি সংখ্যার যে কোনও যোগফল ক্ষুদ্রতম সংখ্যার চেয়ে বেশি হবে। এবং সেখানে কমপক্ষে একটি নম্বর থাকবে, কারণ আমরা পরীক্ষা করেছিলাম যে ইনপুট তালিকায় উপস্থিত ছিল। অতএব, ক্ষুদ্রতম সম্ভাব্য ফলাফলটি হবে যখন ক্ষুদ্রতম সংখ্যা ব্যতীত প্রতিটি সংখ্যা তালিকার অন্য দুটি সংখ্যার যোগফল হয় এবং তালিকার সবচেয়ে ছোট সংখ্যাটি হয় 1 এই ক্ষেত্রে, বাছাই কী হবে [1]। এই প্রয়োজনীয়তার অর্থ হল যে তালিকাটি অবশ্যই একটি অতিরিক্ত চেইন হতে হবে।

সুতরাং, আমরা সামনের দিকে সংযোজন চেইনগুলি বাছাই করি। মনে রাখবেন yআকারটি ক্রমবর্ধমান ক্রমে তার সাবসেটগুলি দেয়, সুতরাং যে তালিকাটি সামনে সাজানো হয় তা সংক্ষিপ্ত সংযোজন শৃঙ্খলার একটি হতে হবে। hতালিকাটি নির্বাচন করে।

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