Давайте используем четыре основные операции: сложение +
, умножение *
, вычитание -
и деление /
(число с плавающей точкой, а не целое число).
Последовательность Стьюи определяется следующим образом:
x = [x(1), x(2)] // Two initial numbers (one indexed)
x(3) = x(1) + x(2)
x(4) = x(2) * x(3)
x(5) = x(3) - x(4)
x(6) = x(4) / x(5)
x(7) = x(5) + x(6)
... and so on.
Вызов:
Возьмите два неотрицательных целых числа ( x(1), x(2)
) и одно положительное целое число в N
качестве входных данных.
x(1)
и x(2)
будет двумя первыми числами вашей последовательности, и N
будет длиной последовательности, которую вы должны вывести. (Вы можете выбрать список на основе 0, в этом случае N
длина будет на единицу меньше длины).
- Вы не можете предполагать это
x(2) >= x(1)
. N
всегда будет,>2
если 1 на основе, (>1
если 0 на основе).- Вам не нужно обрабатывать деление на ноль ошибок.
- Обратите внимание на второй контрольный пример. Вы не получите
0, 1
, и вN=6
качестве ввода, так как это приведет к делению на ноль, но вы должны поддерживать0, 1
иN=5
.
- Обратите внимание на второй контрольный пример. Вы не получите
- Предположим, будет дан только верный ввод.
- Ввод и вывод могут быть в любом удобном формате, но вы должны поддерживать не менее 3 цифр после десятичной точки, если вывод не является целым числом.
Тестовые случаи:
1 3
8
1, 3, 4, 12, -8, -1.5, -9.5, 14.25
0 1
5
0, 1, 1, 1, 0 // N=6 would give division by zero error. You don't need to handle that case.
1 0
9
1, 0, 1, 0, 1, 0, 1, 0, 1
6 3
25
6, 3, 9, 27, -18, -1.5, -19.5, 29.25, -48.75, -0.6, -49.35, 29.61, -78.96, -0.375, -79.335, 29.7506, -109.086, -0.272727, -109.358, 29.825, -139.183, -0.214286, -139.398, 29.8709, -169.269
N
быть 0 на основе? Поэтому возьмите в качестве входов 1 меньше, чем N, показанное в ваших примерах Я думаю, что брать N-2 - это слишком много, чтобы просить ... :-PОтветы:
MATL ,
191817 байтВходные данные в формате:
N
( от 0),x(1)
,x(2)
(как строки); все разделены переводом строки.Попробуйте онлайн! Или проверьте все контрольные примеры (слегка измененный код; выходные последовательности разделены пустой строкой).
объяснение
У MATL нет правильной
eval
функции, ноU
(str2num
) может вычислять числовые выражения с помощью инфиксных операторов.Каждый новый термин вычисляется и помещается в стек, сохраняя предыдущие термины. Весь стек печатается в конце.
источник
Haskell,
696864 байтаx1
иx2
принимаются в виде списка. Пример использования:[1,3] # 8
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Лень позволяет определить бесконечный рекурсивный список, в котором мы берем первые n элементов.
Haskell, 66 байт
Другой подход, чуть дольше. Порядок Аргумент
N
,x2
,x1
. Пример использования:( (.a).(.).take ) 8 3 1
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Определяет 4 функции
a
,b
,c
иd
которые принимают два аргументаy
,x
и сделать список, поставивx
перед вызовом следующей функции с вy
качестве второго аргумента , иx op y
как первый. Напримерa
это:a y x = x : (b (x+y) y)
,b
делает умножение:b y x = x : (c (x*y) y)
и т.д.Редактировать: @ Майкл Кляйн сохранил байт в 1-м варианте (
#
). К счастью, я также нашел один байт для второго варианта, поэтому оба снова имеют одинаковую длину.Правка II: @Zgarb нашел 2 байта во второй версии для сохранения и I 4 в первой, так что они больше не имеют одинаковую длину.
источник
(.)
составлен с другими функциями: pg x=(`take`f)where
не сохраняет байт: - /(h%g)y x=x:g(h x y)y
ES6 (Javascript),
79,6765 байтОБНОВИТЬ
Golfed
Тест
источник
++i
чтобы избежать необходимости добавлять 1 кi
дважды??S(n,a,i+1,a.push(...)):a
может сэкономить вам несколько байтов.a.push
возвращает новую длину,S=(n,a,i=2)=>i<n?S(n,a,a.push(...)):a
i=2
.S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"+*-/"[i%4]+a[i-1]))):a
сэкономить 2 байта.Python 3,
908074 байтаxnor, вероятно, придет и уничтожит это решение ...
Функция изменяет список, переданный ей. Используйте как это:
Попробуйте на repl.it!
-6 байт благодаря меди
источник
O
один раз, вы можете сохранить несколько байтов, сделав'-/+*'[i%4]
и удалив объявлениеO
. Кроме того, вы можете обойти повторные звонкиstr
, сделав что-то вродеeval('%s'*3%(s[-2],'-/+*'[i%4],s[-1]))
.s+=[...]
может быть заменено наs+=...,
(обратите внимание на запятую).i
качестве входных данных, поэтому вам не нужно значение по умолчанию для него (i=2
может быть простоi
). Два байта прочь.n
вместо этого было разрешено возвращать этот элемент в последовательности, это на 1 байт короче с рекурсией:f=lambda x,n:n<2and x[n-1]or eval('%s'*3%(f(x,n-2),'*-/+'[n%4],f(x,n-1)))
Perl 6 ,
75 7161 байтПопробуй это
Попробуй это
Попробуй это
Expanded:
источник
Mathematica, 68 байт
Едва пробрался на 3 место! Безымянная функция трех аргументов, которая использует вспомогательный унарный оператор,
±
такой, что±n
это точно n-й элемент x (n) последовательности Стьюи. Первые два аргумента - это x (1) и x (2), а третий аргумент - это N, указывающий, какой x (N) мы выводим.Прямая реализация с использованием вычисления mod-4, чтобы выбрать, какую двоичную функцию применять к двум предыдущим терминам. Выбор правильной бинарной функции, которая
1##[#-#2,#/#2,+##]
помогает вам, использует некоторые из этих забавных трюков игры в гольф от Mathematica .источник
05AB1E ,
211918 байтВвод берется в порядке N (на основе 0), x (2) , x (1) .
Сохранено 1 байт благодаря carusocomputing .
Попробуйте онлайн!
объяснение
Мы итеративно строим стек с последним элементом в последовательности сверху, сохраняя все предыдущие элементы в порядке.
Затем в конце мы оборачиваем стек в список, чтобы отобразить все значения сразу.
источник
XY
иUV
может сэкономить вам байты.UX
:)Common Lisp, 158
Не очень конкурентоспособный, но мне нравится, как это выражается вполне естественно:
Мы игнорируем ошибки при вычислении R, в результате чего R (а затем и B), возможно, принимает значение NIL. Это позволяет вывести текущий результат, даже если следующее значение не определено. Затем, в конце концов, цикл завершится ошибкой, но это в рамках правил.
тесты
Назовем функцию
F
и убедимся, что ожидаемые значения примерно равны проверенному.Причина приблизительного теста состоит в том, что вычисленные значения немного более точны, чем требуется; здесь, для
(f 6 3 25)
:источник
постоянный ток,
112110108 байтИногда
dc
ответы могут быть очень длинными, а иногда они могут быть очень короткими. Все зависит только от поставленной задачи, как в случае со многими другими языками. В любом случае, при запросе в командной строке вводится разделенная пробелами одноиндексная входная строка из трех целых чисел,x(1), x(2), N
и каждый элемент последовательности выводится в отдельных строках с нецелыми выходными данными, содержащими 5 цифр после десятичной точки.Например, ввод
6 3 25
приводит к следующему выводу:источник
Perl, 62 + 3 (
-pla
флаг) = 65 байтС помощью:
источник
Рубин, 79 байтов
Я подозреваю, что это очень далеко от оптимального (и я еще не смотрел на другие ответы), но, тем не менее, это весело.
Я хотел повеселиться
Enumerable#cycle
, но, к сожалению, на 4 персонажа меньше, чем просто использовать%4
.источник
C ++ 14, 118 байт
Как безымянная лямбда изменяет свой ввод. Требуется
v
бытьvector<double>
илиvector<float>
.Ungolfed и использование:
источник
машинный код x86-64, 34 байта
Соглашение о вызове = x86-64 System V x32 ABI (зарегистрируйте аргументы с 32-разрядными указателями в длинном режиме).
Подпись функции есть
void stewie_x87_1reg(float *seq_buf, unsigned Nterms);
. Функция получает начальные значения x0 и x1 в первых двух элементах массива и расширяет последовательность, по крайней мере, еще на N элементов. Буфер должен быть дополнен до 2 + N-округлено до следующего-кратного-4. (т.е.2 + ((N+3)&~3)
или просто N + 5).Требование заполненных буферов является нормальным в сборке для высокопроизводительных или SIMD-векторизованных функций, и этот развернутый цикл похож, поэтому я не думаю, что он слишком сильно нарушает правила. Вызывающий может легко (и должен) игнорировать все элементы заполнения.
Передача x0 и x1 как функции arg, которой еще нет в буфере, обойдется нам всего в 3 байта (для a
movlps [rdi], xmm0
илиmovups [rdi], xmm0
), хотя это будет нестандартное соглашение о вызовах, поскольку System V передаетstruct{ float x,y; };
в два отдельных регистра XMM.Это
objdump -drw -Mintel
вывод с небольшим форматированием для добавления комментариевЭта реализация ссылки C компилирует (с
gcc -Os
) в несколько похожий код. gcc выбирает ту же стратегию, что и я: хранить только одно предыдущее значение в регистре.Я экспериментировал с другими способами, включая версию с двумя регистрами x87, которая имеет такой код:
Вы бы сделали это таким образом, если бы вы шли на скорости (а SSE не было доступно)
Помогло бы размещение нагрузок из памяти внутри цикла вместо однократного ввода, поскольку мы могли бы просто хранить результаты sub и div не по порядку, но все же для настройки стека при входе необходимы две инструкции FLD.
Я также попытался использовать скалярную математику SSE / AVX (начиная со значений в xmm0 и xmm1), но больший размер инструкции является убийственным. Использование
addps
(так как это на 1B корочеaddss
) помогает немного. Я использовал AVX VEX-префиксы для некоммутативных инструкций, поскольку VSUBSS всего на один байт длиннее SUBPS (и такой же длины, что и SUBSS).Протестировано с помощью этого теста:
Компилировать с
nasm -felfx32 -Worphan-labels -gdwarf2 golf-stewie-sequence.asm &&
gcc -mx32 -o stewie -Og -g golf-stewie-sequence.c golf-stewie-sequence.o
Запустите первый тест-кейс с
./stewie 8 1 3
Если у вас не установлены библиотеки x32, используйте
nasm -felf64
и оставьте gcc по умолчанию-m64
. Я использовалmalloc
вместоfloat seqbuf[seqlen+8]
(в стеке) получение низкого адреса без фактической сборки как x32.Интересный факт: в YASM есть ошибка: он использует rel32 jcc для ветвления цикла, когда цель ветвления имеет тот же адрес, что и глобальный символ.
собирает в ...
11f: 0f 8f db ff ff ff jg 100 <stewie_x87_1reg>
источник
05AB1E , 12 байтов
Попробуйте онлайн!
источник
Japt , 20 байт
Попытайся
источник
Bash, 224 байта (без конкурса)
Чрезвычайно большая реализация в BASH .
Принимает задачу буквально и делает все в одной непрерывной трубе, без каких-либо порочных структур управления или рекурсии.
вход
Golfed
Меньше гольфа
Тест
Этапы трубопровода
Создайте таблицу индексов элементов + op для каждого элемента выходной последовательности (по одному на строку):
Используйте sed, чтобы преобразовать это в линейную программу bc :
накормить это до н.э. и пусть он сделает всю работу
источник
Pyth - 20 байт
Вывод всего
n
стоит мне.Не работает онлайн потому что Eval.
источник
Цейлон, 195 байт
Отформатировано и прокомментировано:
Пример использования:
Пример вывода:
Второй пример показывает, как это будет обрабатывать деление на ноль. Последний пример показывает, что результаты немного отличаются в зависимости от того, какой тип арифметики (и округления) используется ... Я думаю, что 64-битная арифметика Цейлона немного ближе к тому, что должно быть, чем то, что было опубликовано в вопросе ,
источник
Clojure, 99 байт
Эта версия лучше использовать на практике, но имеет 110 байтов:
У меня были проблемы со слиянием итерированной функции и циклической последовательности операций, поэтому мне пришлось вместо этого использовать счетчик. Также пытался использовать таблицу переходов FSM, как,
{+ * * - - / / +}
но я не мог сжать ее для меньшего количества кода.Может быть выражено как анонимная функция
Un-golfed:
Должен быть вызван с плавающей точкой,
(f 6.0 3.0 25)
как иначе вы получите рациональные числа. В качестве альтернативы может быть начата итерация,[a (float b) 0]
которая приносит дополнительные символы.источник
Октава , 91 байт
Попробуйте онлайн!
Некоторые гольфы:
eval
звонкаeval
звонка*-/+
(не возможно в MATLAB)'
и"
во избежание выхода из апострофов (невозможно в MATLAB)n=@num2str
так как он используется дважды (невозможно в MATLAB)источник