Karşı Fibonacci Dizileri


13

Üç sayı m , n ve p verildiğinde , göreviniz m ve n ile başlayan p uzunluğunu içeren bir liste / dizi yazdırmaktır ve p'den sonraki her öğe , önceki 2 sayının farkını temsil eder, mn (Counter- Fibonacci Dizisi )

Bu meydan okuma için sonucu döndürmek veya yazdırmak için bir işlev veya tam bir program kullanabilirsiniz.

Giriş

Diliniz ne olursa olsun, satır satırları / boşluklar / virgüllerle ayrılmış üç m , n ve p tamsayısı, ancak giriş biçiminizi belirtmelisiniz. Kod eklemeye izin verilmiyor.

Çıktı

Counter-Fibonacci Sekansının aşağıdaki formatlardan herhangi birinde içerdiği sayılar (bu örnek:) m = 50, n = 40, p = 6:

  • 50,40,10,30,-20,50 (veya virgüllerden sonra aralıklarla)
  • [50,40,10,30,-20,50] (veya virgüllerden sonra aralıklarla)
  • 50 40 10 30 -20 50(veya \nboşluk yerine (satırsonu)
  • {50,40,10,30,-20,50} (veya virgül yerine boşluklu)

Örnekler

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

kurallar

  • P'nin 1'den yüksek olduğu garanti edilir
  • Mümkünse programınızı test etmek için bir yol sağlamalısınız
  • Bu boşlukların yasak olduğunu ve yukarıda belirtildiği gibi kod eklemeye izin verilmediğini unutmayın

Puanlama ve Skor Tablosu

Bu olduğundan mümkün olduğunca kısa olması gerekir . Herhangi bir cevap kabul edilmeyecektir , çünkü bu zorluk, golf dillerine haksız bir avantajdan kaçınarak, dile göre en kısa cevabı bulmak anlamına gelir.


İlgili soru tarafından ETHproductions: Pazartesi Mini-Golf # 1: Ters Fibonacci Çözücü


İlgili, olası çift. Temel olarak bununla aynı zorluk, ancak dizideki belirli bir noktadan ters sırada çıktı.
ETHproductions 16:17

@ETHproductions bir dupe olarak düşünülebilir, ancak bu her dilde en kısa çözümü görmeye çalışırken biraz farklıdır
Bay Xcoder

Evet, o zamanlar dil eşitsizliği konusunda çok fazla endişe yoktu ;-) Ama bunun büyük bir fark yarattığını düşünmüyorum. Buradaki ana fark, bu meydan okumayı çözmek için kullanacağınız algoritmanın ilk adımını hemen hemen dışarıda bırakabilmenizdir (başlangıç ​​noktasını bulmak için geriye doğru çalışma)
ETHproductions

@ETHproductions gerçekten küçük farklılıklar var. Bu zorluğun kaldırılmasını istiyorsanız, tamamen yapacağım.
Bay Xcoder

Şahsen iyi olduğunu düşünüyorum. Bir yana, sondaki ayırıcıya sahip miyiz?
ETHproductions 16:17

Yanıtlar:


9

Haskell, 29 bayt

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

Uzunluk pilk parametredir. Kullanım örneği: ( (.(#)).(.).take ) 10 50 40-> [50,40,10,30,-20,50,-70,120,-190,310]. Çevrimiçi deneyin! .

Listeyi pöğelere kısaltmak, listeyi oluşturmaktan daha fazla bayt alır.


6

Jöle , 6 bayt

_@С+Ṗ

Çevrimiçi deneyin!

Nasıl çalışır

_@С+Ṗ  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 bayt

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

1,2,3,Dizeleri kullanmadan bir biçim dizesi döndürür !

Test snippet'i


5

Perl 6 , 25 bayt

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

Dene

Expanded:

{  # 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 bayt

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

1 ekstra bayt, çünkü CJam doğal olarak izin verilen çıktı biçimlerinden birini kullanmıyor> _ <

Çevrimiçi deneyin!

açıklama

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 bayt

ÍFÂ2£¥«

Çevrimiçi deneyin!

açıklama

Í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 bayt

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

Çevrimiçi deneyin!

Açıklaması:

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 bayt

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

Kullanarak arayın (m!n)p. Tanımlayarak İşleri !alır, bir çatı ve çatı fonksiyonu olarak mve nalır ve bir işlev döner pve arzu edilen sonucu verir.


Güzel! Ben işlev infix yapmak düşünmüyordu, bu yüzden haskell ile en iyi denemem 34 oldu. BTW sen ;tek satır yapmak için ile newline değiştirebilirsiniz , bu yüzden biraz daha codegolfy görünüyor.
AlexJ136

2

Ruby, 31 bayt

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

Kolay çözüm


2

PHP, 76 Bayt

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

PHP, 84 Bayt

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

2

Pyth, 18 bayt

JEKEVEJ=N-JK=JK=KN

Çevrimiçi deneyin!

Girdi ve çıktının her ikisi de yeni satırlarla sınırlanır.

Nasıl çalışır:

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 bayt

{-1,1}~LinearRecurrence~##

Yerleşimi seviyor. Formda girdi alır {{m, n}, p}. LinearRecurrenceönceki elemanların doğrusal kombinasyonunun katsayılarını yeni elemanlar üretmek için kullanmak ister, ki bu durumda {-1,1}.


1

QBIC , 35 33 bayt

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

İlki PRINTbir kod hazır bilgisine yerleştirerek 2 bayt kaydedildi

Açıklama (35 baytlık sürüm):

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

Bunu test etmek için çevrimiçi bir çevirmen hakkında fikriniz var mı?
Bay Xcoder

@ Mr.Xcoder henüz çevrimiçi tercüman yok, üzgünüm. QBasic çalıştıran ve QBIC çalıştıran bir DOSBOX projesi olan yorumlayıcıya bir bağlantı ekledim.
steenbergh

1
Açıklama, @steenbergh yorumlayıcısından daha değerli, yanıt verdiğiniz için teşekkürler!
Bay Xcoder

1

C, 128 bayt

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);}

Bu program, üç bağımsız değişkenleri ayrıştırır m, nve pkomut hattı ve belirtilen çıkış basar.

Modern C derleyicileri temel ithalatı atlamak için izin verir ve böylece kullanabileceğimiz printfve atoiolmadan #includes.

Genel değişkenler intbir tür olmadan bildirildiğinde varsayılan olarak budur - bu çok fazla alan kazandırır.


1

Java, 66 bayt

Bir keresinde, lambdas, onlara çok fazla ekstra bayt gerektiren özyineleme uygulamalarının çok dolambaçlı yolu nedeniyle golf için verimsiz bir yaklaşımdır .

golfed:

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

Ungolfed:

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 bayt

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

Gerçekten bilmemenin yorgun 'Getting nasıl / geçti argümanları kullanmak mümkün olan ( %1%, %2%, ...) doğrudan herhangi bir matematik fonksiyonları


1

Python 2 , 9390 bayt

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])

Çevrimiçi deneyin!

@ Mr.Xcoder sayesinde 3 bayt tasarruf edildi

Sayıları girdi olarak alıp doğru biçimlendirerek, ardından girilen sayılara dayalı bir liste oluşturmak için for döngüsü kullanarak çalışır.


Bu aralıktaki virgülden sonra alanı 1 bayt kurtarmak için kaldırabilirsiniz
Bay Xcoder

Girişinizi ints ve input ile eşlerseniz daha kısa olabilir. Split
Bay

@ Mr.Xcoder Bölmeyi denedim, ama daha uzun oldu.
SparklePony Yoldaş

Tamam, test edemedim. Her neyse iyi.
Bay Xcoder

Ve menzilin ilk argümana ihtiyacı yok
Bay Xcoder

0

Swift - 85 bayt

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

Kullanımı: y(x:50,y:40,x:6)

Swift - 84 bayt

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

Kullanımı: z(l: [50,40,6])


Çıktı:

50
40
10
30
-20
50

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.