Я прокручивал этот сайт какое-то время, но совсем недавно заинтересовался попыткой решения некоторых проблем. Я собирался попробовать свои силы в некоторых из существующих тем, посвященных коду для игры в гольф, но вчера у меня не было доступа к Интернету, а тем временем я решил свой собственный вызов.
Ваша задача состоит в том, чтобы создать программу или функцию, которая принимает массив a
чисел с плавающей точкой и целое число n
, а затем устанавливает для каждого значения a
среднее из двух значений рядом, n
раз. При многократном использовании с увеличением значений n
это создает волнообразное движение:
Особенности:
- Если в нем присутствует только один элемент
a
или еслиn
0 или меньше, программа должна вернуть исходный массив. - Входы и выходы могут быть в любом формате, который вы пожелаете, если они явно разделены.
Для каждого шага:
- Первый элемент в
a
должен стать средним для себя, а следующий элемент. - Последний элемент
a
должен стать средним значением самого себя и предыдущего элемента. - Любой другой элемент
a
должен стать средним по предыдущему и следующему элементу. - Убедитесь, что вы рассчитываете массив предыдущего шага, а не текущий!
Контрольные примеры: ПРИМЕЧАНИЕ. Ваши входы / выходы не обязательно должны быть в этом формате!
[0, 0, 1, 0, 0], 1 -> [0, 0.5, 0, 0.5, 0]
[0, 0, 1, 0, 0], 2 -> [0.25, 0, 0.5, 0, 0.25]
[0, 0, 1, 0, 0], 0 -> [0, 0, 1, 0, 0]
[0, 0, 1, 0, 0], -39 -> [0, 0, 1, 0, 0]
[0, 16, 32, 16, 0], 1 -> [8, 16, 16, 16, 8]
[0, 1, 2, 3, 4, 5], 1 -> [0.5, 1, 2, 3, 4, 4.5]
[0, 64], 1 -> [32, 32]
[0], 482 -> [0]
[32, 32, 32, 16, 64, 16, 32, 32, 32], 4 -> [33, 27, 40, 22, 44, 22, 40, 27, 33]
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах. Победитель будет выбран через неделю (1 августа). Удачи!
Изменить: Поздравляем победителя, @issacg , с колоссальными 18 байтов!
источник
n
не поставляемых иa
не поставляемых чехлов - они действительно мало что добавляют.n
должно быть 4, а не 5.Ответы:
Pyth,
4618 байтЭтот код ожидает ввода в форме
iterations, [wave1, wave2, wave3 ...]
, как видно по первой ссылке ниже.Демонстрация. Тест Жгут.
Программа работает, применяя код в функции redu (
u
) к списку ввода, столько раз, сколько итераций.Я продемонстрирую функцию распространения волн в списке
[0, 1, 2, 3, 4, 5]
, который находится вG
:+hGG
G
первый элемент prepends дляG
, формируя[0, 0, 1, 2, 3, 4, 5]
.t+GeG
добавляетG
последний элемент кG
и удаляет его первый элемент, формируя[1, 2, 3, 4, 5, 5]
.sV
first формирует пары из списков, давая[[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 5]]
с последним урезанным последним элементом первого списка. Затем пары суммируются с помощьюs
функции, дающей[1, 2, 4, 6, 8, 9]
.cR2
использует точку деления с плавающей разделить все числа на 2, что дает желаемого результата,[0.5, 1.0, 2.0, 3.0, 4.0, 4.5]
.источник
Снеговик 1.0.0 , 219 символов
С разрывами строки для «читабельности»:
Ungolfed / Unminified версия:
Примерный формат ввода / вывода:
источник
Pyth -
2524 байтаИспользует перечисление, сокращение для выполнения итераций.
Попробуйте это онлайн здесь .
источник
Ракетка,
164145 байтUngolfed
Обратите внимание, что вам может понадобиться
#lang racket
строка для запуска этого.источник
R, 109 байт
Это создает безымянную функцию, которая принимает вектор и целое число и возвращает вектор. Подход здесь заключается в том, чтобы рассматривать входные данные как одномерный временной ряд и применять фильтр линейной свертки.
Ungolfed + объяснение:
Примеры:
источник
Haskell, 76 символов
Хитрость заключается в том, чтобы добавить первое число в начало списка, а последнее - в конец списка вместо того, чтобы иметь дело с граничными условиями.
тесты:
источник
if then else
, то естьc
становитсяa#n|n<1=a|1<2=iterate f a!!n
иs
становитсяx!y=(x+y)/2
(и вызывается...zipWith(!)(x:a)...
).c
инфиксный оператор, скажем#
:a#n|n<1=a|1<2=iterate f a!!n
. Назовите это как[0, 0, 1, 0, 0] # 2
.CJam,
2322 байтаПопробуйте онлайн
Ввод в формате списка CJam, например, для последнего примера:
Результатом также является список CJam:
Основной подход заключается в том, что на каждом шаге вектор смещается на одну позицию влево и на одну позицию вправо. Каждый из двух векторов дополняется первым / последним элементом, а затем вычисляется среднее из двух векторов.
Объяснение:
источник
Ява, 181 байт
Вот версия для гольфа:
Ungolfed:
Я старался максимально сократить количество заданий и условий с помощью Java. Улучшения приветствуются, конечно.
источник
JavaScript (ES6),
15313267 символовЯ возвращаюсь к своему первому ответу через 6 месяцев и что мне делать? Гольф с 50%, вот что. ;)
Эта версия вызывает себя несколько раз, пока не
n
станет меньше 1, уменьшаясьn
на 1 каждый раз.Нерекурсивное решение (
15113078 символов):Ungolfed: (устарело)
рекурсивные:
Нерекурсивна:
источник
if(n<2)return b;return s(b,n-1)
может быть уменьшен доreturn n<2?b:s(b,n-1)
Java, 203 байта
Пытаюсь на мой первый поставить с Java. Советы по улучшению приветствуются :)
Довольно напечатано:
источник
for
цикла в оператор приращения цикла? Какfor(i=0;i<n;b[0]=...,b[s-1]=...,a=...,++i)for(...)b[j]=...;
? Тогда вы сможете избавиться от брекетов.++i
друг от друга запятыми вместо точек с запятой). Попробуйте это. :)f(a;b;c){d;e;}
должен быть полностью идентиченf{a;b;}{d;e;c;}
, а следовательно, иf(a;b;e,c)d;
. Однако, с вашим переставленным кодом, который больше не работает, потому что вы не можете переместитьfor
внутрь другогоfor
, поэтому я думаю, что все это больше не имеет значения. ;)Python 2, 98 байт
Принял простой подход, используемый
exec
для выхода из цикла while. Я думаю, что есть лучший способ сделать логику, чтобы выяснить особые позиции случая, но пока это работает. Ввод должен быть отформатирован как[list], times
.Ungolfed:
источник
Mathematica, 81 байт
У меня есть ощущение, что можно было бы больше играть в гольф, если бы я мог найти лучший способ справиться с положительным состоянием.
Стоит отметить: Mathematica предлагает множество потенциальных встроенных решений в своем диапазоне функций обработки списков и фильтров, а также
CellularAutomaton
. Я выбрал,Nest[... ListConvolve ...]
потому что это был самый простой способ отточить изгибы на концах списка, но другие углы могут оказаться короче.источник
Матлаб, 109
Примеры:
источник
Scala,
195 символов (186 с ленивым выводом, т.е.187 символовStream
)вероятно, не оптимально, отображение
sliding(3)
очень полезно в этом случае.Тесты:
источник
q (27 символов)
Примеры
источник
R, 93 байта
Как неназванная функция
расширенный
тесты
источник
Japt,
3937 байт (не конкурирует)Этот ответ не конкурирует, потому что язык новее, чем вызов. Я просто хотел посмотреть, насколько хорошо мой язык игры в гольф выдержит мой первый вызов.
Попробуйте онлайн!
источник
C ++ 14, 158 байт
Требует ввода, чтобы быть контейнером
value_type==double
, какvector<double>
.Ungolfed:
источник
Ракетка 223 байта
Ungolfed:
Тестирование:
Выход:
источник
Желе , 14 байт
Попробуйте онлайн!
Полная программа.
источник
C # (интерактивный компилятор Visual C #) ,
160144 байтаИспользует хорошую рекурсию.
Попробуйте онлайн!
источник