Sekwencje przeciw-Fibonacciego

13

Biorąc pod uwagę trzy liczby m , n i p , zadaniem jest, aby wydrukować / tablicę o długości P wychodząc z m i n każdy element po P oznacza różnicę w liczbie 2 przed sobą, MN (Counter Fibonacciego )

W przypadku tego wyzwania możesz użyć funkcji do zwrócenia lub wydrukowania wyniku lub pełnego programu.

Wejście

Trzy liczby całkowite, m , n i p , oddzielone znakiem nowej linii / spacją / przecinkiem, bez względu na obsługiwany język, ale należy określić format wejściowy. Wstawianie kodu jest niedozwolone.

Wynik

Liczby zawarte w sekwencji Counter-Fibonacciego, w dowolnym z następujących formatów (ten przykład m = 50, n = 40, p = 6:):

  • 50,40,10,30,-20,50 (lub z odstępami po przecinkach)
  • [50,40,10,30,-20,50] (lub z odstępami po przecinkach)
  • 50 40 10 30 -20 50(lub z \n(nowe linie) zamiast spacji)
  • {50,40,10,30,-20,50} (lub ze spacjami zamiast przecinków)

Przykłady

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

Zasady

  • Masz gwarancję, że p jest wyższe niż 1
  • Jeśli to możliwe, powinieneś podać sposób przetestowania swojego programu
  • Należy pamiętać, że te luki są zabronione, a wstawianie kodu jest zabronione, jak wspomniano powyżej

Punktacja i liderów

Twój kod musi być jak najkrótszy, ponieważ jest to . Żadna odpowiedź nie zostanie zaakceptowana , ponieważ wyzwanie to ma na celu znalezienie najkrótszej odpowiedzi według języka, unikając nieuczciwej przewagi nad językami golfa.


Powiązane pytanie zadane przez ETHproductions: Monday Mini-Golf # 1: Reverse Fibonacci Solver

Pan Xcoder
źródło
Powiązane, możliwe duplikaty. Jest to w zasadzie to samo wyzwanie, co to, ale generowanie w odwrotnej kolejności z określonego miejsca w sekwencji.
ETHprodukcje
@ETHproductions można uznać za duplikat, ale to trochę inaczej, próbując znaleźć najkrótsze rozwiązanie w każdym języku
Mr. Xcoder
Tak, wtedy nie martwiłem się tak bardzo nierównością językową ;-) Nie sądzę, żeby miało to duże znaczenie. Główną różnicą jest to, że możesz pominąć pierwszy krok algorytmu, którego
użyłbyś
@ETHproductions rzeczywiście istnieją małe różnice. Jeśli chcesz usunąć to wyzwanie, zrobię to całkowicie.
Pan Xcoder,
Osobiście uważam, że jest w porządku. Poza tym, czy wolno nam mieć separator końcowy?
ETHprodukcje

Odpowiedzi:

9

Haskell, 29 bajtów

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

Długość pto pierwszy parametr. Przykład użycia: ( (.(#)).(.).take ) 10 50 40-> [50,40,10,30,-20,50,-70,120,-190,310]. Wypróbuj online! .

Skrócenie listy do pelementów zajmuje więcej bajtów niż jej utworzenie.

nimi
źródło
6

Galaretka , 6 bajtów

_@С+Ṗ

Wypróbuj online!

Jak to działa

_@С+Ṗ  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
źródło
6

Python 2, 39 bajtów

-2 bajty dzięki produktom ETH

-1 bajt dzięki Dennisowi

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

Wypróbuj online!

ćpun matematyki
źródło
5

JavaScript (ES6), 33 bajty

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

Zwraca ciąg formatu 1,2,3,- bez użycia ciągów!

Testowy fragment kodu

ETHprodukcje
źródło
5

Perl 6 , 25 bajtów

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

Spróbuj

Rozszerzony:

{  # 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
źródło
5

CJam , 15 bajtów

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

1 dodatkowy bajt, ponieważ CJam naturalnie nie używa jednego z dozwolonych formatów wyjściowych> _ <

Wypróbuj online!

Wyjaśnienie

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
Business Cat
źródło
4

05AB1E , 9 7 bajtów

ÍFÂ2£¥«

Wypróbuj online!

Wyjaśnienie

Í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
źródło
3

Röda , 38 bajtów

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

Wypróbuj online!

Wyjaśniono:

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
źródło
3

Haskell , 33 bajty

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

Zadzwoń za pomocą (m!n)p. Prace definiując !jako funkcja Infix, które odbywają się w mi ni zwraca funkcję, która pobiera pi zwraca pożądanego rezultatu.

Julian Wolf
źródło
Ładny! Nie pomyślałem o zrobieniu poprawki, więc moja najlepsza próba z haskell to 34. BTW, możesz zastąpić nową ;linię, aby była ona jednowierszowa, więc wygląda trochę bardziej kodegolfy.
AlexJ136,
2

Rubinowy, 31 bajtów

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

Proste rozwiązanie

GB
źródło
2

PHP, 76 bajtów

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

PHP, 84 bajtów

[,$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
źródło
2

Pyth, 18 bajtów

JEKEVEJ=N-JK=JK=KN

Wypróbuj online!

Wejścia i wyjścia są rozdzielane znakami nowej linii.

Jak to działa:

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
źródło
1

Mathematica, 26 bajtów

{-1,1}~LinearRecurrence~##

Kochanie wbudowanego. Pobiera dane wejściowe w formularzu {{m, n}, p}. LinearRecurrencechce znać współczynniki liniowej kombinacji poprzednich elementów do generowania nowych elementów, co w tym przypadku jest {-1,1}.

Greg Martin
źródło
1

QBIC , 35 33 bajtów

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

Zaoszczędzono 2 bajty, umieszczając pierwszy PRINTw jednym dosłownym kodzie.

Objaśnienie (wersja 35-bajtowa):

:::         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
źródło
Masz pomysł na tłumacza internetowego, który to przetestuje?
Pan Xcoder,
@ Mr.Xcoder nie ma jeszcze tłumacza online, przepraszam. Dodałem link do interpretera, który jest projektem DOSBOX z QBasic i QBIC.
steenbergh
1
Wyjaśnienie jest warte więcej niż tłumacz @steenbergh, dziękuję za odpowiedź!
Pan Xcoder,
1

C, 128 bajtów

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 ten analizuje trzy argumenty m, na pz linii poleceń oraz wypisuje wyjście określony.

Nowoczesne kompilatory C pozwalają pominąć importowanie podstawowe, dzięki czemu możemy używać printfi atoibez niego #include.

Zmienne globalne są intdomyślnie deklarowane bez typu - oszczędza to dużo miejsca.

AlexJ136
źródło
1

Java, 66 bajtów

Po raz pierwszy lambda są nieefektywnym podejściem do gry w golfa ze względu na bardzo okrągły sposób zastosowania rekurencji, która wymaga wielu dodatkowych bajtów.

Gra w golfa:

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

Nie golfowany:

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) : "");
  }
}
Społeczność
źródło
1

AHK, 68 bajtów

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

Pierwsze”naprawdę zmęczony, nie wiedząc, jak / jest w stanie wykorzystywać przekazane argumenty ( %1%, %2%...) bezpośrednio w żadnej funkcji matematycznych

Inżynier Toast
źródło
1

Python 2 , 93 90 bajtów

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

Wypróbuj online!

Zaoszczędzono 3 bajty dzięki @ Mr.Xcoder

Działa, biorąc liczby jako dane wejściowe i formatując je poprawnie, a następnie używając pętli for do wygenerowania listy na podstawie wprowadzonych liczb.

Towarzyszu SparklePony
źródło
Możesz usunąć spację po przecinku w tym zakresie, aby zaoszczędzić 1 bajt
Mr. Xcoder
I może być krótszy, jeśli zamapujesz swoje wejście za pomocą ints i input.split
Mr. Xcoder
@ Mr.Xcoder Próbowałem podziału, ale zakończyło się to dłużej.
Towarzysz SparklePony,
Ok, nie mogłem tego przetestować. I tak jest dobrze.
Pan Xcoder,
A zakres nie potrzebuje pierwszego argumentu
Pan Xcoder
0

Swift - 85 bajtów

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

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

Swift - 84 bajtów

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

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


Wynik:

50
40
10
30
-20
50
Pan Xcoder
źródło
0

Python - 55 bajtów

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

Wypróbuj online! & Stosowanie:s(50,40,6)

Uwaga: Rozwiązanie bez lambda

Pan Xcoder
źródło