Uma matriz de Walsh é um tipo especial de matriz quadrada com aplicações na computação quântica (e provavelmente em outros lugares, mas eu me preocupo apenas com a computação quântica).
Propriedades das matrizes de Walsh
As dimensões são a mesma potência de 2. Portanto, podemos nos referir a essas matrizes por expoente dois está aqui, chamando-os W(0)
, W(1)
,W(2)
...
W(0)
é definido como [[1]]
.
Pois n>0
, W(n)
parece com:
[[W(n-1) W(n-1)]
[W(n-1) -W(n-1)]]
Então W(1)
é:
[[1 1]
[1 -1]]
E W(2)
é:
[[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
O padrão continua ...
Sua tarefa
Escreva um programa ou função que tome como entrada um número inteiro n
e imprima / retorne W(n)
em qualquer formato conveniente. Pode ser uma matriz de matrizes, uma matriz plana de booleanos, uma .svg
imagem, o nome dela, desde que esteja correta.
As brechas padrão são proibidas.
Algumas coisas:
Pois W(0)
, 1
não é necessário embrulhar nem uma vez. Pode ser um mero inteiro.
Você tem permissão para resultados de 1 índice - W(1)
seria[[1]]
.
Casos de teste
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
Isso é código-golfe , então a solução mais curta em cada idioma vence! Feliz golfe!
W(1)
devoluções[[1]]
,W(2)
devoluções[[1,1],[1,-1]
...)Respostas:
Perl 6 ,
634440 bytesExperimente online!
Abordagem não recursiva, explorando o fato de que o valor nas coordenadas x, y é
(-1)**popcount(x&y)
. Retorna uma matriz nivelada de booleanos.-4 bytes graças a xnor 's truque bit de paridade .
fonte
MATL , 4 bytes
Experimente online!
Como funciona:
Sem o built-in: 11 bytes
Experimente online!
Como funciona :
Para cada matriz Walsh W , a próxima matriz é calculada como [ W W ; W - W ], conforme descrito no desafio. O código faz isso
n
vezes, começando na matriz 1 × 1 [1].fonte
kron
. ;)Haskell ,
5756 bytesExperimente online! Isso implementa a construção recursiva fornecida.
-1 byte graças a Ørjan Johansen !
fonte
(iterate(\m->zipWith(++)(m++m)$m++(map(0-)<$>m))[[1]]!!)
.Oitava com built-in,
1817 bytesExperimente online!
Oitava sem built-in,
56 5147 bytesExperimente online! Obrigado a @Luis Mendo por -4.
Oitava com lambda recursiva,
54 53 5248 bytesExperimente online! Graças a esta resposta e a esta pergunta por inspiração.
fonte
end
não será necessário. Assim, você pode movê-lo para o cabeçalho do TIO e, assim, removê-lo da contagem de bytesAPL (Dyalog Unicode) , 12 bytes
Experimente online!
A saída é uma matriz bidimensional.
fonte
Python 2 ,
7571 bytesExperimente online!
A matriz de Walsh parece estar relacionada aos números malignos. Se
x&y
(bit a bit e, com base coordenadas-0) é um número mal, o valor na matriz é1
,-1
em números odious. O cálculo da paridade de bitsint(bin(n),13)%2
é retirado do comentário do Noodle9 sobre esta resposta .fonte
x&y
para determinar quantas vezes virar o sinal.R ,
61565350 bytesExperimente online!
Calcula recursivamente a matriz pelo produto Kronecker e retorna 1 para o
n=0
caso (graças a Giuseppe por apontar isso e também ao JAD por ajudar a jogar golfe na versão inicial).-3 bytes adicionais novamente graças a Giuseppe.
fonte
1
vez dematrix(1)
é válido, mas, se for, você pode jogar golfe e também há umaReduce
abordagem de 61 bytes : experimente!n=0
caso, a maioria das outras respostas envolvê-la em [[1]], mas não é tudo ...matrix(1)
port(1)
.1-2*!3:0
é menor quec(1,1,1,-1)
três bytes.Gelatina , 14 bytes
Experimente online!
Altere
G
paraŒṘ
no rodapé para ver a saída real.fonte
JavaScript (ES6), 77 bytes
O cálculo ingênuo começa tomando
0 <= X, Y <= 2**N
emW[N]
. O caso simples é quando umX
ouY
é menor que2**(N-1)
, caso em que recorremos emX%2**(N-1)
eY%2**(N-1)
. No caso de ambosX
eY
sendo pelo menos2**(N-1)
a chamada recursiva precisa ser negada.Se em vez de comparar
X
ouY
menos de2**(N-1)
uma máscara de bitsX&Y&2**(N-1)
for usada, isso será diferente de zero quando a chamada recursiva precisar ser negada e zero quando não for necessária. Isso também evita ter que reduzir o módulo2**(N-1)
.Obviamente, os bits podem ser testados na ordem inversa para o mesmo resultado. Então, em vez de dobrar a máscara de bit cada vez que ele coordena, pode ser dividido pela metade, permitindo que os resultados sejam XOR, pelo que um resultado final
0
significa que não há negação e1
significa negação.fonte
Pari / GP , 41 bytes
Experimente online!
fonte
K (ngn / k) , 18 bytes
Experimente online!
fonte
05AB1E , 16 bytes
Experimente online!
Explicação
Eu gostaria de conhecer uma maneira mais curta de calcular o peso de Hamming.
1δ¢˜
tem o mesmo comprimento que0м€g
.fonte
Casca , 13 bytes
Experimente online!
1 indexado.
Explicação
fonte
JavaScript (Node.js) ,
1008979 bytesExperimente online!
fonte
Python 2 ,
8079 bytesExperimente online!
fonte
0**n*[[1]]
para -1 bytePython 2 , 49 bytes
Apresentando algumas abordagens usando bibliotecas adicionais. Este conta com um recurso interno do Scipy:
Experimente online!
Python 2 , 65 bytes
E este usa apenas o Numpy e resolve pelo produto Kronecker, analogamente à minha resposta R :
Experimente online!
fonte
Stax , 20 bytes
Execute e depure-o em staxlang.xyz!
Pensei em tentar meu próprio desafio depois de algum tempo. Abordagem não recursiva. Não é muito competitivo contra outras línguas do golfe ...
Descompactado (24 bytes) e explicação
fonte