Послідовності контр-Фібоначчі


13

Враховуючи три числа m , n і p , ваше завдання - надрукувати список / масив довжини p, починаючи з m і n, і кожен елемент після p являє собою різницю двох чисел перед ним, mn (Контр- послідовність Фібоначчі )

Для цього завдання ви можете використовувати функцію повернення чи друку результату або повну програму.

Вхідні дані

Три цілі числа, m , n і p , розділені новими рядками / пробілами / комами, незалежно від того, що підтримує ваша мова, але вам слід вказати формат введення. Введення коду заборонено.

Вихідні дані

Числа, що містяться в послідовності Counter-Fianacbones, у будь-якому з наступних форматів (цей приклад m = 50, n = 40, p = 6:):

  • 50,40,10,30,-20,50 (або з проміжком після коми)
  • [50,40,10,30,-20,50] (або з проміжком після коми)
  • 50 40 10 30 -20 50(або з \n(нові рядки) замість пробілів)
  • {50,40,10,30,-20,50} (або з пробілами замість коми)

Приклади

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

Правила

  • Вам гарантовано, що p вище 1
  • Ви маєте надати спосіб перевірити свою програму, якщо це можливо
  • Візьміть до уваги, що ці лазівки заборонені, а вставлення коду заборонено, як згадувалося вище

Підрахунок та таблиця лідерів

Ваш код повинен бути якомога коротшим, оскільки це . Відповідь не приймається , оскільки ця задача має на меті знайти найкоротшу відповідь за мовою, уникаючи несправедливої ​​переваги для мов для гольфу.


Питання, пов'язані з ETHproductions: Понеділок Міні-Гольф №1: Реверс Фібоначчі


Пов’язаний, можливий дублікат. Це в основному той же виклик, що і цей, але виводиться у зворотному порядку з певного місця в послідовності.
ETHproductions

@ETHproductions можна вважати дуром, але це трохи інакше, намагаючись побачити найкоротше рішення на кожній мові
Містер Xcoder

Так, тоді не так сильно хвилювались нерівності мови ;-) Я не думаю, що це має велику різницю. Основна відмінність тут полягає в тому, що ви можете майже залишити перший крок алгоритму, який ви використали б для вирішення цього завдання (працюючи назад, щоб знайти вихідну точку)
ETHproductions

@ETHproductions дійсно є невеликі відмінності. Якщо ви хочете зняти цей виклик, я цілком це зроблю.
Містер Xcoder

Я особисто думаю, що це добре. Убік, чи дозволяється нам мати відривний кінець?
ETHproductions

Відповіді:


9

Хаскелл, 29 байт

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

Довжина p- перший параметр. Приклад використання: ( (.(#)).(.).take ) 10 50 40-> [50,40,10,30,-20,50,-70,120,-190,310]. Спробуйте в Інтернеті! .

Скорочення списку до pелементів займає більше байтів, ніж його створення.


6

Желе , 6 байт

_@С+Ṗ

Спробуйте в Інтернеті!

Як це працює

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

Perl 6 , 25 байт

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

Спробуй це

Розширено:

{  # 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 байт

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

1 додатковий байт, оскільки CJam, природно, не використовує жодного з дозволених форматів виводу> _ <

Спробуйте в Інтернеті!

Пояснення

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


3

Рода , 38 байт

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

Спробуйте в Інтернеті!

Пояснили:

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 байти

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

Дзвінок за допомогою (m!n)p. Роботи по визначенню !в інфіксне , яка приймає в mі nй повертає функцію , яка приймає pі повертає бажаний результат.


Приємно! Я не думав робити функцію інфіксом, тому я найкраще спробував за допомогою haskell 34. BTW ви можете замінити новий рядок, ;щоб зробити його однорядним, тому він виглядає трохи більше кодовим.
AlexJ136

2

Рубін, 31 байт

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

Безпосереднє рішення


2

PHP, 76 байт

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

PHP, 84 байт

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

2

Піт, 18 байт

JEKEVEJ=N-JK=JK=KN

Спробуйте в Інтернеті!

Введення та вихід обоє обмежуються новими рядками.

Як це працює:

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

Математика, 26 байт

{-1,1}~LinearRecurrence~##

Люблю вбудований. Бере введення у формі {{m, n}, p}. LinearRecurrenceхоче, щоб коефіцієнти лінійної комбінації попередніх елементів використовувались для створення нових елементів, що в цьому випадку є {-1,1}.


1

QBIC , 35 33 байт

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

Збережено 2 байти, помістивши перший PRINTв один буквальний код.

Пояснення (версія 35 байт):

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

У вас є ідея онлайн-перекладача, щоб перевірити це?
Містер Xcoder

@ Mr.Xcoder ще немає перекладача в Інтернеті, вибачте. Я додав посилання на інтерпретатор, який є проектом DOSBOX, який працює під керуванням QBasic та працює з QBIC.
steenbergh

1
Пояснення варто більше, ніж перекладач @steenbergh, дякую за відгук!
Містер Xcoder

1

C, 128 байт

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

Ця програма аналізує три аргументи m, nі pз командного рядка, і друкує висновок , як зазначено.

Сучасні компілятори C дозволяють опускати базовий імпорт, і таким чином ми можемо використовувати printfі atoiбез #includes.

Глобальні змінні intза замовчуванням декларуються без типу - це економить багато місця.


1

Java, 66 байт

Колись лямбдас - це неефективний підхід до гольфу через дуже круговий спосіб застосування рекурсії до них, що вимагає багато зайвих байтів.

Гольф:

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

Безголівки:

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 байт

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

Отримання » на насправді втомився, не знаючи , як / бути в змозі використати передані аргументи ( %1%, %2%, ...) безпосередньо в будь-яких математичних функцій


1

Python 2 , 93 90 байт

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

Спробуйте в Інтернеті!

Збережено 3 байти завдяки @ Mr.Xcoder

Він працює, приймаючи числа як вхідні та правильно їх форматуючи, а потім використовуючи цикл for для створення списку на основі введених чисел.


Ви можете видалити пробіл після коми в цьому діапазоні, щоб зберегти 1 байт
Містер Xcoder

І це може бути коротше, якщо картографувати свої дані за допомогою ints та input.split
Містер Xcoder

@ Mr.Xcoder Я спробував спліт, але він закінчився довше.
Товариш SparklePony

Гаразд, я не міг її перевірити. Все одно добре.
Містер Xcoder

І діапазону не потрібен перший аргумент
містер Xcoder

0

Швидкий - 85 байт

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

Використання: y(x:50,y:40,x:6)

Свіфт - 84 байти

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

Використання: z(l: [50,40,6])


Вихід:

50
40
10
30
-20
50

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.