পিগব্যাক সিকোয়েন্স


14

আমি সম্প্রতি আমার নিজস্ব সিকোয়েন্স তৈরি করেছি (পিগব্যাক সিকোয়েন্স বলা হয়), এবং এটি এর মতো কাজ করে:

P(1), P(2)এবং P(3)= 1

সবার জন্য P(n)যেখানে n>3সিকোয়েন্স এটি কাজ করে:

P(n) = P(n-3) + P(n-2)/P(n-1)

সুতরাং, ক্রম অবিরত:

P(4)= 1 + 1/1=2

P(5)= 1 + 1/2= 3/2 =1.5

P(6)= 1 + 2/(3/2)= 7/3 =2.33333...

P(7)= 2 + (3/2)/(7/3)= 37/14=2.6428571428...

P(8)= 3/2 + (7/3)/(37/14)= 529/222 =2.3828828828...

আপনার কাজটি যখন দেওয়া হয় n, তা P(n)হয় ভাসমান পয়েন্ট সংখ্যা বা একটি (im) যথাযথ ভগ্নাংশ হিসাবে গণনা করা ।

এটি , তাই বাইট জেতে সংক্ষিপ্ততম কোড।

যদি কেউ এই সিকোয়েন্সটির নাম জানতে পারে তবে দয়া করে সেই অনুযায়ী পোস্টটি সম্পাদনা করুন।

বর্তমান নেতারা: এমএটিএল এবং জেলি (উভয় 15 বাইটে)।


আমরা সূচক 0 এ শুরু করতে পারি? P(0)=1...
নিমিম

3
আপনি এই ক্রমটি যে নাম দিয়েছিলেন তার পিছনে যুক্তি জিজ্ঞাসা করতে পারি?
জন ডিভোরাক

@ জনডভোরাক দেখে মনে হচ্ছে যে সংখ্যাগুলি একে অপরকে "পিগিব্যাকিং" করছে।
ক্লিস্টিক

@ নিমিমি হ্যাঁ, আপনি অনুমোদিত।
ক্লিমেমিক

উত্তর:


6

পাইথন 2, 40 39 বাইট।

f=lambda x:x<4or.0+f(x-3)+f(x-2)/f(x-1)

True1 এর পরিবর্তে দেয় , যদি এটি অনুমোদিত না হয় তবে আমরা এটি 42 বাইটে পেতে পারি:

f=lambda x:.0+(x<4or f(x-3)+f(x-2)/f(x-1))

এটি যেভাবে কাজ করে তা বেশ সোজা, একমাত্র কৌশলটি .0+একটি ফলকে ফলাফল দেওয়ার জন্য ব্যবহার করছে।


আপনি মধ্যে স্থান সরিয়ে এক বাইট সংরক্ষণ করতে পারবেন x<4এবংor
acrolith

পাইথন 2 এ, আপনি f(x-1.)ভাসতে কাস্ট করতে ব্যবহার করতে পারেন । পাইথন 3 এ, আপনাকে একেবারে কাস্ট করার দরকার নেই।
ডেনিস

5

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

(a#b)c=a:(b#c)(a+b/c)
((0#1)1!!)

ব্যবহারের উদাহরণ: ((0#1)1!!) 7->2.642857142857143 । আমি এর 0-ভিত্তিক সূচক 0, 1, 1ঠিক করার জন্য ক্রমটি শুরু করি !!

সম্পাদনা: @ xnor বাইট গণনা পরিবর্তন না করে 0-ভিত্তিক থেকে 1-ভিত্তিক সূচকে স্যুইচ করার একটি উপায় খুঁজে পেয়েছে।


1
সরাসরি পুনরাবৃত্ত সংজ্ঞাটি মারধরের জন্য দুর্দান্ত পদ্ধতি। আমি মনে করি আপনি আরম্ভ করে 1-সূচিতে স্থানান্তর করতে পারেন (0,1,1)
xnor

4

রুবি, 34 বাইট

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

f=->n{n<4?1r:f[n-3]+f[n-2]/f[n-1]}

4

পার্ল 6 ,  25  23 বাইট

{(0,1,1,1,*+*/*...*)[$_]}

{(0,1,1,*+*/*...*)[$_]}

ব্যাখ্যা:

# bare block lambda with implicit parameter 「$_」
{
  (
    # initial set-up
    # the 「0」 is for P(0) which isn't defined
    0, 1, 1, 1,

    # Whatever lambda implementing the algorithm
    * + * / *
    # { $^a + $^b / $^c }

    # keep using the lambda to generate new values until
    ...

    # Whatever (Forever)
    *

   # get the value indexed by the argument
  )[ $_ ]
}

এটি 3 দিয়ে শুরু হওয়া ইনপুটগুলির জন্য একটি ইঁদুরকে ( যুক্তিযুক্ত ) ফিরিয়ে দেয়, যতক্ষণ না ফল a৪ বিট পূর্ণসংখ্যার সাথে মানানসই আকারের বড় হতে শুরু করে, যেখানে এটি নুম (ভাসমান পয়েন্ট) ফেরত শুরু করে । এটি
সর্বশেষ ইঁদুরটি ফিরে আসবেP(11) == 8832072277617 / 2586200337022

আপনি তা ফেরত চান তাহলে মূলদ ভাসে বদলে সংখ্যার আপনাকে নিম্নলিখিত যা ফিরে আসবে তা অদলবদল করতে পারেন FatRat পরিবর্তে।

{(0.FatRat,1,1,*+*/*...*)[$_]}

টেস্ট:

#! /usr/bin/env perl6
use v6.c;
use Test;

my &piggyback = {(0,1,1,*+*/*...*)[$_]}
# */ # stupid highlighter no Perl will ever have C/C++ comments

my @test = (
  1, 1, 1, 2,
  3/2, 7/3, 37/14,
  529 / 222,
  38242 / 11109,
  66065507 / 19809356,
  8832072277617 / 2586200337022,
);

plan +@test;

for 1..* Z @test -> ($input,$expected) {
  cmp-ok piggyback($input), &[==], $expected, $expected.perl;
}


3

এমএটিএল , 15 বাইট

llli3-:"3$t/+]&

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

ব্যাখ্যা

lll       % Push 1, 1, 1
i         % Take input n
3-:       % Pop n and push range [1 2 ... n-3] (empty if n<4)
"         % For each
  3$t     %    Duplicate the top three numbers in the stack
  /       %    Pop the top two numbers and push their division
  +       %    Pop the top two numbers and push their addition
]         % End
&         % Specify that the next function, which is implicit display, will take
          % only one input. So the top of the stack is displayed

2

চেডার , 31 বাইট

n P->n<4?1:P(n-3)+P(n-2)/P(n-1)

অরোগল্ফড সংস্করণটি এত স্পষ্ট ইমো আপনার কোনও ব্যাখ্যাের দরকার নেই:

n P->
  n < 4 ? 1 : P(n-3) + P(n-2) / P(n-1)

মূলত ফাংশন আর্গুমেন্টের পরে আপনি ব্যবহারের জন্য ভেরিয়েবল নির্দিষ্ট করতে পারেন যা ফাংশনে নিজেই সেট হয়ে থাকবে। কেন? কারণ এই ফাংশনটি টেল-কল-অনুকূলিত হবে, বা কমপক্ষে হওয়া উচিত।


2

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

P=n=>n<4?1:P(n-3)+P(n-2)/P(n-1)

একটি সাধারণ ফাংশন।

P=n=>n<4?1:P(n-3)+P(n-2)/P(n-1)

var out = '';

for (var i=1;i <= 20;i++) {
out +='<strong>'+i+':</strong> '+P(i)+'<br/>';
}

document.getElementById('text').innerHTML = out;
div {
font-family: Arial
}
<div id="text"></div>


কেন ES6 নয়? এটি একটি মেট্রিক টন বাইট সংরক্ষণ করে।
ইসমাইল মিগুয়েল

P=n=>n<4?1:P(n-3)+P(n-2)/P(n-1)
এটির

@ ইসমাইল মিগুয়েল ধন্যবাদ সত্যি বলতে কি, বিভিন্ন জাভাস্ক্রিপ্টগুলির মধ্যে পার্থক্য সম্পর্কে আমার কোনও ধারণা নেই: ডি
বিটা ডেক

আপনার সুবিধার জন্য, বেশিরভাগ চ্যালেঞ্জগুলির জন্য, আপনাকে কেবল "বড় তীর চিহ্ন" জেনে রাখা দরকার, যা আপনাকে কীওয়ার্ডটি ব্যবহার না করেই ফাংশন তৈরি করতে দেয় function। বিট P=n=>[...]একটি বেনামি ফাংশন তৈরি করছে যা 1 টি প্যারামিটার (এন) নেয়। এছাড়াও, ES6 এ, রিটার্নগুলি অন্তর্ভুক্ত। সুতরাং, P=n=>5একটি ফাংশন যা সর্বদা ফিরে আসে 5। আপনার {}যদি একাধিক স্টেটমেন্ট থাকে (যেমন P=n=>{alert(1);console.log(1)}:) আপনার দেহটি কেবল আবদ্ধ করতে হবে । যেহেতু আপনার কাছে কেবলমাত্র 1 (বড়) স্টেটমেন্ট (টেরিনারি অপারেটর) রয়েছে তাই আপনি এটি ভুলে যেতে পারেন {}
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল ধন্যবাদ, এটি কার্যকরভাবে আসবে: ডি
বিটা



1

জেলি , 15 বাইট

ạ2,1,3߀÷2/SµḊ¡

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

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

ạ2,1,3߀÷2/SµḊ¡  Main link. Argument: n (integer)

             Ḋ   Dequeue; yield [2, ..., n].
            µ ¡  If the range is non-empty (i.e., if n > 1), execute the chain to
                 the left. If n is 0 or 1, return n.
                 Note that P(3) = P(0) + P(2)/P(1) if we define P(0) := 0.
ạ2,1,3           Take the absolute difference of n and 2, 1, and 3.
                 This gives [0, 1, 1] if n = 2, and P(0) + P(1)/P(1) = 0 + 1/1 = 1.
      ߀         Recursively apply the main each to each difference.
        ÷2/      Perform pairwise division.
                 This maps [P(n-2), P(n-1), P(n-3)] to [P(n-2)/P(n-1), P(n-3)].
           S     Sum, yielding P(n-2)/P(n-1) + P(n-3).

1

আর, 53 47 বাইট

f=function(N)ifelse(N>3,f(N-3)+f(N-2)/f(N-1),1)

এই উত্তরটি বেশ ঝরঝরে ফাংশনটি ব্যবহার করেছে ifelse:ifelse(Condition, WhatToDoIfTrue, WhatToDoIfNot)


1
return()আপনার কোডটি থেকে মুক্তি পেতে সক্ষম হওয়া উচিত । তবে আপনার পুনরাবৃত্তিটি কাজ করার জন্য আপনাকে ফাংশনটির নামও রাখতে হবে
ব্যবহারকারী5957401


0

ডায়ালগ এপিএল, 25 বাইট

⊃{1↓⍵,⍎⍕' +÷',¨⍵}⍣⎕⊢0 1 1

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