ลำดับ Piggyback


14

ฉันสร้างลำดับของตัวเองเมื่อเร็ว ๆ นี้ (เรียกว่าลำดับ Piggyback) และทำงานเช่นนี้:

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)

นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

หากทุกคนสามารถค้นหาชื่อของลำดับได้โปรดแก้ไขโพสต์ตามนั้น

ผู้นำปัจจุบัน: MATL และ Jelly (ทั้งคู่ที่ 15 ไบต์)


เราเริ่มที่ดัชนี 0 ได้ไหม? P(0)=1...
nimi

3
ฉันขอเหตุผลเบื้องหลังชื่อที่คุณให้กับลำดับนี้ได้ไหม
John Dvorak

@JanDvorak ดูเหมือนว่าตัวเลขจะเป็น "piggybacking" ซึ่งกันและกัน
clismique

@nimi ใช่คุณได้รับอนุญาต
clismique

คำตอบ:


6

Python 2, 40 39 ไบต์

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

ให้Trueแทน 1 หากไม่ได้รับอนุญาตเราสามารถรับได้ 42 ไบต์:

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

วิธีการทำงานค่อนข้างตรงไปตรงมาเคล็ดลับเพียงอย่างเดียวคือใช้.0+เพื่อส่งผลให้เกิดการลอย


คุณสามารถประหยัดหนึ่งไบต์โดยการลบช่องว่างระหว่างx<4และor
acrolith

ใน Python 2 คุณสามารถใช้f(x-1.)เพื่อร่ายเพื่อลอยได้ ใน Python 3 คุณไม่จำเป็นต้องร่ายเลย
เดนนิส

5

Haskel, 32 ไบต์

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

ตัวอย่างการใช้งาน: ->((0#1)1!!) 7 2.642857142857143ฉันเริ่มต้นลำดับด้วย0, 1, 1เพื่อแก้ไข!!การจัดทำดัชนีแบบ 0

แก้ไข: @xnor พบวิธีเปลี่ยนจากดัชนีที่ใช้ 0 เป็นฐานโดยไม่เปลี่ยนจำนวนไบต์


1
วิธีการที่ดีสำหรับการตีนิยามแบบเรียกซ้ำโดยตรง ฉันคิดว่าคุณสามารถเปลี่ยนไป 1 (0,1,1)จัดทำดัชนีโดยการเริ่มต้น
xnor

4

Ruby, 34 ไบต์

เนื่องจากทับทิมใช้การหารจำนวนเต็มตามค่าเริ่มต้นจึงกลายเป็นว่าใช้เศษส่วนน้อยกว่าแทน ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ

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

4

Perl 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
  )[ $_ ]
}

สิ่งนี้ส่งคืนRat ( Rational ) สำหรับอินพุตที่ขึ้นต้นด้วย 3 จนถึงจนกว่าผลลัพธ์จะเริ่มมีตัวส่วนที่ใหญ่กว่าสามารถใส่จำนวนเต็ม 64 บิต ณ จุดที่มันเริ่มส่งคืนNum s (จุดลอยตัว) หนู
คนสุดท้ายมันจะกลับมาคือ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

MATL , 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

Cheddar , 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

Javascript (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 จะช่วยประหยัดเมตริกตัน
Ismael Miguel

เช่นนี้:P=n=>n<4?1:P(n-3)+P(n-2)/P(n-1)
Ismael Miguel

@IsmaelMiguel ขอบคุณ ตรงไปตรงมาฉันไม่มีความคิดเกี่ยวกับความแตกต่างระหว่าง Javascripts ที่แตกต่างกัน: D
Beta Decay

เพื่อประโยชน์ของคุณเกี่ยวกับความท้าทายมากที่สุดที่คุณจะต้องรู้ว่า "สัญกรณ์บิ๊กลูกศร" functionซึ่งช่วยให้คุณสร้างฟังก์ชั่นโดยไม่ต้องใช้คำว่า บิตP=n=>[...]กำลังสร้างฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้เวลา 1 พารามิเตอร์ (n) นอกจากนี้สำหรับ ES6 แล้วผลตอบแทนก็เป็นนัย ดังนั้นเป็นหน้าที่ที่ผลตอบแทนเสมอP=n=>5 5คุณจะต้องใส่ร่างกายใน{}ถ้าคุณมีมากกว่าหนึ่งคำสั่ง (เช่น: P=n=>{alert(1);console.log(1)}) เนื่องจากคุณมีเพียง 1 (ใหญ่) งบดำเนินการ (Operator ternary) {}คุณสามารถลืม
Ismael Miguel

@IsmaelMiguel ขอบคุณที่จะมีประโยชน์: D
Beta Decay

2

05AB1E , 18 17 ไบต์

3Ld                # push list [1,1,1]
   ¹ÍG         }   # input-3 times do
      D3£          # duplicate list and take first 3 elements of the copy
         R`        # reverse and flatten
           /+      # divide then add
             ¸ì    # wrap in list and prepend to full list
                ¬  # get first element and implicitly print

ลองออนไลน์!

บันทึกแล้ว 1 ไบต์ขอบคุณ Luis Mendo



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

R, 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()รหัสของคุณได้ แต่คุณต้องตั้งชื่อฟังก์ชั่นเพื่อให้การเรียกใช้ซ้ำของคุณใช้งานได้
user5957401

0

Mathematica ขนาด 36 ไบต์

P@n_:=If[n<4,1,P[n-3]+P[n-2]/P[n-1]]

ต่อไปนี้เป็นคำศัพท์สองสามคำแรก:

P /@ Range[10]
{1, 1, 1, 2, 3/2, 7/3, 37/14, 529/222, 38242/11109, 66065507/19809356}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.