Si vous ne le savez pas déjà, un quaternion est essentiellement un numéro en 4 parties. Aux fins de ce défi, il a une composante réelle et trois composantes imaginaires . Les composantes imaginaires sont représentées par le suffixe i
, j
, k
. Par exemple, 1-2i+3j-4k
est un quaternion avec 1
être la composante réelle et -2
, 3
et -4
étant les composantes imaginaires.
Dans ce défi, vous devez analyser la forme de chaîne d'un quaternion (ex. "1+2i-3j-4k"
) Dans une liste / tableau de coefficients (ex. [1 2 -3 -4]
). Cependant, la chaîne quaternion peut être formatée de différentes manières ...
- Cela peut être normal:
1+2i-3j-4k
- Il peut avoir des termes manquants:
1-3k
,2i-4k
(Si vous avez des termes manquants, la sortie0
de ces termes) - Il peut avoir des coefficients manquant:
i+j-k
(Dans ce cas, cela équivaut à1i+1j-1k
Autrement dit, un.i
,j
Ouk
sans numéro devant est supposé avoir une1
face par défaut) - Ce n'est peut-être pas dans le bon ordre:
2i-1+3k-4j
- Les coefficients peuvent être simplement des entiers ou des décimales:
7-2.4i+3.75j-4.0k
Il y a certaines choses à noter lors de l'analyse:
- Il y aura toujours un
+
ou-
entre les termes - Vous recevrez toujours une entrée valide avec au moins 1 terme et sans lettres répétées (pas de
j-j
s) - Tous les nombres peuvent être considérés comme valides
- Vous pouvez modifier les numéros dans une autre forme après l' analyse syntaxique si vous voulez (ex.
3.0 => 3
,0.4 => .4
,7 => 7.0
)
Les analyses intégrées / quaternion et les failles standard sont interdites. Cela inclut les eval
mots clés et les fonctions. L'entrée sera une chaîne unique et la sortie sera une liste, un tableau, des valeurs séparées par des espaces, etc.
Comme il s'agit de code-golf , le code le plus court en octets l'emporte.
Des tonnes de cas de test
1+2i+3j+4k => [1 2 3 4]
-1+3i-3j+7k => [-1 3 -3 7]
-1-4i-9j-2k => [-1 -4 -9 -2]
17-16i-15j-14k => [17 -16 -15 -14]
7+2i => [7 2 0 0]
2i-6k => [0 2 0 -6]
1-5j+2k => [1 0 -5 2]
3+4i-9k => [3 4 0 -9]
42i+j-k => [0 42 1 -1]
6-2i+j-3k => [6 -2 1 -3]
1+i+j+k => [1 1 1 1]
-1-i-j-k => [-1 -1 -1 -1]
16k-20j+2i-7 => [-7 2 -20 16]
i+4k-3j+2 => [2 1 -3 4]
5k-2i+9+3j => [9 -2 3 5]
5k-2j+3 => [3 0 -2 5]
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13 => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i => [5.6 -3 0 0]
k-7.6i => [0 -7.6 0 1]
0 => [0 0 0 0]
0j+0k => [0 0 0 0]
-0j => [0 0 0 0] or [0 0 -0 0]
1-0k => [1 0 0 0] or [1 0 0 -0]
la source
+
signes inutiles dans l'entrée? Comme+1k
:?+
.-0
une partie de la production légale pour les deux derniers exemples?eval
restriction à prendre dans une chaîne, interprète comme code et / ou entrée. Toutes les conversions ne comptent pas en dessous car vous ne pouvez pas passer, par exemple, la chaîne"test"
à une fonction de conversion d'entier pour recevoir un entier, maistest
serait interprété comme du code dans uneeval
fonction normale . TLDR: eval: non, conversions de type: oui.Réponses:
Pyth, 48 octets
Suite de tests de démonstration
Le format de sortie est séparé par des sauts de ligne. Le code de la suite de tests utilise la séparation d'espace pour faciliter la lecture, mais est par ailleurs le même.
Sorties a
-0
dans les 2 derniers cas, ce qui, je l'espère, est OK.Explication à suivre.
la source
Rétine, 115
Essayez-le en ligne!
1 octet économisé grâce à @Chris Jester-Young .
Un bug corrigé et 6 octets enregistrés grâce à @Martin Büttner
J'ai trouvé quelques bogues impliquant des cas marginaux, le nombre d'octets a augmenté un peu.
Renvoie les numéros séparés par une nouvelle ligne. Quoi qu'il en soit, cela a une solution principalement élégante qui est en quelque sorte ruinée par les cas marginaux, mais bon, j'ai dû utiliser le mode de tri, cela signifie que j'ai utilisé le bon outil pour le travail, non?
Explication:
Étape par étape, comme d'habitude.
Les seuls caractères de l'entrée pouvant créer des limites de mots sont
-+.
. Cela signifie que si nous trouvons une limite suivie d'une lettre, nous avons un implicite1
que nous ajoutons au remplacement.$&
est synonyme de$0
.Un grand merci à Martin pour celui-ci, celui-ci ajoute l'implicite
0
pour la partie réelle s'il manquait à l'entrée. Nous nous assurons que nous ne pouvons pas trouver un nombre suivi d'un signe plus ou moins, ou la fin de la chaîne. Tous les nombres complexes auront une lettre après eux.Les 3 étapes suivantes sont toutes à peu près les mêmes, sauf dans quelle lettre elles ont un impact. Tous cherchent à voir si nous ne pouvons pas faire correspondre la lettre, et si nous ne pouvons pas, nous pouvons ajouter un
0
terme pour cela. La seule raisoni
a un supplément+
avant de ne pas pouvoir lire la valeur réelle avec lei
coefficient s, les autres nombres sont tous séparés par leur variable complexe.Ah, la partie amusante. Cela utilise la nouvelle étape de tri, indiquée par le
O
signe avant le séparateur d'options. L'astuce consiste à saisir le nombre entier suivi éventuellement d'un caractère de mot, qui dans ce cas ne correspondra qu'à l'un desijk
. L'autre option utilisée est celle$
qui fait que la valeur utilisée pour trier ces correspondances est le remplacement. Ici, nous utilisons simplement la lettre facultative restante comme valeur de tri. Étant donné que Retina trie lexicographiquement par défaut, les valeurs sont triées comme elles le seraient dans un dictionnaire, ce qui signifie que nous obtenons les correspondances dans l'"", "i", "j", "k"
ordre.Cette étape met un
+
signe devant tous les signes moins, cela est nécessaire si nous avons une valeur négative pouri
dans l'étape divisée, plus tard.Nous supprimons le début
+
pour nous assurer que nous n'avons pas de nouvelle ligne supplémentaire.Fractionnez les lignes restantes lors des exécutions des variables complexes ou du signe plus. Cela nous donne bien une valeur par ligne.
la source
Perl 5, 125 octets
la source
\a
correspond à "alarm", pas alphabétique. Il y a\w
pour le mot-caractère (alphanumérique et souligné), mais cela ne fonctionnera pas ici; nous en avons besoin pour ne pas correspondre à un nombre.Lua ,
185187195183 183166 octets ( essayez en ligne ) [expression régulière utilisée]Merci à @Chris Jester-Young pour la regex améliorée.
Merci à @Katenkyo de l'avoir ramené à 166 octets.
Golfé:
Non golfé:
la source
n
dans ce cas), vous devez donc ajouter le code pour lire l'entrée.io.read()
, use(...)
. Il pointera vers le premier argument de ligne de commande et vous permettra d'économiser 4 octets supplémentaires :)r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
C, 236 octets
(Pour les valeurs telles que -0 ou -0,0, le signe moins est également imprimé dans la sortie,
mais comme le défi indique que "vous pouvez changer les nombres sous une autre forme après avoir analysé si vous le souhaitez", et si -0 apparaît dans l'entrée, il s'ensuit que c'est également acceptable dans la sortie.@GamrCorps a maintenant clarifié que c'est ok.)la source
JavaScript (ES6),
103100 octetsEdit: sauvé 3 octets en passant de
parseInt
àcharCodeAt
, ce qui a juste besoin&3
de me fournir l'index de tableau correct.la source
JavaScript (ES6) 106
Tester
la source
PowerShell, 178 octets
Non golfé avec explication
Pas super impressionné mais c'est quand même un résultat.
la source
PHP, 179 octets
Essayez la suite de tests .
la source
Python 3.5 - 496 octets [en utilisant des expressions régulières]:
Cela peut être long, mais pour ma défense, cela fonctionne parfaitement pour faire ce que le PO souhaite, car tous les cas de test donnés ont réussi à utiliser mon code.
Version non golfée avec explication incluse:
Si ce qui précède est un peu trop difficile à lire, ce qui se passe est que:
S'il y en a, tous les signes + ou - NON suivis d'un nombre sont remplacés respectivement par "+1" / "- 1".
Une
lambda
fonction est définie qui, lorsqu'elle est utilisée dans unesorted
fonction comme clé, trie la liste en mettant d'abord le nombre entier, puis en ordonnant le reste en augmentant la valeur de la lettre ("i", puis "j", puis "k" dans ce cas).Le Quaternion, ayant maintenant tous les signes +/- remplacés par un 1 si nécessaire, est recherché, en utilisant des expressions régulières, pour TOUTES les lettres NON précédées d'au moins un chiffre, et les lettres qui correspondent sont remplacées par un "+1" suivi de cette lettre.
L'instruction "if" remplace alors TOUS les signes +/- par un espace, puis le Quaternion modifié est maintenant "divisé" à ces espaces, et renvoyé dans une liste. Ensuite, la liste est triée selon la fonction lambda expliquée précédemment. Enfin, le premier élément de cette liste est vérifié pour s'assurer qu'il s'agit d'un nombre, car il est censé l'être, et si ce n'est pas le cas, un "+0" est ajouté au Quaternion.
La deuxième boucle "for" trouve TOUTES les lettres NON dans le Quaternion en trouvant une différence symétrique entre un ensemble de ces lettres trouvées dans l'expression, puis un ensemble comprenant toutes les lettres requises. S'il en trouve, un "+0" suivi de la lettre manquante et un espace sont ajoutés au Quaternion.
Enfin, dans cette dernière étape, un "," est ajouté entre chaque caractère suivi d'un symbole +/-, puis le Quaternion est divisé à ces espaces, puis la liste renvoyée est triée, pour la dernière fois, selon le fonction lambda définie comme "q" plus tôt. Les virgules dans l'expression séparent chaque partie du quaternion (sinon, vous obtiendrez quelque chose comme
14i+5j+6k
de4i+5j+6k+1
). Enfin, cette liste maintenant triée est réunie en une chaîne, et seuls les numéros de tout type (gracieuseté des expressions régulières) sont extraits et finalement renvoyés dans une liste, dans le bon ordre, à chaque fois.la source