Urutan Piggyback


14

Saya membuat urutan sendiri baru-baru ini (disebut urutan Piggyback), dan berfungsi seperti ini:

P(1), P(2)dan P(3)= 1.

Untuk semua P(n)tempat n>3, urutannya berfungsi seperti ini:

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

Jadi, lanjutkan urutannya:

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...

Tugas Anda, ketika diberikan n, menghitung P(n)baik sebagai angka floating point atau fraksi (im) yang tepat.

Ini adalah , jadi kode terpendek dalam byte menang.

Jika ada yang bisa menemukan nama urutannya, silakan edit posting yang sesuai.

Pemimpin saat ini: MATL dan Jelly (keduanya pada 15 byte).


Bisakah kita mulai dengan indeks 0? P(0)=1...
nimi

3
Bolehkah saya meminta alasan di balik nama yang Anda berikan pada urutan ini?
John Dvorak

@ JanDvorak Sepertinya angka-angkanya "saling membonceng".
clismique

@nimi Ya, Anda diizinkan.
clismique

Jawaban:


6

Python 2, 40 39 byte.

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

Memberikan Truebukan 1, jika ini tidak diizinkan, kami dapat memiliki ini untuk 42 byte:

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

Cara kerjanya cukup mudah, satu-satunya trik yang digunakan .0+untuk melemparkan hasilnya ke pelampung.


Anda dapat menghemat satu byte dengan menghapus spasi di antara x<4danor
acrolith

Di Python 2, Anda bisa menggunakan f(x-1.)untuk melakukan cast. Di Python 3, Anda tidak perlu melakukan casting sama sekali.
Dennis

5

Haskel, 32 byte

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

Contoh penggunaan: ((0#1)1!!) 7-> 2.642857142857143. Saya memulai urutan dengan 0, 1, 1memperbaiki !!pengindeksan berbasis 0.

Sunting: @xnor menemukan cara untuk beralih dari indeks berbasis-0 ke berbasis-1, tanpa mengubah jumlah byte.


1
Metode yang bagus untuk mengalahkan definisi rekursif langsung. Saya pikir Anda dapat beralih ke 1-diindeks dengan menginisialisasi (0,1,1).
xnor

4

Ruby, 34 byte

Karena Ruby menggunakan pembagian integer secara default, ternyata itu lebih pendek untuk menggunakan pecahan. Saran bermain golf diterima.

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

4

Perl 6 ,  25  23 byte

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

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

Penjelasan:

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

Ini mengembalikan Rat ( Rasional ) untuk input mulai dengan 3 hingga hasilnya akan mulai memiliki penyebut yang lebih besar daripada yang bisa muat dalam integer 64 bit, di mana titik itu mulai mengembalikan Num (floating point). Tikus
terakhir yang akan kembali adalahP(11) == 8832072277617 / 2586200337022

Jika Anda ingin mengembalikan angka Rasional daripada mengapung, Anda dapat menukarnya dengan yang berikut yang akan mengembalikan FatRat sebagai gantinya.

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

Uji:

#! /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 byte

llli3-:"3$t/+]&

Cobalah online!

Penjelasan

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 byte

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

Versi ungolfed begitu jelas sehingga Anda tidak perlu penjelasan:

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

pada dasarnya setelah argumen fungsi, Anda dapat menentukan variabel yang akan digunakan yang akan diatur ke fungsi itu sendiri. Mengapa? karena fungsi ini akan dioptimalkan ekor-panggilan, atau setidaknya seharusnya.


2

Javascript (ES6), 31 byte

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

Fungsi sederhana.

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>


Kenapa tidak ES6? Menghemat metrik ton byte.
Ismael Miguel

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

@IsmaelMiguel Terima kasih. Terus terang, saya tidak tahu tentang perbedaan antara Javascripts yang berbeda: D
Beta Decay

Untuk keuntungan Anda, pada sebagian besar tantangan, Anda hanya perlu mengetahui "Notasi Panah Besar", yang memungkinkan Anda membuat fungsi tanpa menggunakan kata kunci function. Bit P=n=>[...]menciptakan fungsi anonim yang mengambil 1 parameter (n). Juga, pada ES6, pengembaliannya implisit. Jadi, P=n=>5adalah fungsi yang selalu kembali 5. Anda hanya perlu menyertakan tubuh {}jika Anda memiliki lebih dari satu pernyataan (Misalnya:) P=n=>{alert(1);console.log(1)}. Karena Anda hanya memiliki 1 pernyataan (besar) (operator ternary), Anda dapat melupakannya {}.
Ismael Miguel

@IsmaelMiguel Terima kasih, itu akan berguna: D
Beta Decay

2

05AB1E , 18 17 byte

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

Cobalah online!

Disimpan 1 byte berkat Luis Mendo



1

Jelly , 15 byte

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

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

ạ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 byte

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

Jawaban ini memanfaatkan fungsi yang cukup rapi ifelse:ifelse(Condition, WhatToDoIfTrue, WhatToDoIfNot)


1
Anda harus dapat menyingkirkan return()kode Anda. Tetapi Anda juga harus menyebutkan fungsi tersebut agar rekursi Anda berfungsi
user5957401

0

Mathematica, 36 byte

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

Berikut adalah beberapa istilah pertama:

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

0

Dyalog APL, 25 byte

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.