Вы уже давно собираете данные с Advanced Collecting Device Controller ™ . Вы проверяете журналы и, к своему ужасу, обнаруживаете, что что-то пошло не так: данные содержат только последние биты цифр!
К счастью, вы знаете начальное значение и оно никогда не меняется быстро. Это означает, что вы можете восстановить остальное, просто найдя расстояние от начала.
Вызов
Вы напишите программу или функцию для расчета суммы, на которую было изменено значение, с учетом модуля N
и списка промежуточных значений по модулю N
.
Изменение между каждой парой чисел всегда меньшеN/2
, поэтому для каждого теста будет только один действительный ответ.
В качестве входных данных вы получите целое число N
> 2 и список значений в выбранном вами формате. Ввод может быть дан через STDIN или командную строку или аргументы функции.
Вы выведете одно целое число, на которое изменилось исходное значение. Вывод может быть распечатан на STDOUT или возвращен.
правила
- Ваша программа должна работать на любое расстояние и модуль меньше, чем
2^20
. - Вы можете предположить, что:
N
по крайней мере3
.- Список имеет как минимум 2 значения.
- Все значения в списке по крайней мере 0 и меньше, чем
N
. - Все изменения в цифрах меньше, чем
N/2
.
- Все остальное является неверным вводом, и ваша программа может делать все, что захочет.
- Стандартные лазейки, любые нестандартные библиотеки и встроенные функции для этой цели запрещены.
- Это код-гольф , поэтому выигрывает самая короткая программа в байтах.
Пример тестовых случаев
Входные данные:
3
0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Выход:
4
Пояснение (с примером значения):
Value mod 3: 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1
Value: 0 1 2 2 3 4 3 2 1 2 3 4 5 4 4
Входные данные:
10
5 2 8 9 5
Выход:
-10
Пояснение (с примером значения):
Value mod 10: 5 2 8 9 5
Value: 15 12 8 9 5
Неверные данные:
2
0 0 0 0 0
(слишком маленький модуль)
6
2 5 4 2
(слишком большое изменение между 2 и 5)
:^;[5 2 8 9 5](\
?Ответы:
TI-BASIC, 15 байтов
Принимает список от
Ans
и модуль отInput
.источник
Python 2, 53 байта
Супер прямой ответ. Интересно, есть ли более короткий путь?
источник
.:_2
создании пар, пока не увидел ваш ответ - я использовал zip.Mathematica, 30 байт
Это анонимная функция, которая принимает два аргумента. Пример использования:
Это работает путь принятия
Differences
между последовательными элементами, упаковка их в диапазон ,-n/2
чтобы+n/2
сMod
и его смещение параметра, а затем принимает общее сTr
(след матрицы, сумма диагональных элементов).Обратите внимание, что даже без golf это только 43 байта!
источник
@
не требуется, когда вы уже вызываете функцию в квадратных скобках. Наличие обоих является синтаксической ошибкой.J, 24 байта
Использование:
Попробую еще поиграть в гольф и добавить некоторые объяснения после этого.
Попробуйте это онлайн здесь.
источник
Pyth,
2019 байтовУкрал
.:_2
у Якуба, идея у Мауриса.источник
R, 38 байт
Это создает безымянную функцию, которая принимает целое число и вектор в качестве входных данных и возвращает одно целое число. Чтобы назвать его, дайте ему имя, например
f=function(n,v)...
.Ungolfed + объяснение:
Примеры:
источник
MatLab, 33 байта
Мои извинения, это мой первый ответ на этом сайте. Ввод этого в MatLab с последующим использованием ввода
ans(modulus_value, [intermediate_values])
вернет запрошенное значение, где 'modulus_value' - это значение модуля, а 'interval_values' - это список промежуточных значений, разделенных пробелами или запятыми.Пример:
Анонимная функция имеет преимущество от Matlab
mod
,diff
иsum
функции для вычисления ответа. Сначала вычисляется разница между каждым из промежуточных значений. Затем результат смещается на модуль, деленный на два, что приводит к набору значений разностей, которые связаны [-modulus / 2 modulus / 2]. Затем результат смещается и снова суммируется.Я думаю, что это может быть больше в гольфе, я скоро вернусь с обновлением. Отдельное спасибо @ 2012rcampion за идею.
Изменить:
unwrap
функция Matlab здесь почти работает, но это трудно для гольфа. Следующий код возвращает массив, где последним значением является величина, на которую было изменено первое значение:@(x,y)unwrap(y/x*2*pi)/2/pi*x-y(1)
Промежуточные значения масштабируются до диапазона [-pi pi], а затем «разворачиваются» так, что никакое последовательное значение не больше, чем pi друг от друга. Эти значения затем масштабируются и сдвигаются, в результате чего получается массив расстояний от начального значения.
Интересно, но не очень практично для этой задачи: D
источник
Pyth, 29 байт
Попробуйте онлайн: Pyth Compiler / Executor
источник
CJam, 27 байтов
Проверьте это здесь.
источник
Пип , 39 байт
Требуется список данных в качестве аргументов командной строки и модуль STDIN. Если это слишком много, у меня есть версия, которая принимает два аргумента командной строки на 5 байтов больше.
Объяснение:
И просто для того, чтобы доказать, что эта не столь конкурентоспособная оценка больше отражает мои навыки игры в гольф, чем мой язык, вот порт решения Python от Mauris в 30 байтов :
источник
Желе , неконкурентоспособное
6 байт. Этот ответ не является конкурирующим, поскольку задача предшествует созданию желе.
Попробуйте онлайн!
Как это устроено
источник