Матрица Уолша представляет собой особый вид квадратной матрицы с применением в квантовых вычислениях (и , возможно , в другом месте, но я только заботиться о квантовых вычислениях).
Свойства матриц Уолша
Размеры такие же , силы 2. Таким образом, мы можем обратиться к этим матрицам до два экспонента здесь, называя их W(0)
, W(1)
, W(2)
...
W(0)
определяется как [[1]]
.
Для n>0
, W(n)
выглядит следующим образом :
[[W(n-1) W(n-1)]
[W(n-1) -W(n-1)]]
Так и W(1)
есть:
[[1 1]
[1 -1]]
И W(2)
это:
[[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
Картина продолжается ...
Твое задание
Напишите программу или функцию, которая принимает в качестве входных данных целое число n
и печатает / возвращает W(n)
в любом удобном формате. Это может быть массив массивов, сплющенный массив логических выражений, .svg
изображение, назовите его, если оно правильное.
Стандартные лазейки запрещены.
Пара вещей:
Для W(0)
, то 1
нужно не быть обернуты даже один раз. Это может быть просто целое число.
Вам разрешено 1-индексировать результаты - W(1)
тогда будет [[1]]
.
Контрольные примеры
0 -> [[1]]
1 -> [[1 1]
[1 -1]]
2 -> [[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
3 -> [[1 1 1 1 1 1 1 1]
[1 -1 1 -1 1 -1 1 -1]
[1 1 -1 -1 1 1 -1 -1]
[1 -1 -1 1 1 -1 -1 1]
[1 1 1 1 -1 -1 -1 -1]
[1 -1 1 -1 -1 1 -1 1]
[1 1 -1 -1 -1 -1 1 1]
[1 -1 -1 1 -1 1 1 -1]]
8 ->
Pastebin
Это код-гольф , поэтому выигрывает самое короткое решение на каждом языке! Удачного игры в гольф!
W(1)
возвращается[[1]]
,W(2)
возвращается[[1,1],[1,-1]
...)Ответы:
Perl 6 ,
634440 байтПопробуйте онлайн!
Нерекурсивный подход, использующий тот факт, что значение в координатах x, y есть
(-1)**popcount(x&y)
. Возвращает сплющенный массив логических значений.-4 байт благодаря XNOR «s бит четности трюк .
источник
MATL , 4 байта
Попробуйте онлайн!
Как это работает:
Без встроенного: 11 байт
Попробуйте онлайн!
Как это работает :
Для каждой матрицы Уолша W следующая матрица вычисляется как [ W W ; W - W ], как описано в вызове. Код делает это
n
раз, начиная с матрицы 1 × 1 [1].источник
kron
. ;)Haskell ,
5756 байтПопробуйте онлайн! Это реализует данную рекурсивную конструкцию.
-1 байт благодаря Эрджану Йохансену !
источник
(iterate(\m->zipWith(++)(m++m)$m++(map(0-)<$>m))[[1]]!!)
.Октава со встроенным,
1817 байтПопробуйте онлайн!
Октава без встроенного,
56 5147 байтПопробуйте онлайн! Спасибо @Luis Mendo за -4.
Октава с рекурсивной лямбдой,
54 53 5248 байтовПопробуйте онлайн! Спасибо за этот ответ и этот вопрос для вдохновения.
источник
end
не нужна. Таким образом, вы можете переместить его в заголовок TIO и таким образом удалить его из числа байтовAPL (Dyalog Unicode) , 12 байт
Попробуйте онлайн!
Выход представляет собой двумерный массив.
источник
Python 2 ,
7571 байтПопробуйте онлайн!
Матрица Уолша, кажется, связана со злыми числами. Если
x&y
(побитовое и координат 0 на основе) представляет собой число зла, значение в матрице1
,-1
для одиозных чисел. Расчет четности по битамint(bin(n),13)%2
взят из комментария Noodle9 к этому ответу .источник
x&y
чтобы определить, сколько раз перевернуть знак.R ,
61565350 байтПопробуйте онлайн!
Рекурсивно вычисляет матрицу по произведению Кронекера и возвращает 1 для
n=0
случая (спасибо Джузеппе за указание на это, а также JAD за помощь в начальном варианте игры в гольф).Еще -3 байта снова благодаря Джузеппе.
источник
1
а неmatrix(1)
действителен, но если это так, вы можете проиграть это, и есть также 61-байтовыйReduce
подход: попробуйте!n=0
кейса, большинство других ответов переносят его в [[1]], но не все ...matrix(1)
наt(1)
.1-2*!3:0
короче чемc(1,1,1,-1)
на три байта.Желе , 14 байт
Попробуйте онлайн!
Изменение
G
кŒṘ
в сноске , чтобы увидеть фактический выход.источник
JavaScript (ES6), 77 байт
Наивный расчет начинается с принятия
0 <= X, Y <= 2**N
вW[N]
. Простой случай , когда либоX
илиY
меньше2**(N-1)
, в этом случае мы рекурсию наX%2**(N-1)
иY%2**(N-1)
. В случаеX
иY
того, и другого по крайней мере2**(N-1)
рекурсивный вызов должен быть отменен.Если вместо сравнения используется битовая маска
X
илиY
меньше, то это ненулевое значение, когда рекурсивный вызов должен быть отменен, и нулевое значение, если это не так. Это также позволяет избежать необходимости уменьшения по модулю .2**(N-1)
X&Y&2**(N-1)
2**(N-1)
Разумеется, биты могут быть проверены в обратном порядке на тот же результат. Тогда вместо того, чтобы удваивать битовую маску каждый раз, когда мы определяем его координаты, вместо этого можно делить пополам, что позволяет получить результаты XORed, в результате чего конечный результат
0
означает отсутствие отрицания и1
означает отрицание.источник
Пари / ГП , 41 байт
Попробуйте онлайн!
источник
К (нгн / к) , 18 байт
Попробуйте онлайн!
источник
05AB1E , 16 байтов
Попробуйте онлайн!
объяснение
Хотелось бы мне знать более короткий способ вычисления веса Хэмминга.
1δ¢˜
такой же длины, как0м€g
.источник
Шелуха , 13 байт
Попробуйте онлайн!
1-индексироваться.
объяснение
источник
JavaScript (Node.js) ,
1008979 байтПопробуйте онлайн!
источник
Python 2 ,
8079 байтПопробуйте онлайн!
источник
0**n*[[1]]
за -1 байтPython 2 , 49 байт
Демонстрируем пару подходов с использованием дополнительных библиотек. Этот опирается на встроенный в Scipy:
Попробуйте онлайн!
Python 2 , 65 байт
И этот использует только Numpy и решает по продукту Kronecker, аналогично моему ответу R :
Попробуйте онлайн!
источник
Stax , 20 байт
Запустите и отладьте его на staxlang.xyz!
Я подумал, что через некоторое время попробую сам. Нерекурсивный подход. Не слишком конкурентоспособен по сравнению с другими языками игры в гольф ...
Распакованный (24 байта) и пояснения
источник