Urutan Counter-Fibonacci


13

Diberikan tiga angka m , n dan p , tugas Anda adalah mencetak daftar / larik panjang p mulai dengan m dan n dan setiap elemen setelah p mewakili perbedaan dari 2 angka sebelumnya, mn (Counter- Fibonacci Sequence )

Untuk tantangan ini, Anda dapat menggunakan fungsi untuk mengembalikan atau mencetak hasil atau program lengkap.

Memasukkan

Tiga bilangan bulat, m , n dan p , dipisahkan oleh baris baru / spasi / koma, apa pun yang didukung bahasa Anda, tetapi Anda harus menentukan format input Anda. Penyisipan kode tidak diizinkan.

Keluaran

Angka-angka yang terkandung oleh Urutan Counter-Fibonacci, dalam salah satu format berikut (contoh ini:) m = 50, n = 40, p = 6:

  • 50,40,10,30,-20,50 (atau dengan spasi setelah koma)
  • [50,40,10,30,-20,50] (atau dengan spasi setelah koma)
  • 50 40 10 30 -20 50(atau dengan \n(baris baru) alih-alih spasi)
  • {50,40,10,30,-20,50} (atau dengan spasi alih-alih koma)

Contohnya

Input => Output

50,40,10 => 50,40,10,30,-20,50,-70,120,-190,310
-100,-90,7 => -100,-90,-10,-80,70,-150,220
250,10,8 => 250,10,240,-230,470,-700,1170,-1870

Aturan

  • Anda dijamin p lebih tinggi dari 1
  • Anda harus memberikan cara untuk menguji program Anda, jika memungkinkan
  • Perhatikan bahwa celah ini dilarang dan penyisipan kode tidak diizinkan, seperti yang disebutkan di atas

Penilaian & Papan

Kode Anda harus sesingkat mungkin, karena ini adalah . Tidak ada jawaban yang akan diterima , karena tantangan ini dimaksudkan untuk menemukan jawaban terpendek berdasarkan bahasa, menghindari keuntungan yang tidak adil untuk bahasa golf.


Pertanyaan Terkait oleh ETHproductions: Monday Mini-Golf # 1: Reverse Fibonacci Solver


Terkait, kemungkinan duplikat. Ini pada dasarnya tantangan yang sama seperti ini, tetapi menghasilkan dalam urutan terbalik dari tempat tertentu dalam urutan.
ETHproduk

@ETHproduksi mungkin dianggap sebagai penipuan, tetapi ini agak berbeda, mencoba melihat solusi terpendek dalam setiap bahasa
Tn. Xcoder

Ya, saat itu tidak ada banyak kekhawatiran tentang ketidaksetaraan bahasa ;-) Saya pikir itu tidak membuat perbedaan besar. Perbedaan utama di sini adalah bahwa Anda dapat meninggalkan langkah pertama dari algoritma yang akan Anda gunakan untuk menyelesaikan tantangan itu (bekerja mundur untuk menemukan titik awal)
ETHproductions

@ ETHproductions memang ada perbedaan kecil. Jika Anda ingin tantangan ini dihapus, saya akan benar-benar melakukannya.
Tn. Xcoder

Saya pribadi berpikir tidak apa-apa. Selain itu, apakah kita diizinkan memiliki pemisah trailing?
ETHproduk

Jawaban:


9

Haskell, 29 byte

a#b=a:b#(a-b)
(.(#)).(.).take

Panjang padalah parameter pertama. Contoh penggunaan: ( (.(#)).(.).take ) 10 50 40-> [50,40,10,30,-20,50,-70,120,-190,310]. Cobalah online! .

Mempersingkat daftar menjadi pelemen membutuhkan lebih banyak byte daripada memproduksinya.


6

Jelly , 6 byte

_@С+Ṗ

Cobalah online!

Bagaimana itu bekerja

_@С+Ṗ  Main link. Left argument: m. Right argument: n. Third argument: p

    +   Yield (m + n), the term that comes before m.
  С    Execute the link to the left p times, starting with left argument m and
        right argument (m + n). After each execution, replace the right argument
        with the left one and the left argument with the previous return value.
        Yield all intermediate values of the left argument, starting with m.
_@          Subtract the left argument from the right one.
        This yields the first (p + 1) terms of the sequence, starting with m.
    Ṗ   Pop; discard the last term.


5

JavaScript (ES6), 33 byte

f=(m,n,p)=>p?m+[,f(n,m-n,p-1)]:[]

Mengembalikan string format 1,2,3, - tanpa menggunakan string!

Cuplikan tes


5

Perl 6 , 25 byte

{($^m,$^n,*-*...*)[^$^p]}

Cobalah

Diperluas:

{  # bare block lambda with placeholder parameters 「$m」 「$n」 「$p」
  (
    $^m, $^n,  # declare first two params, and use them

    * - *      # WhateverCode lambda which subtracts two values

    ...        # keep using that to generate values

    *          # never stop (instance of type Whatever)

  )[ ^ $^p ]   # declare last param, and use it to grab the wanted values
               # 「^ $^p」 is short form of range op
               # 「0 ..^ $^p」 which excludes the 「$p」
}

5

CJam , 15 byte

q~2-{1$1$-}*]S*

1 byte tambahan karena CJam tidak secara alami menggunakan salah satu format output yang diizinkan> _ <

Cobalah online!

Penjelasan

q~               e# Read and eval the input
  2-             e# Subtract 2 from p (to account for m and n being in the list)
    {            e# Run this block p-2 times:
     1$1$-       e#   Copy the top values and subtract
          }*     e# (end of block)
            ]    e# Wrap the stack in an array
             S*  e# Join with spaces

4

05AB1E , 9 7 byte

ÍFÂ2£¥«

Cobalah online!

Penjelasan

ÍF          # p-2 times do
  Â         # create a reversed copy of the current list
   2£       # take the first 2 elements of the list
     ¥      # calculate delta
      «     # append to the list

3

Röda , 38 byte

f i,a,b{seq 1,i|{|_|[a];b=a-b;a=a-b}_}

Cobalah online!

Dijelaskan:

f i,a,b{seq 1,i|{|_|[a];b=a-b;a=a-b}_}
f i,a,b{                             } /* Function declaration */
        seq 1,i                        /* Push numbers 1..i to the stream */
               |{|_|               }_  /* For each number in the stream: */
                    [a];               /*   Push the current value of a */
                        b=a-b;         /*   Set b = the next number */
                              a=a-b    /*   Set a = the previous value of b */

3

Haskell , 33 byte

(m!n)0=[]
(m!n)p=m:(n!(m-n))(p-1)

Panggilan menggunakan (m!n)p. Pekerjaan dengan mendefinisikan !sebagai fungsi infiks yang mengambil di mdan ndan mengembalikan fungsi yang mengambil pdan mengembalikan hasil yang diinginkan.


Bagus! Saya tidak berpikir untuk membuat fungsi infix, jadi upaya terbaik saya dengan haskell adalah 34. BTW Anda dapat mengganti baris baru dengan ;menjadikannya single-line, sehingga terlihat sedikit lebih codegolfy.
AlexJ136

2

Ruby, 31 byte

->m,n,p{p.times{m,n=n,(p m)-n}}

Solusi mudah


2

PHP, 76 Bytes

[,$a,$b,$c]=$argv;for($r=[$a,$b];$c---2;)$r[]=-end($r)+prev($r);print_r($r);

PHP, 84 Bytes

[,$a,$b,$c]=$argv;for($r=[$a,$b];$c>$d=count($r);)$r[]=$r[$d-2]-end($r);print_r($r);

2

Pyth, 18 byte

JEKEVEJ=N-JK=JK=KN

Cobalah online!

Input dan output keduanya dibatasi oleh baris baru.

Bagaimana itu bekerja:

JEKE                Read two lines of input to J and K
    VE              Read another line and loop that many times:
      J               Print J
       =N-JK          Set N to J - K (Pyth uses prefix notation)
            =JK       Set J to K
               =KN    Set K to N

1

Mathematica, 26 byte

{-1,1}~LinearRecurrence~##

Lovin the builtin. Mengambil input dalam formulir {{m, n}, p}. LinearRecurrenceingin mengetahui koefisien kombinasi linear dari elemen sebelumnya yang digunakan untuk menghasilkan elemen baru, yang dalam hal ini adalah {-1,1}.


1

QBIC , 35 33 byte

:::?'a;b;`[c-2|e=a-b?e';`┘a=b┘b=e

Disimpan 2 byte dengan menempatkan yang pertama PRINTke dalam satu kode literal.

Penjelasan (versi 35 byte):

:::         Get parameters a, b, c from the cmd-line
  ';`       This suppresses a newline when printing
?a   b';`   PRINT a and b
[c-2|       FOR x=1; x<=(c-2); x++
  e=a-b       calculate the next term of the sequence
  ?e';`       Print it, suppressing newline
  ┘a=b        ┘ denotes a syntactic linebreak; shove the numbers one over
  ┘b=e        dito
            FOR-loop is auto-closed

Punya ide juru bahasa online untuk menguji ini?
Tn. Xcoder

@ Mr.Xcoder belum ada juru bahasa online, maaf. Saya telah menambahkan tautan ke interpreter, yang merupakan proyek DOSBOX yang menjalankan QBasic, menjalankan QBIC.
steenbergh

1
Penjelasannya bernilai lebih dari penerjemah @steenbergh, terima kasih telah merespons!
Tn. Xcoder

1

C, 128 byte

m,n,p,z;main(c,v)char**v;{m=atoi(v[1]);n=atoi(v[2]);p=atoi(v[3])-2;printf("%d,%d",m,n);while(p--)z=m,m=n,n=z-m,printf(",%d",n);}

Program ini mem-parsing tiga argumen m, ndan pdari command-line, dan mencetak output seperti yang ditentukan.

Kompiler C modern memungkinkan Anda menghilangkan impor dasar, dan karenanya kami dapat menggunakan printfdan atoitanpa impor#include s.

Variabel global secara intdefault saat dideklarasikan tanpa tipe - ini menghemat banyak ruang.


1

Java, 66 byte

Untuk sekali ini, lambdas adalah pendekatan yang tidak efisien untuk bermain golf karena cara putaran yang sangat bundar menerapkan rekursi kepada mereka yang membutuhkan banyak byte tambahan.

Golf:

String f(int m,int n,int p){return""+m+(p>1?","+f(n,m-n,p-1):"");}

Tidak Disatukan:

public class CounterFibonacciSequences {

  private static final int[][] INPUTS = new int[][] { //
      { 50, 40, 10 }, //
      { -100, -90, 7 }, //
      { 250, 10, 8 } };

  private static final String[] OUTPUTS = new String[] { //
      "50,40,10,30,-20,50,-70,120,-190,310", //
      "-100,-90,-10,-80,70,-150,220", //
      "250,10,240,-230,470,-700,1170,-1870" };

  public static void main(String[] args) {
    for (int i = 0; i < INPUTS.length; ++i) {
      final int m = INPUTS[i][0];
      final int n = INPUTS[i][1];
      final int p = INPUTS[i][2];
      System.out.println("M: " + m);
      System.out.println("N: " + n);
      System.out.println("P: " + p);
      System.out.println("Expected: " + OUTPUTS[i]);
      System.out.println("Actual:   " + new CounterFibonacciSequences().f(m, n, p));
      System.out.println();
    }
  }

  String f(int m, int n, int p) {
    return "" + m + (p > 1 ? "," + f(n, m - n, p - 1) : "");
  }
}

1

AHK, 68 byte

m=%1%
n=%2%
3-=2
Send %m%`n%n%`n
Loop,%3%
{
n:=m-n
m-=n
Send %n%`n
}

Mendapatkan' benar-benar lelah tidak mengetahui bagaimana / mampu menggunakan argumen berlalu ( %1%, %2%, ...) langsung dalam fungsi matematika


1

Python 2 , 93 90 byte

u,t=int,input;m,n,p=u(t()),u(t()),u(t());l=[m,n]
for i in range(p-2):l.append(l[-2]-l[-1])

Cobalah online!

Disimpan 3 byte berkat @ Mr.Xcoder

Ini bekerja dengan mengambil angka sebagai input dan memformatnya dengan benar, kemudian menggunakan for for untuk menghasilkan daftar berdasarkan angka yang dimasukkan.


Anda dapat menghapus spasi setelah koma dalam rentang tersebut untuk menghemat 1 byte
Tn. Xcoder

Dan mungkin lebih pendek jika Anda memetakan input Anda dengan ints dan input.split
Tn. Xcoder

@ Mr.Xcoder Saya mencoba perpecahan, tetapi akhirnya menjadi lebih lama.
Kamerad SparklePony

Ok, saya tidak bisa mengujinya. Itu bagus.
Tn. Xcoder

Dan jangkauan tidak perlu argumen pertama
Tn. Xcoder

0

Swift - 85 byte

func y(x:Int,y:Int,z:Int){var m=x,n=y,p=z,c=0;for _ in 1...p{print(m);c=m;m=n;n=c-n}}

Pemakaian: y(x:50,y:40,x:6)

Swift - 84 byte

func z(l:[Int]){var m=l[0],n=l[1],p=l[2],c=0;for _ in 1...p{print(m);c=m;m=n;n=c-n}}

Pemakaian: z(l: [50,40,6])


Keluaran:

50
40
10
30
-20
50

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.