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

Tuan Xcoder
sumber
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.

nimi
sumber
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.
Dennis
sumber
6

Python 2, 39 byte

-2 byte berkat ETHproductions

-1 byte terima kasih kepada Dennis

f=lambda m,n,p:p*[0]and[m]+f(n,m-n,p-1)

Cobalah secara Online!

pecandu matematika
sumber
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

Produksi ETH
sumber
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」
}
Brad Gilbert b2gills
sumber
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
Kucing Bisnis
sumber
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
Emigna
sumber
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 */
fergusq
sumber
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.

Julian Wolf
sumber
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

GB
sumber
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);
Jörg Hülsermann
sumber
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
draziwfozo
sumber
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}.

Greg Martin
sumber
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
steenbergh
sumber
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.

AlexJ136
sumber
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) : "");
  }
}
Komunitas
sumber
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

Toast insinyur
sumber
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.

Kamerad SparklePony
sumber
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
Tuan Xcoder
sumber
0

Python - 55 byte

def s(m,n,p):
 for i in range(p):print(m);c=m;m=n;n=c-n

Cobalah online! & Penggunaan:s(50,40,6)

Catatan: Solusi tanpa lambda

Tuan Xcoder
sumber