Les entiers gaussiens sont des nombres complexes de la forme a+bi
où a
et b
sont les deux entiers. En base -1 + i, tous les nombres entiers gaussiens peuvent être représentés de manière unique à l'aide des chiffres 0
et 1
, sans qu'un symbole ne soit nécessaire pour indiquer le signe.
Par exemple, 1100
en base -1 + i représente le nombre décimal 2, puisque
1*(-1+i)^3 + 1*(-1+i)^2 + 0*(-1+i)^1 + 0*(-1+i)^0
= (2+2i) + (-2i) + 0 + 0
= 2
L'entrée consistera en deux entiers gaussiens en base -1 + i représentés à l'aide des chiffres 01
. Cela peut prendre l’une des formes suivantes:
- Deux chaînes de chiffres distinctes,
- Deux entiers décimaux consistant à
01
représenter les nombres base -1 + i (par exemple1100
pour 2 en base -1 + i), - Deux entiers binaires représentant les nombres base -1 + i (par exemple, décimal
12
ou0b1100
pour 2 en base -1 + i) - Une seule chaîne séparant deux chaînes de chiffres / entiers binaires par un seul séparateur non alphanumérique (par exemple
1100 1100
ou12,12
pour 2 + 2)
Affiche la somme des deux nombres entiers de Gauss, également en base -1 + i et représentée à l'aide des chiffres 01
(dans l'un des formats autorisés en entrée, pas nécessairement le même choix). La sortie est autorisée à contenir un nombre fini de zéros non significatifs.
Votre fonction ou votre programme doit se terminer dans les 2 secondes pour des entrées de 30 chiffres maximum chacune.
Clarifications supplémentaires
- Vous pouvez supposer que l'entrée ne contient pas de zéros non significatifs. Dans le cas particulier de 0, vous pouvez choisir soit
0
la chaîne vide, soit la représentation.
Cas de test
0, 0 => 0 # 0 + 0 = 0
0, 1 => 1 # 0 + 1 = 1
1, 1 => 1100 # 1 + 1 = 2
1100, 1100 => 111010000 # 2 + 2 = 4
1101, 1101 => 111011100 # 3 + 3 = 6
110111001100, 1110011011100 => 0 # 42 + (-42) = 0
11, 111 => 0 # i + (-i) = 0
11, 110 => 11101 # i + (-1-i) = -1
10101, 11011 => 10010 # (-3-2i) + (-2+3i) = (-5+i)
1010100101, 111101 => 1110100000100 # (-19+2i) + (3-4i) = (-16-2i)
Cas de test plus longs:
11011011010110101110010001001, 111100010100101001001010010101 => 0
111111111111111111111111111111, 111111111111111111111111111111 => 100100100100100100100100100100
101101110111011101110111011101, 101101110111011101110111011101 => 11101001010001000100010001000100011100
100100010101001101010110101010, 100010011101001011111110101000 => 110000110010101100001100111100010
-1+i
ài-1
dans le titre.Réponses:
Python 2,
98979184 octetsCela ne I / O en décimal. Les nombres entiers doivent être séparés par un caractère non alphanumérique
+
.Merci à @xnor d'avoir joué 2 octets!
Essayez-le sur Ideone .
Comment ça fonctionne
Dans Arithmetic in Complex Bases , l'auteur montre comment ajouter et multiplier des nombres complexes dans des bases de la forme -n + i .
Pour la base -1 + i , l’addition est similaire à l’addition régulière, binaire avec retenue, avec deux différences:
Au lieu de porter 1 à la position immédiatement supérieure, nous en porterons 110 aux trois prochaines.
Les chiffres porteurs peuvent se propager indéfiniment. Cependant, sans les zéros de tête, la somme a + b a au plus huit chiffres plus que le maximum de a et b .
Nous procédons comme suit.
Tout d'abord, nous ajoutons a et b comme si leurs chiffres étaient des chiffres décimaux.
Pour a = 10101 et b = 11011 , cela donne 21112 .
Ensuite, nous formons un nouveau numéro en remplaçant les chiffres plus grands que 1 par un 1 , les autres par un 0 . 1
Pour la somme 21112 , cela donne 10001 .
Pour chaque chiffre supérieur à 1 , nous devons soustraire 2 de ce chiffre et en porter 110 aux trois positions les plus élevées. Puisque 1098 = 10 * 110 - 2 , nous pouvons y parvenir en multipliant le résultat de l’étape 2 par 1098 , puis en ajoutant ce produit à la somme. 2
Pour la somme 21112 , cela donne 21112 + 1098 * 10001 = 21112 + 10981098 = 11002210 .
Nous répétons les étapes 2 et 3 un total de d * 8 fois, où d est le nombre de chiffres de a + b . 3
Pour la somme initiale 21112 , les résultats sont
Nous prenons la somme finale modulo 10 j + 8 , en éliminant tous les d, sauf les derniers d + 8 chiffres.
Pour la somme initiale 21112 , le résultat final est 10010 .
1 Ceci est réalisé avec translate . La répétition de la chaîne 0011 64 fois permet à une répétition de s'aligner sur la séquence de caractères ASCII 0123 , permettant ainsi d' obtenir le remplacement souhaité.
2 Notez que les chiffres de cette somme ne peuvent pas excéder 3 (valeur initiale 1 plus deux 1 de reports).
3 Cela fonctionne pour d = 1 et d * 8> d + 8 sinon. Le code peut répéter les étapes (d + 1) * 8 fois, car s est suivi d'un L final si s est un entier long .
la source
input()
attend? (Je reçois21112
quand je saisis10101, 11011
.)d+8
et pas, disonsd+9
? Comment????Pyth, 34 octets
Essayez-le en ligne: Démonstration ou Suite de tests (prend un certain temps). Cela devrait facilement satisfaire à la limitation de temps, car le compilateur en ligne est assez lent par rapport au compilateur normal (hors ligne).
Explication:
Mon algorithme est fondamentalement une implémentation d’addition à porter. Mais au lieu de porter
1
, je dois porter110
(1100
dans la base-1+i
est la même que2
dans la base-1+i
). Cela fonctionne généralement très bien, mais vous pouvez rester bloqué dans une boucle infinie d’impressions de zéros. Par exemple, si vous ajoutez1
avec11
et avez actuellement le report110
. Donc, en gros, j'ajoute jusqu'à ce que je reste bloqué dans une boucle, puis je m'arrête. Je pense qu’une boucle imprimera toujours des zéros et que cela devrait donc aller.la source
Python 2,
6967 octetsI / O est fait avec des entiers base 2.
-2 merci à Dennis.
la source
a*a+b*b^58==0
quanda
etb
sont inverses? Comment ça marche?a*a+b*b==58
quand l'un d'eux a 3 ans et l'autre 7 ans.(3,7)
soit la seule paire qui donne un cycle et qui a besoin d'un boîtier spécial. Si cela est vrai, il vous suffira de vérifier(a,b)==(3,7)
dans cet ordre, puisque(7,3)
récursivement(3,7)
, et peut-être une expression plus courte pour cela.^
+
Retina , 100 octets
Cela prend l’entrée séparée par une virgule. La sortie commence toujours par trois zéros au début.
Essayez-le en ligne!
Je me demande vraiment s'il existe une solution plus courte pour la première étape ...
la source
Jelly,
292826242120 octetsCela ne I / O en décimal. Les nombres entiers doivent être séparés par un caractère non alphanumérique
+
.Essayez-le en ligne! ou vérifier tous les cas de test .
Contexte
Dans Arithmetic in Complex Bases , l'auteur montre comment ajouter et multiplier des nombres complexes dans des bases de la forme -n + i .
Pour la base -1 + i , l’addition est similaire à l’addition régulière, binaire avec retenue, avec deux différences:
Au lieu de porter 1 à la position immédiatement supérieure, nous en porterons 110 aux trois prochaines.
Les chiffres porteurs peuvent se propager indéfiniment. Cependant, sans les zéros de tête, la somme a + b a au plus huit chiffres plus que le maximum de a et b .
Nous procédons comme suit.
Tout d'abord, nous ajoutons a et b comme si leurs chiffres étaient des chiffres décimaux.
Pour a = 10101 et b = 11011 , cela donne 21112 .
Pour chaque chiffre supérieur à 1 , nous devons soustraire 2 de ce chiffre et en porter 110 aux trois positions les plus élevées. On peut y parvenir en convertissant chaque chiffre décimal en binaire, les matrices binaires résultantes de la base 1100 à un nombre entier, et interpréter la liste résultante de 0 « s, 1 » s, 1100 « s et 1101 » s en tant que base non-canonique 10 nombre. 1
Pour la somme 21112 , cela donne 21112 + 1098 * 10001 = 21112 + 10981098 = 11002210 .
Nous répétons les étapes 2 un total de d + 8 fois, où d est le nombre de chiffres de a + b .
Pour la somme initiale 21112 , les résultats sont
Nous éliminons tous les d + 8 derniers chiffres du résultat final, sauf les derniers . Ceci est réalisé en éliminant tout après les 2 derniers . 2
Pour la somme initiale 21112 , le résultat final est 10010 .
Comment ça fonctionne
1 Notez que les chiffres de cette somme ne peuvent pas excéder 3 (valeur initiale 1 plus deux 1 de reports).
2 Ceci fonctionne car le dernier chiffre qui sera annulé ne peut pas être un 3 .
la source
Python 3, 289 octets
Ceci effectue une addition digitale du chiffre le moins significatif au chiffre le plus significatif (en d'autres termes, le même algorithme que celui enseigné à l'école primaire). Les différences sont que (a) c'est en binaire, pas décimal, donc vous portez chaque fois qu'un chiffre est égal à 2 ou plus, et (b)
1 + 1 = 1100
, pas10
.En fait, il faut aussi noter que
11 + 111 = 0
sinon les sommes qui devraient devenir zéro ne se termineront jamais.Plus de golf est sûrement possible.
la source
Retina,
157151134133124123 octets1 byte off grâce à Martin Büttner.
Essayez-le en ligne!
Convertit en unaire, puis répète les remplacements suivants (indiqués ici en décimal):
En gros, quand plus grand que deux: enlevez deux, n'ajoutez rien dans le chiffre précédent, ajoutez un au chiffre précédent, puis ajoutez un au chiffre précédent.
En pseudocode:
Mise en œuvre unaire:
Chaque chiffre (par exemple
3
) est indiqué par le nombre dex
s (par exemplexxx
) et est ensuite précédé de0
.Par exemple,
1234
serait exprimé comme0x0xx0xxx0xxxx
.Cela reste
0
inchangé, comme le101
dirait0x00x
.Depuis le début et enfin, il n'y a que
0
et1
, la conversion pourrait être facilement faite par1->0x
et0x->1
.Cliquez ici pour voir chaque étape .
la source
JavaScript (ES6),
146126 octetsg
convertit un entier gaussien (parties réelles et imaginaires) en basei-1
, tandisr
quei
convertit uni-1
entier de base en un entier gaussien (parties réelle et imaginaire, respectivement). Une fois que les conversions sont en place, il me suffit de faire l’arithmétique.Edit: Sauvegardé 20 octets en calculant les parties réelle et imaginaire séparément.
la source
C ++ 416 octets, plus
#include <vector>\n#include <algorithm>\n
(40 autres)ou, avec plus d'espaces:
À peine golfé. Il prend en entrée un vecteur d'ints et renvoie un vecteur d'ints.
Exemple en direct .
la source