Les matrices Pauli sont un ensemble de matrices 2x2 qui apparaissent très couramment en physique quantique (non, vous n'avez pas besoin de connaître de physique quantique pour ce défi). Si nous incluons l'identité dans l'ensemble, les quatre matrices sont:
σ0 = σ1 = σ2 = σ3 =
[1 0] [0 1] [0 -i] [1 0]
[0 1] [1 0] [i 0] [0 -1]
En multipliant deux d' entre eux sera toujours donner une autre matrice Pauli, bien qu'il peut être multiplié par l' une des phases complexes 1
, i
, -1
, -i
. Par exemple, .σ1σ3 = -iσ2
Votre tâche consiste à multiplier un certain nombre de matrices de Pauli et à renvoyer la matrice et la phase résultantes. Entrée sera donnée sous forme de chaîne non vide de chiffres 0
pour 3
représenter les matrices à . La sortie doit être une chaîne contenant un seul chiffre pour la matrice résultante, éventuellement précédée de , ou pour indiquer la phase ( est pour ).σ0
σ3
i
-
-i
-
-1
Vous pouvez écrire un programme ou une fonction, en prenant une entrée via STDIN (ou l'alternative la plus proche), un argument de ligne de commande ou un argument de fonction et en sortant le résultat via STDOUT (ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
Vous ne devez pas utiliser de fonctionnalités intégrées (ou tierces) liées aux matrices Pauli.
Il s'agit du code golf, la réponse la plus courte (en octets) l'emporte.
Cas de test
1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1
la source
Réponses:
Pyth, 47 octets
Je suppose que c'est toujours jouable au golf. Mais il bat beaucoup CJam.
Essayez-le en ligne: démonstration ou suite de tests
Explication
Déterminer le type de matrice résultant revient simplement à xorer tous les nombres.
En multipliant 2 matrices
A*B
, la phase change, si aucune des matrices n'estσ0
etA != B
.la source
Python 2,
108898786 octets(Merci à @grc et @xnor pour l'aide)
Explication
Divisons le coefficient et la matrice de base. Si nous nous concentrons sur la matrice de base seulement, nous obtenons cette table de multiplication (par exemple
13
est-i2
, nous avons donc mis2
):qui se trouve être la même chose que de faire xor au niveau du bit.
Concentrons-nous maintenant sur les coefficients. Si nous
0123
désignons1,i,-1,-i
respectivement, nous obtenons:Pour cela, nous vérifions d'abord si l'un ou l'autre nombre est 0 en faisant
m*y
, en prenant soin de la colonne de gauche et de la ligne supérieure. L'ajout(m-y)%3
donne alors:qui est proche, sauf que nous avons
2
au lieu de3
. Nous en tenons compte en effectuant*3/2
.Pour l'indexation, nous remarquons que si nous prenons la chaîne
"--i"
et sélectionnons chaque deuxième caractère à partir des indices que0123
nous obtenons"-i","-","i",""
.la source
3-n%4
comme~n%4
. Je soupçonne que vous pouvez exprimerm*y and(m-y)%3*3/2
plus court dans une chaîne magique, mais ma première tentative877449216>>2*m+8*y
n'a fait que lier. Il y a aussi une formule assez algébrique, que siY=m^y
, l'expression est(m-y)*(y-Y)*(Y-m)/2
, mais c'est long.~
, chouette - le coup par coup m'ennuyait : / Je suis sûr que çam*y and(m-y)%3*3/2
peut aussi être raccourci, mais j'ai passé toute la nuit et je n'ai rien obtenu ... J'y reviendrai si je avoir le temps. Peut-être que le fait d'avoir le mod 4 de liberté pourrait aider.Rétine , 77 octets
J'ai pensé profiter de cette opportunité pour montrer une nouvelle fonctionnalité Retina: les boucles multi-étapes. Cela devrait considérablement raccourcir de nombreuses tâches (notamment le remplacement conditionnel).
Retina est mon propre langage de programmation basé sur l'expression rationnelle. Le code source peut être regroupé en étapes: chaque étape se compose de deux lignes où la première contient l'expression régulière (et éventuellement une configuration) et la deuxième ligne est la chaîne de remplacement. Les étapes sont ensuite appliquées à STDIN dans l'ordre et le résultat final est imprimé à STDOUT.
Vous pouvez utiliser ce qui précède directement comme fichier source avec le
-s
commutateur de ligne de commande. Cependant, je ne compte pas le commutateur, car vous pouvez également simplement mettre chaque ligne dans un fichier séparé (vous perdez alors 15 octets pour les sauts de ligne, mais ajoutez +15 pour les fichiers supplémentaires).Explication
La nouveauté de cette solution est
)
l'avant-dernière étape. Cela ferme une boucle en plusieurs étapes. Il n'y a pas de correspondance(
, ce qui signifie que la boucle démarre implicitement au premier stade. Par conséquent, les 7 premières étapes sont répétées jusqu'à ce qu'un passage complet à travers les 7 étapes cesse de changer le résultat. Ces 7 étapes effectuent simplement diverses transformations qui réduisent progressivement le nombre de matrices dans la chaîne et combinent les phases. Une fois que nous atteignons le résultat final, aucun des sept modèles ne correspond plus et la boucle se termine. Ensuite, nous ajoutons un 0 s'il n'y a pas encore de chiffre dans le résultat (car les étapes ci-dessus suppriment simplement toutes les identités, y compris le résultat).Voici ce que font les différentes étapes:
Combine toutes les paires de
i
en-
pour réduire les caractères de phase.Maintenant, s'il reste deux caractères identiques consécutifs, c'est soit
--
deux matrices identiques. Dans les deux cas, leur multiplication donne l'identité. Mais nous n'avons pas besoin d'identités, nous les supprimons donc toutes, ainsi que les identités explicites0
. Cette étape se répète en elle-même+
jusqu'à ce que le résultat cesse de changer. Cela garantit que des choses comme la123321
résolution complète, de sorte que l'étape suivante peut supposer que toutes les paires de chiffres sont distinctes.Il s'agit en fait de deux transformations distinctes en une (pour la golfitude). Notez que si la première alternative correspond,
$2
et$3
sont vides, et si la seconde correspond$1
est vide. Cela peut donc être décomposé en ces deux étapes:Cela permute simplement toutes les paires de chiffres et ajoute un signe moins. Depuis que nous avons supprimé toutes les
0
s et toutes les paires identiques, cela ne correspond12
,23
,31
,21
,32
,13
. Cette étape peut sembler étrange, mais elle me permet de ne vérifier que la moitié de ces cas plus tard, car ceux que je ne peux pas traiter seront échangés ici lors de la prochaine itération.L'autre partie de l'étape ci-dessus était:
Cela déplace progressivement les
-
panneaux vers la gauche (une position par itération). Je fais cela de telle sorte qu'en fin de compte, ils sont tous côte à côte et résolus à l'étape précédente.Ces trois étapes résolvent désormais simplement les trois paires de produits. Comme je l'ai dit ci-dessus, cela n'attrapera que la moitié des cas pertinents, mais l'autre moitié sera prise en charge lors de la prochaine itération, après que l'étape précédente ait échangé toutes les paires.
C'est la dernière étape de la boucle. Il est similaire à celui qui se déplace
-
vers la gauche, à l'exception dei
. La principale différence est que celui-ci échangei
uniquement avec des chiffres. Si j'utilisais(.)i
alors dans les cas où j'obtiens un-i
oui-
les deux seraient échangés indéfiniment et le programme ne se terminerait pas. Cela ne fait donc que les échanger à droite des-
panneaux. C'est suffisant - tant que tous-
eti
apparaissent ensemble à un moment donné, ils peuvent être résolus correctement.La dernière étape (en dehors de la boucle). N'oubliez pas que nous avons toujours supprimé toutes les identités, donc si le résultat est réellement l'identité (fois une phase), nous n'aurons plus le chiffre requis dans la sortie, nous l'ajoutons donc.
À titre d'exemple, voici toutes les formes intermédiaires de
0223202330203313021301011023230323
(saut d'étapes qui n'effectuent aucun changement):la source
CJam,
5856 octetsJe suis sûr que cela peut être beaucoup joué au golf, mais voici:
Essayez-le en ligne ici ou exécutez la suite complète ici
la source