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

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: Обратный решатель Фибоначчи

Мистер Xcoder
источник
Связанный, возможно, дубликат. Это в основном та же самая проблема, что и эта, но вывод в обратном порядке из определенного места в последовательности.
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

JavaScript (ES6), 33 байта

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

Возвращает строку формата 1,2,3,- без использования строк!

Тестовый фрагмент

ETHproductions
источник
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」
}
Брэд Гилберт b2gills
источник
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 */
fergusq
источник
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

Рубин, 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

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
draziwfozo
источник
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
steenbergh
источник
Есть идеи онлайн-переводчика, чтобы проверить это?
г-н 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по умолчанию при объявлении без типа - это экономит много места.

AlexJ136
источник
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
Мистер Xcoder
источник