Вызов:
Исходя из матрицы входных данных, определите количество диагоналей и антидиагоналей с дублированными числами.
Так что, если у нас есть такая матрица:
[[aa,ab,ac,ad,ae,af],
[ba,bb,bc,bd,be,bf],
[ca,cb,cc,cd,ce,cf],
[da,db,dc,dd,de,df]]
Все диагонали и антидиагоналы будут:
[[aa],[ab,ba],[ac,bb,ca],[ad,bc,cb,da],[ae,bd,cc,db],[af,be,cd,dc],[bf,ce,dd],[cf,de],[df],
[af],[ae,bf],[ad,be,cf],[ac,bd,ce,df],[ab,bc,cd,de],[aa,bb,cc,dd],[ba,cb,dc],[ca,db],[da]]
Пример:
[[1,2,1,2,1,2],
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
Все диагонали и антидиагоналы будут:
[[1],[2,1],[1,2,6],[2,3,5,2],[1,4,4,1],[2,5,3,2],[6,2,1],[1,2],[1],
[2],[1,6],[2,5,1],[1,4,2,1],[2,3,3,2],[1,2,4,1],[1,5,2],[6,1],[2]]
Удаление всех диагоналей и антидиагоналей, содержащих только уникальные номера:
[[2,3,5,2],[1,4,4,1],[2,5,3,2],[1,4,2,1],[2,3,3,2],[1,2,4,1]]
Таким образом, на выходе получается количество диагоналей и антидиагоналей, содержащих повторяющиеся числа:
6
Правила соревнований:
- Если входная матрица пуста, содержит только 1 число или содержит только уникальные числа по всей матрице, вывод всегда будет
0
. - Входные данные гарантированно содержат только положительные цифры
[1,9]
(если только они не полностью пусты). - Матрица всегда будет прямоугольной (т.е. все строки имеют одинаковую длину).
- Ввод / вывод является гибким. Входные данные могут быть приняты в виде списка целых чисел, или двумерного массива целых чисел, или объекта Matrix, в виде строки и т. Д. И т. Д. Вам также разрешено использовать одно или оба измерения матрицы в качестве дополнительного ввода если бы это сэкономило байты на выбранном вами языке.
Основные правила:
- Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Не позволяйте языкам кода-гольфа отговаривать вас от публикации ответов на языках, не относящихся к кодексу. Попробуйте придумать как можно более короткий ответ для «любого» языка программирования. - Стандартные правила применяются к вашему ответу с правилами ввода / вывода по умолчанию , поэтому вам разрешено использовать STDIN / STDOUT, функции / метод с правильными параметрами и типом возврата, полные программы. Ваш звонок.
- По умолчанию лазейки запрещены.
- Если возможно, добавьте ссылку с тестом для вашего кода (например, TIO ).
- Кроме того, добавление объяснения для вашего ответа настоятельно рекомендуется.
Тестовые случаи:
Input: Output:
[[1,2,1,2,1,2], 6
[1,2,3,4,5,6],
[6,5,4,3,2,1],
[2,1,2,1,2,1]]
[[]] 0
[[1,2], 0
[3,4]]
[[1,1], 2
[1,1]]
[[9,9,9], 6
[9,9,9],
[9,9,9]]
[[7,7,7,7], 8
[7,7,7,7],
[7,7,7,7]]
[[1,1,1], 1
[2,3,4],
[2,5,1]]
[[1,8,4,2,9,4,4,4], 12
[5,1,2,7,7,4,2,3],
[1,4,5,2,4,2,3,8],
[8,5,4,2,3,4,1,5]]
[[1,2,3,4], 4
[5,6,6,7],
[8,6,6,9],
[8,7,6,5]]
источник
row
иcol
в мой список «чрезвычайно ситуативных функций». Действительно умное решение.c(m|x-y,m|x+y)
прямо в Саппи, удалитьl=
часть. Я не вижу никаких неудачных тестов. Попробуйте онлайн!l
экземпляр.row
иcolumn
функция R этим утром, потому что я никогда не слышал о них.J ,
2120 байт-1 байт благодаря Ионе!
Попробуйте онлайн!
Объяснение:
источник
(-.@-:~.)
«уникальные предметы не совпадают» в J, но я сталкивался с этим также много раз, и я не думаю, что вы можете ... у нас есть,=
и~:
, с одной стороны рука, и-:
и<this is missing>
.1#.|.,&((~:&#~.)/.)]
. Попробуйте онлайн!&
, спасибо!Japt , 31 байт
Попробуйте все тестовые случаи
Объяснение:
Я также попробовал версию, основанную на ответе Кирилла Л. на Haskell, но не смог найти хороший способ «сгруппировать по функциям индексов X и Y», и найденная мною альтернатива была недостаточно хороша.
источник
JavaScript (ES6),
107 105 10198 байтПопробуйте онлайн!
Заметка
При использовании этого кода антидиагональность, состоящая из единственной левой нижней ячейки, никогда не проверялась. Это нормально, потому что он не может содержать повторяющиеся значения.
комментарии
источник
05AB1E , 25 байтов
Попробуйте онлайн! или как тестовый набор
объяснение
Я чувствую, что что-то здесь упустил.
Нужно попробовать это в гольф позже.
источник
rotate N left
будетN._
сейчас. Такí‚εεygÅ0«N._]
же и работает. Можно также удалить сглаживание с помощью этого нового изменения ... все еще нет экономии байтов, хотя:í‚vyεygÅ0«N._}ø}«ʒ0KDÙÊ}g
N(._
я думаю, но у васNFÁ}
такая же длина, и даже короче в этом случае из-за]
закрытия цикла и карт одновременно. В целом, использование._
полезно только при переходе влево для сохранения 1 байта по сравнению сNFÀ}
.Python 2 ,
144136 байтПопробуйте онлайн!
источник
Октава , 98 байт
Попробуйте онлайн!
источник
cellfun
тоже, и для мазохистаstructfun
. В Octave это либо цикл, либо наличиеfun
!Haskell,
118112 байтовПопробуйте онлайн!
источник
Древесный уголь ,
615653 байтаПопробуйте онлайн! Ссылка на подробную версию кода. Объяснение:
Зациклите переднюю и обратную диагонали;
i=0
представляет прямые диагонали, в то время какi=1
представляет обратные диагонали.Цикл по каждой строке индекса. Это представляет индекс начала диагонали.
Цикл по каждому индексу столбца.
Рассчитайте индекс строки диагонали по этому индексу столбца. Я использую
for
цикл над одноэлементным массивом вместо присваивания, так как это избавляет от необходимости заключать присваивание в блок с помощью следующего оператора, тем самым сохраняя байт.Проверьте, является ли это первый столбец или диагональ собирается обернуть между нижней и верхней.
Если это не так, вытолкните последний список из списка списков.
если это так, то начните новый пустой список.
Добавьте текущую диагональную запись в этот список.
И нажмите этот список (обратно) к списку списков.
Подсчитайте количество списков, которые содержат дубликаты.
Давайте рассмотрим пример, когда
i=0
иk=1
. Это означает, что мы уже собрали две диагонали[[1,1,5,2],[9,4,3,5]]
. Вот наш вклад:Затем мы переходим
l
от0
к7
. Это увеличивает строку и столбец на 1 каждый раз:Список сейчас
[[1,1,5,2],[9,4,3,5],[5,4,4]]
. Однако, когдаl
есть3
, мыk+l=4
кратны высоте массива. Это означает , что мы должны начать новый список:[[1,1,5,2],[9,4,3,5],[5,4,4],[]]
. Затем мы продолжаем собирать диагональные элементы:Список сейчас
[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1]]
. Теперь, когдаl
есть7
, у нас естьk+l=8
еще одно кратное высоты массива. Это означает , что мы должны начать новый список, который заканчивается с последним элементом , который по диагонали:[[1,1,5,2],[9,4,3,5],[5,4,4],[2,7,2,1],[4]]
.Собирая диагонали обтекания, начиная с первого элемента каждого ряда, мы в конечном итоге накапливаем все диагонали массива.
источник
Wolfram Language (Mathematica) ,
99 98 96 9483 байтаПопробуйте онлайн!
Function[a,a~Diagonal~#&/@Range[t=-#~Total~2,-t]]
получает все диагоналиa
- что работает, потому что#~Total~2
больше, чем любое измерениеa
.источник
APL + WIN, 69 байт
Запрашивает 2d матрицу вида 4 6⍴1 2 1 2 1 2 1 2 3 4 5 6 6 5 4 3 2 1 2 1 2 1 2 1
Это дает:
Попробуйте онлайн! Предоставлено Dyalog Classic
Объяснение:
Урожайность:
источник
Perl 5,
8982 байтаTIO
источник
TSQL,
140128 байтНашел путь в гольф 12 персонажей. Это больше не самое длинное решение.
Golfed:
Ungolfed:
Попробуйте это
источник