Эта проблема связана с некоторыми возможностями языка MATL в рамках мероприятия « Язык месяца», который состоится в мае 2018 года .
Введение
В MATL, многие две входные функции работают поэлементно с вещанием . Это означает следующее:
Поэлементный (или векторизованный ): функция принимает в качестве входных данных два массива с соответствующими размерами. Операция, определенная функцией, применяется к каждой паре соответствующих записей. Например, используя запись после исправления:
[2 4 6] [10 20 30] +
дает выход
[12 24 36]
Это также работает с многомерными массивами. Обозначение
[1 2 3; 4 5 6]
представляет массив2
×3
(матрица)1 2 3 4 5 6
который имеет размер
2
вдоль первого измерения (по вертикали) и3
вдоль второго (по горизонтали). Так например[2 4 6; 3 5 7] [10 20 30; 40 60 80] *
[20 80 180; 120 300 560]
Широковещание или ( одноэлементное расширение ): два входных массива не имеют совпадающих размеров, но в каждом несоответствующем измерении один из массивов имеет размер
1
. Этот массив неявно реплицируется по другим измерениям для согласования размеров; и затем операция применяется поэлементно, как указано выше. Например, рассмотрим два входных массива с размерами1
×2
и3
×1
:[10 20] [1; 2; 5] /
Благодаря вещанию это эквивалентно
[10 20; 10 20; 10 20] [1 1; 2 2; 5 5] /
и так это дает
[10 20; 5 10; 2 4]
Аналогично, с размерами
3
×2
и3
×1
(вещание теперь действует только во втором измерении),[9 8; 7 6; 5 4] [10; 20; 30] +
[19 18; 27 26; 35 34]
Количество измерений может даже отличаться. Например, входные данные с размерами 3 × 2 и 3 × 1 × 5 являются совместимыми и дают результат 3 × 2 × 5. На самом деле, размер 3 × 2 такой же, как 3 × 2 × 1 (имеется произвольно много неявных конечных одноэлементных измерений).
С другой стороны, пара массивов
2
×2
и3
×1
выдаст ошибку, потому что размеры по первому измерению равны2
и3
: они не равны и ни один из них не равен1
.
Определение модульного вещания
Модульное вещание - это обобщение вещания, которое работает, даже если нет несоответствующих размеров 1
. Рассмотрим, например, следующие массивы 2
× 2
и 3
× в 1
качестве входных данных функции +
:
[2 4; 6 8] [10; 20; 30] +
Правило состоит в следующем: для каждого измерения массив, меньший по этому измерению, реплицируется модульно (циклически), чтобы соответствовать размеру другого массива. Это сделало бы вышеуказанный эквивалент
[2 4; 6 8; 2 4] [10 10; 20 20; 30 30] +
с результатом
[12 14; 26 28; 32 34]
В качестве второго примера
[5 10; 15 20] [0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0] +
будет производить
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
Как правило, входные данные с размерами a
× b
и c
× d
дают результат размера max(a,b)
× max(c,d)
.
Соревнование
Реализуйте дополнение для двумерных массивов с модульным вещанием, как определено выше.
Массивы будут прямоугольными (не рваными), будут содержать только неотрицательные целые числа и будут иметь размер как минимум1
в каждом измерении.
Дополнительные правила:
Ввод и вывод могут быть приняты любым разумным способом . Их формат, как обычно, гибкий.
Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены .
Самый короткий код в байтах побеждает.
Контрольные примеры
В ;
качестве разделителя строк используется следующее (как в примерах выше). Каждый тестовый пример показывает два входа и затем выход.
[2 4; 6 8]
[10; 20; 30]
[12 14; 26 28; 32 34]
[5 10; 15 20]
[0 0 0 0; 1 2 3 4; 0 0 0 0; 5 6 7 8; 0 0 0 0]
[5 10 5 10; 16 22 18 24; 5 10 5 10; 20 26 22 28; 5 10 5 10]
[1]
[2]
[3]
[1; 2]
[10]
[11; 12]
[1 2 3 4 5]
[10 20 30]
[11 22 33 14 25]
[9 12 5; 5 4 2]
[4 2; 7 3; 15 6; 4 0; 3 3]
[13 14 9;12 7 9;24 18 20;9 4 6;12 15 8]
[9 12 5; 5 4 2]
[4 2 6 7; 7 3 7 3; 15 6 0 1; 4 0 1 16; 3 3 3 8]
[13 14 11 16; 12 7 9 8; 24 18 5 10; 9 4 3 21; 12 15 8 17]
[6 7 9]
[4 2 5]
[10 9 14]
источник
1
×n
(например[1 2 3]
) илиn
×1
(например[1; 2; 3]
)Ответы:
Желе , 10 байт
Принимает матричную пару (два массива строк) в качестве входных данных и возвращает матрицу.
Попробуйте онлайн!
Как это работает
источник
Древесный уголь ,
2523 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Принимает ввод как трехмерный массив. Объяснение:
Введите все.источник
MATL ,
2524 байтаПопробуйте онлайн!
В заключение! Потребовалась всего неделя, чтобы «Язык месяца» ответил на вопрос « Язык месяца»!
Я предполагаю, что он не настолько короткий, насколько это возможно, но я достаточно счастлив, потому что моя первоначальная версия была более 40 байтов. редактировать: я был прав, Луис нашел еще один байт, чтобы выжать!
источник
:
с векторным вводомPython 3 ,
127126125 байтgolfed байт путем изменения
sum(m)
вm+n
Еще один байт благодаря Джонатану Фреху
Вводит в виде списка двух 2-мерных массивов.
Z
Лямбда принимает два массива в качестве входных данных и возвращает итератор получают индекс и слиты значения из обоих массивов, до тех пор , пока индекс не достигнет длины крупнейшего массива. Переменная index бесполезна для меня и стоит мне байты, но я не знаю, как обойтись без нее ... ( связано )Z
внешние и внутренние массивы. Самые внутренние значения складываются вместе.Попробуйте онлайн!
Использование
itertools.cycle
немного похоже на читерство, но я думаю, что я был достаточно наказан по чистой длине оператора импорта :)Я уверен, что это может быть использовано еще, особенно метод итераций, который оставляет эти бесполезными
i
иj
переменные. Я был бы благодарен за любые советы о том, как играть в гольф, я, вероятно, упускаю что-то очевидное.источник
zip
аргументы, поменятьf
понимание и, таким образом, удалить один пробел (for i,*l
->for*l,i
)? ( 125 байт )?JavaScript (ES6), 131 байт
Не правильный инструмент для работы, и, вероятно, не правильный подход. Ну да ладно ... ¯ \ _ (ツ) _ / ¯
Попробуйте онлайн!
Как?
Вспомогательная функция g () создает массив размером с самый большой входной массив ( a или b ) и вызывает над ним функцию обратного вызова c :
Вспомогательная функция h () считывает 2D-массив a at (x, y) с модульной трансляцией:
Основной код теперь просто читается как:
Рекурсивная версия, 134 байта
Попробуйте онлайн!
источник
05AB1E , 15 байтов
Попробуйте онлайн!
Старая версия, 25 байт
Попробуйте онлайн!
объяснение
15-byter:
25-byter:
источник
R ,
136 104 103 9593 байтСледуя советам Джузеппе, набрал колоссальные
3335 байтов. Удалось получить менее 100 байт, используя оператор в качестве имени функции. Смотрите историю для более разборчивого кода.Попробуйте онлайн!
источник
apply
иrep.len
это то, что я рассмотрел, хотя сам не удосужился его кодировать.dim
, намного чище и открывает двери для многомерного обобщения с рекурсивными призывами кr
outer(x,y,"+")
который содержит все правильные суммы, и в четкой схеме. Не могу понять, как извлечь их эффективно.К (нгн / к) , 23 байта
Попробуйте онлайн!
источник
05AB1E , 18 байт
Попробуйте онлайн!
объяснение
источник
Pyth, 24 байта
Попробуй здесь
объяснение
источник
Java 8, 172 байта
Попробуйте онлайн.
Объяснение:
источник
APL (Dyalog Classic) ,
2321 байтПопробуйте онлайн!
это может быть единственный раз, когда я получу возможность использовать
|[0]
источник
Python 2 ,
124116 байтПопробуйте онлайн!
Объяснение:
Принимает список двух двумерных списков в качестве входных данных.
источник
Python 2 ,
10197105 байтРедактировать: Спасибо (снова!) Мертвому Опоссуму за сохранение 4 байта
Редактировать 2: потеряно 8 байт, некоторые тесты не проходили
Смесь между более ранним решением Dead Possum (спасибо ему!) И моим собственным решением Python 3 .
Попробуйте онлайн!
Тот же вход, что и в моем решении Python 3 (пара двумерных списков).
Код комментария:
источник
Юлия 0,6 ,
8583 байтаПопробуйте онлайн!
(Заменить
⧻
с\
благодаря Джо Кинг )Работает, повторяя каждую матрицу по горизонтали и вертикали, чтобы они оба имели одинаковый размер (произведение размеров строк на произведение размеров столбцов), суммируя их и извлекая из них правильную область. (Для входных векторов строк или векторных входов столбцов требуется
reshape
вызов в виде 2-мерных массивов, что, как я полагаю, нормально, так как в этом вопросе указано «Реализация сложения для двумерных массивов» и «Ввод и вывод могут быть приняты любым разумные средства. Их формат, как обычно, гибкий. ")источник