Une matrice de Walsh est un type spécial de matrice carrée avec des applications en informatique quantique (et probablement ailleurs, mais je ne me soucie que de l'informatique quantique).
Propriétés des matrices de Walsh
Les dimensions sont la même puissance de 2. Par conséquent, on peut se référer à ces matrices par l'exposant de deux ici, les appeler W(0)
, W(1)
, W(2)
...
W(0)
est défini comme [[1]]
.
Car n>0
, W(n)
ressemble à:
[[W(n-1) W(n-1)]
[W(n-1) -W(n-1)]]
Il en W(1)
est de même:
[[1 1]
[1 -1]]
Et W(2)
c'est:
[[1 1 1 1]
[1 -1 1 -1]
[1 1 -1 -1]
[1 -1 -1 1]]
Le schéma continue ...
Ta tâche
Écrivez un programme ou une fonction qui prend en entrée un entier n
et imprime / retourne W(n)
dans n'importe quel format pratique. Cela peut être un tableau de tableaux, un tableau aplati de booléens, une .svg
image, vous l' appelez, tant qu'elle est correcte.
Les failles standard sont interdites.
Quelques choses:
Car W(0)
, il 1
n'est pas nécessaire d'envelopper une seule fois. Il peut s'agir d'un simple entier.
Vous êtes autorisé à 1 indexer les résultats - W(1)
serait alors [[1]]
.
Cas de test
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
C'est le code-golf , donc la solution la plus courte dans chaque langue gagne! Bon golf!
W(1)
retours[[1]]
,W(2)
retours[[1,1],[1,-1]
...)Réponses:
Perl 6 ,
634440 octetsEssayez-le en ligne!
Approche non récursive, exploitant le fait que la valeur aux coordonnées x, y est
(-1)**popcount(x&y)
. Renvoie un tableau aplati de booléens.-4 octets grâce à l' astuce de parité des bits de xnor .
la source
MATL , 4 octets
Essayez-le en ligne!
Comment ça marche:
Sans le intégré: 11 octets
Essayez-le en ligne!
Comment ça marche :
Pour chaque matrice Walsh W , la matrice suivante est calculée comme [ W W ; W - W ], comme décrit dans le défi. Le code fait cela
n
fois, à partir de la matrice 1 × 1 [1].la source
kron
. ;)Haskell ,
5756 octetsEssayez-le en ligne! Ceci implémente la construction récursive donnée.
-1 octet grâce à Ørjan Johansen !
la source
(iterate(\m->zipWith(++)(m++m)$m++(map(0-)<$>m))[[1]]!!)
.Octave avec intégré,
1817 octetsEssayez-le en ligne!
Octave sans intégré,
56 5147 octetsEssayez-le en ligne! Merci à @Luis Mendo pour -4.
Octave avec lambda récursif,
54 53 5248 octetsEssayez-le en ligne! Merci à cette réponse et à cette question d'inspiration.
la source
end
n'est pas nécessaire. Vous pouvez donc le déplacer vers l'en-tête de TIO et ainsi le supprimer du nombre d'octetsAPL (Dyalog Unicode) , 12 octets
Essayez-le en ligne!
La sortie est un tableau à 2 dimensions.
la source
Python 2 ,
7571 octetsEssayez-le en ligne!
La matrice de Walsh semble être liée aux mauvais nombres. Si
x&y
(au niveau du bit et coordonnées basées sur 0) est un nombre mauvais, la valeur dans la matrice est1
,-1
pour les nombres odieux. Le calcul de la parité des bitsint(bin(n),13)%2
est tiré du commentaire de Noodle9 sur cette réponse .la source
x&y
pour déterminer combien de fois retourner le signe.R ,
61565350 octetsEssayez-le en ligne!
Calcule récursivement la matrice par produit Kronecker, et renvoie 1 pour le
n=0
cas (merci à Giuseppe pour l'avoir signalé, et aussi à JAD pour avoir aidé à jouer au golf la version initiale).Encore 3 octets supplémentaires grâce à Giuseppe.
la source
1
plutôt quematrix(1)
valide, mais si c'est le cas, vous pouvez jouer au golf, et il existe également uneReduce
approche de 61 octets : essayez-le!n=0
casse, la plupart des autres réponses en contiennent [[1]], mais pas toutes ...matrix(1)
part(1)
.1-2*!3:0
est plus court quec(1,1,1,-1)
de trois octets.Gelée , 14 octets
Essayez-le en ligne!
Modifiez le
G
pourŒṘ
en bas de page pour voir la sortie réelle.la source
JavaScript (ES6), 77 octets
Le calcul naïf commence par prendre
0 <= X, Y <= 2**N
enW[N]
. Le cas simple est quandX
ouY
est inférieur à2**(N-1)
, auquel cas nous récursions surX%2**(N-1)
etY%2**(N-1)
. Dans le cas des deuxX
etY
étant au moins2**(N-1)
l'appel récursif doit être annulé.Si plutôt que de comparer
X
ouY
moins qu'un2**(N-1)
masque de bitsX&Y&2**(N-1)
est pris, il est différent de zéro lorsque l'appel récursif doit être annulé et nul dans le cas contraire. Cela évite également d'avoir à réduire le modulo2**(N-1)
.Les bits peuvent bien sûr être testés dans l'ordre inverse pour le même résultat. Ensuite, plutôt que de doubler le masque binaire à chaque fois que nous coordonnées, il peut être divisé par deux à la place, permettant aux résultats d'être XOR, ce qui
0
signifie qu'un résultat final signifie aucune négation et1
signifie la négation.la source
Pari / GP , 41 octets
Essayez-le en ligne!
la source
K (ngn / k) , 18 octets
Essayez-le en ligne!
la source
05AB1E , 16 octets
Essayez-le en ligne!
Explication
Je souhaite que je connaissais un moyen plus court de calculer le poids de Hamming.
1δ¢˜
est de la même longueur que0м€g
.la source
Husk , 13 octets
Essayez-le en ligne!
1 indexé.
Explication
la source
JavaScript (Node.js) ,
1008979 octetsEssayez-le en ligne!
la source
Python 2 ,
8079 octetsEssayez-le en ligne!
la source
0**n*[[1]]
pour -1 octetPython 2 , 49 octets
Présentant quelques approches à l'aide de bibliothèques supplémentaires. Celui-ci s'appuie sur un Scipy intégré:
Essayez-le en ligne!
Python 2 , 65 octets
Et celui-ci utilise uniquement Numpy, et résout par produit Kronecker, de manière analogue à ma réponse R :
Essayez-le en ligne!
la source
Stax , 20 octets
Exécutez-le et déboguez-le sur staxlang.xyz!
Je pensais essayer mon propre défi après un certain temps. Approche non récursive. Pas trop compétitif par rapport aux autres langues de golf ...
Déballé (24 octets) et explication
la source