Определитель матрицы 2 на 2
a b
c d
дается ad - bc
.
Учитывая матрицу цифр с размерами 2 n на 2 n , n ≥ 1, выведите результат, полученный путем рекурсивного вычисления определителя каждого субблока 2 на 2, пока мы не достигнем одного числа.
Например, учитывая вход
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
После одного шага мы получаем:
(3*9 - 1*5) (4*6 - 1*2) = 22 22
(5*7 - 3*9) (5*3 - 8*9) 8 -57
И повторяя еще раз, мы получаем:
(22*-57 - 22*8) = -1430
Следовательно, вывод должен быть -1430
.
правила
- Элементы матрицы всегда будут однозначными целыми числами, то есть от 0 до 9.
- Вы можете вводить данные в любом удобном формате списка или строки, если не выполняется предварительная обработка данных. Поскольку матрица всегда квадратная, вы можете принять ввод как один одномерный список вместо двухмерного списка, если хотите.
- Ввод может быть через ввод функции, STDIN, аргумент командной строки или ближайшую альтернативу.
- Вывод должен быть одним целым числом для функции вывода, STDOUT или ближайшей альтернативой. Вы не можете вывести одно целое число в списке или матрице.
- Вы можете использовать встроенные детерминанты и методы матричной манипуляции, если ваш язык поддерживает их.
- Ваш алгоритм должен работать теоретически для любого корректного ввода.
- Применяются стандартные правила игры в гольф .
Контрольные примеры
Следующие тесты приведены в виде списков в стиле Python:
[[1,0],[0,1]] -> 1
[[1,9],[8,4]] -> -68
[[0,1,2,3],[4,5,6,7],[8,9,0,1],[2,3,4,5]] -> 40
[[3,1,4,1],[5,9,2,6],[5,3,5,8],[9,7,9,3]] -> -1430
[[9,0,0,9],[0,9,9,0],[9,0,9,0],[0,9,0,9]] -> 13122
[[1,0,0,0,0,0,0,0],[2,1,0,0,0,0,0,0],[3,2,1,0,0,0,0,0],[4,3,2,1,0,0,0,0],[5,4,3,2,1,0,0,0],[6,5,4,3,2,1,0,0],[7,6,5,4,3,2,1,0],[8,7,6,5,4,3,2,1]] -> 1
[[7,1,0,5,8,0,1,5],[9,9,6,6,1,2,4,8],[4,8,7,3,8,7,4,7],[4,6,1,9,7,0,1,7],[7,6,7,1,9,4,1,6],[8,0,0,8,5,5,9,9],[4,6,4,8,9,4,8,6],[9,0,8,7,6,2,1,5]] -> 2937504
[[1,2,3,4,5,6,7,8],[2,3,4,5,6,7,8,1],[3,4,5,6,7,8,1,2],[4,5,6,7,8,1,2,3],[5,6,7,8,1,2,3,4],[6,7,8,1,2,3,4,5],[7,8,1,2,3,4,5,6],[8,1,2,3,4,5,6,7]] -> -10549504
[[1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,1,0,1,1,1,1,1,1,0],[1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,0,0,1,1,1,1,1,0,1],[1,0,1,0,1,1,1,0,0,1,1,1,1,0,1,0],[0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0],[1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1],[1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1],[1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1],[0,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1],[1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,0],[1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,0,1,0,0,1,0,1,0,1,1,1,1,1,0,1],[1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1]] -> -8
(Спасибо @ MartinBüttner за помощь в решении этой проблемы)
[1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]
. Полный определитель этого равен нулю, поскольку он имеет две одинаковые строки. Следовательно, эта матрица является единственной (то есть необратимой) матрицей 4 × 4, поэтому она не учитывается A055165. Тем не менее, «рекурсивный» определитель, обсуждаемый здесь, является1*1-1*0==1
. В обратном направлении матрица[0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]
имеет «рекурсивный» определитель0*0-0*0==0
. Однако его полный определитель должен быть ненулевым, потому что его строки - это просто строки единичной матрицы в другом порядке; и он считается A055165.Ответы:
J
2125 байтИспользование:
На каждом шаге мы разрезаем матрицу до 2 на 2 и вычисляем каждый определитель, что приводит к входной матрице следующего шага. Мы повторяем этот процесс до тех пор, пока результат не изменится (последний элемент - сам определитель). Конвертируем конечный результат в скаляр с
0{0{
.Попробуйте это онлайн здесь.
источник
(2 2$2)&(-/ .*;._3^:(2^.#@]))
попробуйте онлайн!Mathematica,
5240 байтСпасибо Мартину Бюттнеру за сохранение 12 байтов.
объяснение
BlockMap[f,expr,n]
разделитьexpr
на подсписки размераn
и картыf
на каждом подсписках.BlockMap[Det,#,{2,2}]&
разбить входной массив на 2 * 2 блока и вычислить их детерминанты.Прецедент
источник
[[1,1]]
сTr
иNest
с//.
:Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&
Желе,
2017 байтПопробуйте онлайн! или проверьте все тестовые случаи одновременно .
Как это устроено
источник
Haskell ,
9386 байтРЕДАКТИРОВАТЬ: Спасибо @Laikoni за сокращение этого целых 7 байтов!
Я не знал, что вы можете поместить оператор let перед =, и я никогда не привык к этим операторам монады. Еще раз спасибо @Laikoni
Старая версия:
Попробуйте онлайн!
Эта функция возвращается сама по себе двумя различными способами. Сначала сопоставление с образцом перехватывает базовый случай: матрицу 2x2 и выполняет вычисление. Я использую это для вычисления в рекурсивном случае, вызывая функцию с генерируемой мной матрицей 2x2, в которой есть рекурсивные решения. Эта матрица генерируется путем итерации дважды по массиву функций, каждый из которых разбивает список пополам. Я применяю его к строкам простым вызовом и применяю к столбцам с помощью
map
.источник
where h=length m`div`2;l=[take h,drop h]
, вы можете использоватьf m|let l=[take,drop]<*>[length m`div`2]=
.map b m
может бытьb<$>m
и[f$a$b<$>m|a<-l]
может быть сокращено доf.($b<$>m)<$>l
. Всего 86 байт: [ tio.run/… Попробуйте онлайн!]Python, 166 байт
Это проходит все предоставленные тесты. m должен быть двумерным массивом (как в тестовых примерах), g выбирает подматрицу.
источник
Пиф, 26
Тестирование
Он состоит из двух частей:
M-F*VG_H
переопределяет функциюg
для вычисления определителя матрицы два на два. Это сохраняет байты, хотя мы используем его только один раз, потому что он распаковывает две строки.Другая часть - это большое сокращение, которое мы называем
log_2( len( input() ) )
временем. К сожалению, выполнение шага сокращения матрицы 1 на 1 приводит к тому, что результат будет заключен в список, поэтому мы не получаем фиксированную точку. Редукция в основном просто разбивает матрицу, чтобы получить матрицы 2 на 2, а затем применяетg
.источник
MATL , 26
30байтВвод - это двумерный массив со строками, разделенными
;
, то естьПопробуйте онлайн!
источник
Perl 5 , 120 + 1 (
-a
) = 121 байтПопробуйте онлайн!
Принимает ввод как список разделенных пробелом чисел.
источник
ES6, 91 байт
Простое рекурсивное решение.
источник
R 111 байтов
Попробуйте онлайн!
Принимает ввод в виде матрицы R (которая преобразуется функцией в заголовке).
источник
Groovy,
221189 байт (на данный момент мог бы использовать Java)Старая дрянная версия, которая также может быть Java (221 байт):
Ungolfed код:
источник