Введение
Рассмотрим два непустых целочисленных массива, скажем, A = [0 3 2 2 8 4] и B = [7 8 7 2] . Чтобы выполнить выравнивание на них, мы делаем следующее:
Повторите каждый массив достаточно раз, чтобы иметь общую длину lcm (длина (A), длина (B)) . Здесь lcm обозначает наименьший общий множитель .
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][7 8 7 2][7 8 7 2]
Выполните поэлементное сложение для повторяющихся массивов и обрежьте результат в каждой позиции, где есть разрез в любом из них.
A -> [0 3 2 2 8 4][0 3 2 2 8 4] B -> [7 8 7 2][ 7 8 7 2][7 8 7 2] -> [7 11 9 4][15 12][7 5][9 10 15 6]
Этот массив массивов - ваш результат.
Задание
Ваши входные данные представляют собой два непустых массива целых чисел, и ваши выходные данные должны быть результатом их сложения выравнивания, как определено выше. Входные и выходные данные могут быть в любом разумном формате. Вам не нужно беспокоиться о целочисленном переполнении при выполнении сложения.
Правила и оценки
Вы можете написать полную программу или функцию. Побеждает самое низкое число байтов.
Контрольные примеры
[1] [4] -> [[5]]
[1,2,-3,-4] [15] -> [[16],[17],[12],[11]]
[0,-4] [2,1,0,-3] -> [[2,-3],[0,-7]]
[0,3,2,2,8,4] [7,8,7,2] -> [[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
[18,17,16] [-1,-2,-3,-4] -> [[17,15,13],[14],[16,14],[15,13],[15],[16,14,12]]
[18,17,16,15] [-1,-2,-3,-4] -> [[17,15,13,11]]
[1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7],[6,7,3,2],[7],[6,7,6,7,6],[7,3,2],[7,6],[7,6,7,6,7],[3,2],[7,6,7],[6,7,6,7,3],[2],[7,6,7,6],[7,6,7,3,2]]
[1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6],[7,3,2],[7,6,7],[6,7,6,7,3,2]]
[1,1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -> [[7,6,7,6,7,6,7],[3,2],[7,6,7,6,7],[6,7,3,2],[7,6,7],[6,7,6,7,3,2],[7],[6,7,6,7,6,7,3],[2],[7,6,7,6,7,6],[7,3,2],[7,6,7,6],[7,6,7,3,2],[7,6],[7,6,7,6,7,3,2]]
Ответы:
JavaScript (ES6),
10199 байтПринимает ввод как 2 массива. Возвращает строку.
Как это работает
Мы перебираем первый массив
a
с указателемi
, обновляя другой указательj
во второй массивb
. Суммыa[i] + b[j]
добавляются к выходной строкеs
. Разделитель вставляется каждый разi == 0
илиj == 0
. Мы повторяем этот процесс, покаj
не вернемся точно в начале иb
в конце итерации.Примечание: Когда применяется
|
оператор, применяетсяa.map(...)
либоNaN
(еслиa
содержит более одного элемента), либо к текущему значениюj
(еслиa
содержит ровно один элемент). Поэтомуa.map(...)|j == j
во всех случаях и здесь можно безопасно пользоваться.Контрольные примеры
Показать фрагмент кода
источник
Haskell,
8479 байтовМоя первая версия была такой же в более читаемом виде:
Использование локального определения, чтобы избежать необходимости давать
(%)
дополнительные аргументы дляa
иb
. Удивительно, но это почти то же самое решение, что и в то же время, что и у @ nimi, у которого я взял идею использовать только одну строку для локального определения.Использование:
источник
!
.PHP,
126120 байтПопробуй это здесь!
Анонимная функция, которая возвращает полученный массив массивов.
По сути, мы перебираем содержимое обоих наших массивов, модифицируя наш итератор по длине массива, чтобы имитировать «копирование» их. Взяв каждое из значений из массивов, мы суммируем их и добавляем в массив в
$c
. Если мы достигнем конца одного из наших входных массивов (разделение, с точки зрения задачи), мы начнем присваивать новый массив в$c
.Причина
do while
цикла в том, что наше условие основано на том$i
, что начинается с0
. Если мы используем цикл, где условие проверяется в начале, цикл не будет работатьМы заканчиваем суммирование, только когда достигаем конца обоих массивов одновременно, что подразумевает LCM.
источник
$b[$i%$y]
? Вы можете сохранить 3 байта, перейдя$x=count($a)
к первому использованию$x
; То же самое для$y=count($b)
и одного байта с побитовым или вwhile
условииHaskell,
8784 байтаПример использования:
[0,3,2,2,8,4] # [7,8,7,2]
->[[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
.Простая рекурсия. Базовый случай: оба списка пусты. Если только один из них пуст, перезапустите с полной версией и запустите новый кластер в выходных данных. Если ни один не пуст, добавьте сумму к элементу from.
Взгляните также на ответ @Christian Sievers , который почти идентичен и был опубликован несколькими секундами ранее.
источник
Октава, 113 байт
эта функция может вызываться напрямую, вызывать ее, ставить в скобки и называть (@ (a, b) ...) ([1 2 3 4], [6 4 5])
источник
CJam , 30 байтов
Попробуйте онлайн!
Принимает ввод в виде пары списков.
объяснение
Идея состоит в том, чтобы вставить некоторые маркеры во входные массивы (в виде коротких строк), которые указывают, где заканчивается выровненный массив и где нам нужно вставить разрывы в массивах. Таким образом, мы можем избежать вычисления LCM.
источник
Желе ,
212018 байтПопробуйте онлайн!
Как это работает
источник
Python 3,5 - (
146137134130 + 12) = 142 байтаЯ не могу понять, как поместить весь цикл for в одну строку.
Редактирование:
источник
gcd
Функция вfractions
неmath
.3.4.3
.l*k
и поместить ихprint(r);r=[]
в последнюю строку.Python 2, 119 байт
Принимает ввод из стандартного ввода в виде двух кортежей, разделенных запятой, выводит полученные списки в стандартный вывод. Завершает работу, вызывая
ZeroDivisionError
исключение, поскольку это разрешено .Например, если введено
(0, 3, 2, 2, 8, 4), (7, 8, 7, 2)
, программа напечатаетв стандартный вывод и трассировку исключения в стандартный поток ошибок.
источник
J ,
3432 байтаПопробуйте онлайн!
объяснение
источник
Haskell, 166 байт
Это, вероятно, не самый элегантный подход: в основном, функция
?
создает один список необходимой длины с суммами, и%
снова сокращает эту сумму.!
это последняя функция, которая объединяет эти два.источник
ind
наk
что-нибудь, и есть несколько ненужных скобок вокругdrop i l
иmap(+(-i))ind
. Рассмотрим также два случая для%
, с включенным сопоставлением с образцомl
.[PHP],
183152135 байтовХорошая версия:
Выход:
источник
$i=$j=$k=0;
не нужно, если вы используете+$i
и т. Д. Для индексов массива в добавляемом присваивании (-8 байт).$i++;if(!isset($A[$i])){$i=0;$k++;}
->isset($A[++$i])?:$i=!++$k;
(-9, дважды).$i==0&&$j==0&&!isset()
->!$i&!$j&!isset()
(-6).return$O;
не требует места (-1).$i=$j=0;
часть, так как первые значения из массивов не будут правильными. Я немного изменил логику, поэтому не уверен, как реализовать троичные операторы в этом случае. Спасибо за++$i
советы.unset($i);$A[+$i]
.+
Ввергнутnull
в целое число0
.if(!isset($A[++$i])){$i=0;++$k;++$f;}
-> по-isset($A[++$i])?:$i=!++$k|!++$f;
прежнему сохраняет 5 байтов каждый. Сохраните еще один с$f<2
вместо$f!=2
. и еще два сwhile($f=$f<3){...}
вместоwhile($f<2){$f=0;...}
(инициализирует и сбрасывает$f
до 1, если его значение не увеличивается вдвое)PowerShell ,
147145 байтПопробуйте онлайн!
( Предложения по игре в гольф приветствуются. Я чувствую, что из этого можно выжать еще 10-15 байт. )
Принимает входные данные в виде двух явных массивов (с
@(...)
синтаксисом) в качестве аргументов командной строки. Возвращает хеш-таблицу полученных массивов, потому что многомерные массивы в PowerShell могут стать странными, и это более согласованно. Устанавливает некоторые начальные переменные, затем снова входит в циклdo
/until
с условным значением до тех пор, пока не$i
будет подсчитан lcm массива .На каждой итерации цикла мы добавляем соответствующие значения
$a
и$b
значения вместе, обрабатываем его как массив,(...)
перед добавлением его в хеш-таблицу$o
в соответствующем месте$j
. Инкапсуляция массива необходима для предотвращения арифметического сложения -+=
вместо этого это приводит к перегрузке в конкатенацию массивов. Затем, условное$x
и$y
(подсчитывает), чтобы определить, находимся ли мы на краю массива - если так, мы увеличиваем$j
.Наконец, мы оставляем
$o
на конвейере и вывод неявный.(Примечание: из-за того, что PowerShell перечисляет хеш-таблицы со значениями по умолчанию
Write-Output
, это имеет тенденцию выводиться «в обратном направлении»; как, например, результирующий массив «0-й» находится в «нижней части» выходных данных. С самим хэшем все в порядке, и он будет используется просто отлично, если вы, например, инкапсулировали этот код в возвращаемую переменную ... он просто выглядит странно, когда печатается.)Сохранение 2 байтов путем перемещения $ x и $ y в индексирование массива, а не по отдельности (сохраняется две точки с запятой).
источник
Python 2, 113 байт
источник
not
быть<1
s вместо s?Python 3.5,
210176173169158 байтПринимает два списка в качестве входных данных и печатает все списки.
Это мой первый ответ, и я пока не знаю, как играть в гольф. Основная идея, которую я использовал, состоит в том, чтобы иметь два счетчика для каждого списка, которые указывают разделение, и текущий список, к которому добавляются добавленные значения; как только возникает разделение, мы печатаем текущий список и создаем новый пустой.
источник
x=[];c=len(a);d=len(b);e=f=0
. Кроме того,true
может стать1
, иx.append(a[e]+b[f])
может статьx+=a[e]+b[f],
.if
иwhile
заявления не нуждаются в скобках.Ракетка 373 байта
Ungolfed:
Тестирование:
Выход:
источник
Clojure,
280206 байтовНу, это имеет больше смысла. Генерация поэлементной суммы, добавление позиционных метаданных, взятие, пока мы еще не повторили, и помещение значения суммы в каждый раздел.
Оригинал: я надеюсь улучшить это, но это самое худшее, что у меня есть на данный момент.
Безголовый и многословный:
Начинается с «слияния» бесконечного цикла коллекций
a
иb
добавляет метаданные по индексу каждого элемента в коллекции, пока обе последовательности не начнут снова с индекса 0.Эта коллекция
c
Затем объединяется с данными раздела (совокупная сумма единиц и нулей), разделяется и выбирается последний элемент (являющийся суммой элементов).Я думаю, что для значительных улучшений необходим совершенно иной подход.
источник
PHP,
150121119 байтанонимная функция принимает входные данные как массивы.
сломать
источник
C ++ 14, 206 байт
Как безымянный общий лямбда, требующий ввод контейнеры
P
,Q
и выходной контейнер ,R
чтобы быть похожимиvector<vector<int>>
.Ungolfed и использование:
источник
Mathematica 112 байт
Это может быть улучшено. Идея состоит в том, чтобы создать двумерный массив со вторым элементом, используемым для отслеживания арендодателя счетчика, в зависимости от длины каждого входного массива.
использование
источник
JavaScript (ES6), 131 байт
Слегка разгульный
d
иe
содержат числа, сумма первого числа добавляется ,s
а остальные элементы обрабатываются рекурсивноs
добавляется к результату,r
а другой массив сбрасывается в исходный массив.К сожалению, это решение не обладает безжалостной эффективностью @ Arnauld's, но, по крайней мере, я думаю, что это прекрасное решение.
источник