Контр-последовательности Фибоначчи


13

Учитывая три числа m , n и p , ваша задача состоит в том, чтобы напечатать список / массив длины p, начинающийся с m и n, и каждый элемент после p представляет разность двух чисел перед ним, mn ( последовательность Фибоначчи )

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

вход

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

Выход

Числа, содержащиеся в последовательности Счетчика-Фибоначчи, в любом из следующих форматов (этот пример:) 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

правила

  • Вам гарантировано, что р выше 1
  • Вы должны предоставить способ тестирования вашей программы, если это возможно
  • Обратите внимание, что эти лазейки запрещены, а вставка кода запрещена, как указано выше.

Скоринг и таблица лидеров

Ваш код должен быть как можно короче, так как это . Ответ не будет принят , потому что это задание предназначено для поиска кратчайшего ответа по языку, избегая несправедливого преимущества для языков игры в гольф.


Соответствующий вопрос от ETHproductions: Понедельник Мини-гольф № 1: Обратный решатель Фибоначчи


Связанный, возможно, дубликат. Это в основном та же самая проблема, что и эта, но вывод в обратном порядке из определенного места в последовательности.
ETHproductions

@ETHproductions можно считать обманом, но это немного по- другому, пытаясь найти кратчайшее решение для каждого языка
г-н Xcoder

Да, тогда не было такого большого беспокойства по поводу языкового неравенства ;-) Я не думаю, что это имеет большое значение. Основное отличие состоит в том, что вы можете в значительной степени опустить первый шаг алгоритма, который вы бы использовали для решения этой задачи (работая в обратном направлении, чтобы найти отправную точку)
ETHproductions

@ETHproductions действительно есть небольшие различия. Если вы хотите, чтобы этот вызов был удален, я сделаю это полностью.
г-н Xcoder

Я лично думаю, что все в порядке. Кроме того, мы можем иметь конечный разделитель?
ETHproductions

Ответы:


9

Haskell, 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]}

Попытайся

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

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. Кстати, вы можете заменить символ новой строки, ;чтобы сделать его однострочным, чтобы он выглядел немного более придирчиво.
AlexJ136


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

Pyth, 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

Mathematica, 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, спасибо за ответ!
Мистер Кскодер,

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без#include s.

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


1

Java, 66 байт

На этот раз лямбды - неэффективный подход к игре в гольф из-за очень окольного способа применения к ним рекурсии. который требует много дополнительных байтов.

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

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

И это может быть короче, если вы отобразите свой ввод с помощью ints и input.split
Mr. Xcoder

@ Mr.Xcoder Я попробовал сплит, но в итоге получилось больше.
Товарищ SparklePony

Хорошо, я не мог проверить это. В любом случае это хорошо.
г-н Xcoder

И диапазон не нуждается в первом аргументе
г-н Xcoder

0

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

Swift - 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.