Una matriz de Walsh es un tipo especial de matriz cuadrada con aplicaciones en computación cuántica (y probablemente en otros lugares, pero solo me importa la computación cuántica).
Propiedades de las matrices de Walsh
Las dimensiones son de la misma potencia de 2. Por lo tanto, podemos referirnos a estas matrices por exponente de dos aquí, llamándolos W(0)
, W(1)
, W(2)
...
W(0)
se define como [[1]]
.
Para n>0
, se W(n)
ve así:
[[W(n-1) W(n-1)]
[W(n-1) -W(n-1)]]
Entonces W(1)
es:
[[1 1]
[1 -1]]
Y W(2)
es:
[[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
El patrón continúa ...
Tu tarea
Escriba un programa o función que tome como entrada un número entero n
e imprima / devuelva W(n)
en cualquier formato conveniente. Puede ser una matriz de matrices, una matriz aplanada de booleanos, una .svg
imagen, lo que sea, siempre que sea correcto.
Las lagunas estándar están prohibidas.
Un par de cosas:
Para W(0)
, la 1
necesidad no se envuelve ni una sola vez Puede ser un mero entero.
Se le permite obtener 1 índice de resultados W(1)
, entonces sería [[1]]
.
Casos de prueba
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
Este es el código de golf , por lo que gana la solución más corta en cada idioma. ¡Feliz golf!
W(1)
devoluciones[[1]]
,W(2)
devoluciones[[1,1],[1,-1]
...)Respuestas:
Perl 6 ,
634440 bytesPruébalo en línea!
Enfoque no recursivo, explotando el hecho de que el valor en las coordenadas x, y es
(-1)**popcount(x&y)
. Devuelve una matriz aplanada de booleanos.-4 bytes gracias a XNOR 's truco bit de paridad .
fuente
MATL , 4 bytes
Pruébalo en línea!
Cómo funciona:
Sin el incorporado: 11 bytes
Pruébalo en línea!
Cómo funciona :
Para cada matriz Walsh W , la siguiente matriz se calcula como [ W W ; W - W ], como se describe en el desafío. El código hace ese
n
tiempo, comenzando desde la matriz 1 × 1 [1].fuente
kron
. ;)Haskell ,
5756 bytesPruébalo en línea! Esto implementa la construcción recursiva dada.
-1 byte gracias a Ørjan Johansen !
fuente
(iterate(\m->zipWith(++)(m++m)$m++(map(0-)<$>m))[[1]]!!)
.Octava con incorporado,
1817 bytesPruébalo en línea!
Octava sin construir,
56 5147 bytesPruébalo en línea! Gracias a @Luis Mendo por -4.
Octava con lambda recursiva,
54 53 5248 bytesPruébalo en línea! Gracias a esta respuesta y esta pregunta por inspiración.
fuente
end
no se necesita el segundo . Para que pueda moverlo al encabezado de TIO y así eliminarlo del conteo de bytesAPL (Dyalog Unicode) , 12 bytes
Pruébalo en línea!
La salida es una matriz bidimensional.
fuente
Python 2 ,
7571 bytesPruébalo en línea!
La matriz de Walsh parece estar relacionada con los números malvados. Si
x&y
(coordenadas bit a bit y basadas en 0) es un número malo, el valor en la matriz es1
,-1
para números odiosos. El cálculo de la paridad de bitsint(bin(n),13)%2
se toma del comentario de Noodle9 sobre esta respuesta .fuente
x&y
para determinar cuántas veces voltear el signo.R ,
61565350 bytesPruébalo en línea!
Calcula recursivamente la matriz por el producto Kronecker, y devuelve 1 por
n=0
caso (gracias a Giuseppe por señalar esto, y también a JAD por ayudar a jugar golf la versión inicial).-3 bytes adicionales nuevamente gracias a Giuseppe.
fuente
1
lugar dematrix(1)
ser válido, pero si lo es, puedes jugar golf, y también hay unReduce
enfoque de 61 bytes : ¡ pruébalo!n=0
caso, la mayoría de las otras respuestas lo envuelven en [[1]], pero no todas ...matrix(1)
cont(1)
.1-2*!3:0
es más corto quec(1,1,1,-1)
por tres bytes.Jalea , 14 bytes
Pruébalo en línea!
Cambie
G
aŒṘ
en el pie de página para ver la salida real.fuente
JavaScript (ES6), 77 bytes
El cálculo ingenuo comienza tomando
0 <= X, Y <= 2**N
enW[N]
. El caso simple es cuandoX
oY
es menor que2**(N-1)
, en cuyo caso recurrimos enX%2**(N-1)
yY%2**(N-1)
. En el caso de ambosX
y deY
ser al menos2**(N-1)
la llamada recursiva debe ser negada.Si en lugar de comparar
X
o se tomaY
menos de2**(N-1)
una máscara de bitsX&Y&2**(N-1)
, esto no es cero cuando la llamada recursiva necesita ser negada y cero cuando no lo hace. Esto también evita tener que reducir el módulo2**(N-1)
.Por supuesto, los bits se pueden probar en orden inverso para obtener el mismo resultado. Luego, en lugar de duplicar la máscara de bits cada vez que coordinamos, se puede reducir a la mitad, permitiendo que los resultados sean XORed, por lo que un resultado final
0
significa no negación y1
significa negación.fuente
Pari / GP , 41 bytes
Pruébalo en línea!
fuente
K (ngn / k) , 18 bytes
Pruébalo en línea!
fuente
05AB1E , 16 bytes
Pruébalo en línea!
Explicación
Ojalá supiera una forma más corta de calcular el peso de Hamming.
1δ¢˜
tiene la misma longitud que0м€g
.fuente
Casco , 13 bytes
Pruébalo en línea!
1 indexado.
Explicación
fuente
JavaScript (Node.js) ,
1008979 bytesPruébalo en línea!
fuente
Python 2 ,
8079 bytesPruébalo en línea!
fuente
0**n*[[1]]
por -1 bytePython 2 , 49 bytes
Mostrando un par de enfoques utilizando bibliotecas adicionales. Este se basa en un Scipy incorporado:
Pruébalo en línea!
Python 2 , 65 bytes
Y este solo usa Numpy, y resuelve por el producto Kronecker, de manera análoga a mi respuesta R :
Pruébalo en línea!
fuente
Stax , 20 bytes
¡Ejecútelo y depúrelo en staxlang.xyz!
Pensé en probar mi propio desafío después de algún tiempo. Enfoque no recursivo. No es demasiado competitivo contra otros idiomas de golf ...
Desempaquetado (24 bytes) y explicación
fuente