Обратные дельты массива
Ваша задача состоит в том, чтобы, учитывая массив 32-битных целых чисел со знаком, перекомпилировать его с обратными дельтами. Например, список
1 3 4 2 8
содержит дельты:
2 1 -2 6
которые затем отрицаются, давая:
-2 -1 2 -6
и перекомпилирован, получая:
1 -1 -2 0 -6
как конечный результат.
Ввод, вывод
Вам будет предоставлен список / массив / таблица / кортеж / стек / и т. Д. целых чисел со знаком в качестве ввода через любой стандартный метод ввода.
Вы должны снова вывести измененные данные в любой приемлемой форме, следуя описанному выше методу дельта-инверсии.
Вы получите N входов, 0 < N < 10
где каждое число попадает в диапазон-1000 < X < 1000
Тестовые случаи
5 6 7 8 -> 5 4 3 2
1 3 4 2 8 -> 1 -1 -2 0 -6
32 18 25 192 199 -> 32 46 39 -128 -135
Примечания
- Вы не ограничены дельта-методом: если вы можете разработать более простой метод (который не должен быть слишком сложным) , вы можете свободно его использовать.
- Как указано выше, вы всегда будете получать по крайней мере 1 вход, и не более 9.
- Первый номер вывода всегда должен быть первым номером ввода, если это не так, ваш метод неверен.
- Только стандартные входные данные принимаются
- Применяются стандартные лазейки
- Это код-гольф , поэтому побеждает самый низкий счетчик байтов!
- Веселиться!
У нас есть победитель.
Dennis «s Jelly Ответ на крошечном 3 Bytes взял домой золото, из - за того , что я нахожусь под впечатлением , он не может быть избит.
Я был слегка разочарован, что не смог увидеть ответ, основанный на оригинальной спецификации, однако позже я могу назначить награду именно за это.
Ответы:
Желе ,
73 байтаПопробуйте онлайн!
Фон
Дельты (a, b, c, d) - это b - a , c - b и d - c . Кумулятивное уменьшение (a, b - a, c - b, d - c) путем вычитания g дает a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c и 2a - c - (d - c) = 2a - d , поэтому правильный результат - (2a - a, 2a - b, 2a - c, 2a - d) .
Как это устроено
источник
Python 2, 30 байт
Проверьте это на Ideone .
Как это устроено
Дельты (a, b, c, d) - это b - a , c - b и d - c . Кумулятивное уменьшение (a, b - a, c - b, d - c) путем вычитания g дает a - (b - a) = 2a - b , 2a - b - (c - b) = 2a - c и 2a - c - (d - c) = 2a - d , поэтому правильный результат - (2a - a, 2a - b, 2a - c, 2a - d) .
источник
Mathematica, 8 байт
Безымянная функция принимает неопределенное количество аргументов. Это использует «легкий» способ: сводит на нет весь список и добавляет в два раза (оригинальный) первый элемент.
Вызывается, например, как
2#-{##}&[1,3,4,2,8]
; возвращает список вроде{1,-1,-2,0,-6}
.источник
JavaScript (ES6), 21
Thx @Dennis
источник
05AB1E , 4 байта
Попробуйте онлайн! или как тестовый набор
объяснение
источник
Python, 44 байта
Это использует «более простой метод».
источник
Pyth, 5 байт
Онлайн переводчик!
источник
R,
231817 байтавтоматическая векторизация и печать по умолчанию на помощь!
источник
2*x[1]-x
вместо этого?Рубин, 23 байта
Не особенно оригинально.
источник
Perl 6 ,
4016 байтовExpanded:
источник
Brain-Flak , 76 байт
Попробуйте онлайн!
Объяснение:
источник
Haskell,
2019 байтовТо же решение, что и у Денниса, спасибо за идею
2a - x
.Спасен один байт благодаря Кристиану Северсу.
источник
f(x:r)=x:map(2*x-)r
x
вперед.Пайк,
54 байтаПопробуй это здесь!
источник
PHP, 48 байт
Используя технику от Дениса. Используйте как:
Не байтовая версия Dennis 55:
источник
a&
вместо''<
и два байта с помощью_
вместо' '
.APL, 8 байт
Объяснение:
Тестовые случаи:
источник
Лабиринт , 34 байта
Попробуйте онлайн!
Использует @Dennis «ы
(2a - a, 2a - b, 2a - c, 2a - d)
подход.Желтые плитки для контроля потока. На этом двумерном языке программирования программа начинается с самого верхнего левого тайла, чтобы начать движение на восток. На перекрестках направление определяется знаком вершины основного стека. Пустые плитки - это стены.
зеленый
Этот раздел сохраняет 2a во вспомогательный стек.
?
Получить первое число и подтолкнуть его к вершине основного стека:
Дублируйте вершину стека_2
Нажмите два к вершине стека*
Попy
, попx
, толчокx*y
}
Переместите верхнюю часть основного стека в верхнюю часть вспомогательного стека._
Нажмите ноль на вершину стекаапельсин
Этот раздел вычитает 2a из текущего числа, отменяет результат, выводит результат, получает следующий символ (разделитель), завершается, если EOF, выводит новую строку, получает следующее число.
"
Нооп. Если он идет с севера, вершина стека будет равна нулю, и программа продолжится на юг. Если он идет с запада, вершина стека будет одна, и программа повернет направо (продолжая юг);
Откажитесь от вершины стека. Поскольку ноль или единица используются только для потока управления, нам нужно отбросить эти{
Переместите верхнюю часть вспомогательной стопки (2a) на верхнюю часть основной стопки.:
Дублируйте верхнюю часть основного стека}
Переместить верхнюю часть основного стека в верхнюю часть вспомогательного стека-
Попy
, попx
, толчокx-y
\`` Negate the top of the stack. This and the previous three operations have the effect of
- (х-2а) = 2а-х`!
Вставьте вершину стека и выведите его в виде числа,
Нажмите следующий символ (который будет разделителем) или отрицательный, если EOF)
Увеличьте вершину стека. Если последним символом является EOF, то вершина стека теперь будет равна нулю, и программа продолжит прямиком до@
и завершится . Если последний символ был разделителем, то вершина стека будет положительной, что приведет к повороту программы вправо и продолжению на восток до\
\
Вывести новую строку?
Получить следующий номер_1
Нажмите один на вершину стека, чтобы повернуть направо на перекресткеисточник
Лабиринт , 24 байта
Формат ввода и вывода - это отдельные списки перевода строки (хотя формат ввода на самом деле гораздо более гибкий). Программа завершается с ошибкой.
Попробуйте онлайн!
У меня есть два других решения с таким количеством байтов, которые работают в основном одинаково, но используют несколько иной поток управления.
объяснение
Указатель инструкций (IP) начинает двигаться на восток вдоль первой строки, но все команды перед ним в
?
основном не выполняют никаких операций в глобальном состоянии, поскольку мы нигде не используем команды глубины стека. Таким образом, код действительно начинается на?
западе, так как IP поворачивается, когда попадает в тупик.Поэтому код начинается со следующего линейного бита кода:
Это просто устанавливает нас с копией
2a
использовать[2a - a, 2a - b, 2a - c, ...]
формулу.Теперь мы входим в основной цикл программы, используя довольно стандартный прием для обхода одной строки кода:
Обратите внимание, что стек будет пустым всякий раз, когда мы попадем в него,
<
поэтому мы знаем, что там мы получим нули.<
Затем вращается вся линия слева, принимая IP с ним, так что мы получаем это:Затем IP должен переместиться влево, где линия
>
сдвигается обратно в исходное место (чтобы подготовить ее к следующей итерации). Затем строка просто выполняется справа налево, поэтому итерация одного цикла выглядит так:Подвох при работе с циклом этого типа заключается в том, что вы не можете работать ни с какой формой условного выполнения, поскольку в Лабиринте нет способа пропустить код. Поэтому мы завершим программу делением на ноль, когда нажмем EOF. Вот разбивка каждой итерации цикла.
источник
C ++ 14, 36 байт
Как безымянная лямбда изменяет свой ввод:
Используя технику от Дениса. Работает для любого контейнера, как
int[]
илиvector<int>
.Использование:
источник
CJam, 16 байтов
Формат ввода:
[1 2 3 4]
. Использует простую формулу.Объяснение:
Извините за отсутствие тестовой ссылки. Я полагаю, что SE не нравятся ссылки внутри скобок.
источник
Напористый , 9 байт
Задайте аргументы в виде значений, разделенных запятыми, в строке cmd:
$ pushy invdeltas.pshy 1,3,4,2,8
. Вот разбивка с примером стека:Примечание: это может быть 8 байтов, если разрешен обратный вывод:
@&2*K~-_
источник
Perl, 26 + 3 (
-pla
флаг) = 29 байтили
С помощью:
источник
Дьялог АПЛ , 5 байт
-+2×⊃
это 5 поездов, он разбирается как два вложенных 3 поезда ("вилки"):
-+(2×⊃)
читается как: отрицание (
-
) всего массива плюс (+
) дважды (2×
) первый элемент (⊃
)источник
ised, 11 байт
Призвание:
ised --l 'file with input.txt' '2*$1_0-$1
(редактировать: исправлено путем кражи алгебры у Денниса)
источник
Чудо , 17 байт
Не уверен, почему я не опубликовал это раньше. Использование:
Более читабельно:
источник