Le défi
Étant donné 3 nombres X
, Y
et Z
en base B
, trouvez un B
as dans lequel l'addition de X
et Y
donne Z
. Les intrants x = 20
, Y = 12
et Z = 32
pourraient céder 5
car 20 + 12 = 32
en base 5.
- Vous pouvez supposer qu'il y aura toujours une base dans laquelle l'addition est correcte (il y a des cas où aucune base n'existe, grâce à @ MasonWheeler et @ Not that Charles pour quelques exemples).
- La base la plus basse possible est 1. Vous pouvez utiliser 1 ou 0 comme chiffres en unaire, mais vous ne pouvez pas les mélanger.
E / S
- Les chiffres des nombres saisis seront des entiers non négatifs.
- Vous pouvez supposer que les numéros d'entrée contiennent des zéros en tête, donc ils ont une longueur spécifique (ou tout de même).
- Vous pouvez prendre les chiffres dans le format le plus pratique, tant qu'il n'est pas prétraité. Cela comprend le format général des trois numéros d'entrée et le format des chiffres de chacun de ces numéros. Veuillez indiquer clairement le format que vous utilisez.
- S'il existe plusieurs bases possibles, vous pouvez générer toutes ou une seule d'entre elles.
- Vous pouvez supposer que la base et les numéros d'entrée seront dans les limites numériques de votre langue.
Règles
- Fonction ou programme complet autorisé.
- Règles par défaut pour les entrées / sorties.
- Des échappatoires standard s'appliquent.
- Il s'agit de code-golf , donc le nombre d'octets le plus bas l'emporte. Tiebreaker est une soumission antérieure.
Cas de test
Le format d'entrée est ici une liste d'entiers pour représenter chaque nombre. Les trois listes sont séparées par des virgules.
Notez qu'il existe parfois plusieurs bases possibles. Une seule solution (aléatoire) est sortie ici.
[12, 103], [4, 101], [16, 204] -> 349 [4, 21, 25], [5, 1, 20], [9, 23, 17] -> 28 [16, 11], [25, 94], [41, 105] -> 147 [2, 140], [21, 183], [24, 100] -> 223 [8, 157], [1, 28], [9, 185] -> 227 [2, 158], [88], [3, 12] -> 234 [8, 199], [1, 34], [9, 233] -> 408 [3, 247], [7, 438], [11, 221] -> 464 [3, 122], [3, 2], [6, 124] -> 480 [6, 328], [3, 31], [9, 359] -> 465 [2, 1, 0, 0, 0, 0], [1, 2, 0, 0, 1, 0, 1, 0], [1, 2, 2, 1, 1, 0, 1, 0] - > 3 [16, 105], [16, 120], [33, 84] -> 141 [15, 60], [9, 30], [24, 90] -> 268 [2, 0], [1, 2], [3, 2] -> 5 [1, 3, 3, 7], [1, 2, 3], [1, 4, 6, 0] -> 10 [0], [1, 12, 8], [1, 12, 8] -> 16 [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1], [1, 0, 0, 1, 0, 1, 1, 1, 0, 0 , 1], [1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0] -> 2 [1], [1], [1,1] -> 1
Vous pouvez générer des cas de test supplémentaires avec ce programme Pyth . Entrez une base sur la première ligne et les valeurs décimales pour X
et Y
sur les deux lignes suivantes.
Vous pouvez également utiliser ce programme Pyth pour créer plusieurs cas de test à la fois en utilisant des valeurs aléatoires. Entrez simplement la quantité souhaitée de cas de test dans l'entrée.
Codage heureux!
Réponses:
Gelée,
16117 octetsCette approche est fortement basée sur la réponse Octave de @ beaker .
Le format d'entrée est Z, Y, X , avec un ordre de chiffres en petit bout, en utilisant le chiffre 0 pour unaire.
Essayez-le en ligne! ou exécutez tous les cas de test .
Comment ça fonctionne
Plutôt que de tester de manière incrémentielle des bases potentielles, cela résout le polynôme qui correspond à la matrice P: = X + Y - Z . Cela renvoie soit le plus grand coefficient de P ≠ 0 - qui doit être une racine, car il existe au moins une base valide - soit le chiffre le plus élevé de X , Y et Z , incrémenté de 1 .
la source
Pyth, 13 octets
Attend Z, suivi de X et Y.
Suite de tests
Essentiellement, nous testons chaque base possible, en commençant à un de plus que le plus grand chiffre. Le test consiste à convertir chaque nombre en la base en question, puis à replier la soustraction sur les nombres et à annuler logiquement le résultat.
la source
Octave,
67753832 octetsParce que "boucler sur TOUTES les choses", c'est trop de travail.
Nécessite 0 padding pour rendre les tableaux d'entrée de la même taille, par exemple:
Depuis
0
est utilisé pour le remplissage,1
est utilisé comme jeton pour unaire.(Merci à @DenkerAffe pour la clarification de la question.)
Exemple de run sur ideone .
Brève explication:
Prenez un cas impliquant aucun portage:
Dans ce cas, il n'y a aucune restriction sur la base tant qu'elle est supérieure à n'importe quel "chiffre". Prenez simplement l'élément max de
z
(asz >= x,y
) et ajoutez 1 (ou tout entier positif).Dans le cas d'un report (sans report), nous avons dépassé la base dans l'une des colonnes et la différence entre
x+y
etz
est la base:Si la somme de la deuxième colonne dépassait également la base, nécessitant un report ainsi que le report, sa valeur serait
base+(-1)
. Nous aurons eu une colonne quelque part à droite avec un report et aucun report qui a la valeur de base correcte (supérieure).la source
Haskell,
9073 octetsExemple d'utilisation:
f [[3, 247],[7, 438],[11, 221]]
->464
.Essayez simplement toutes les bases
b
(oùb
est supérieur au maximum des chiffres). Choisissez le premier oùx+y==z
.Edit: @xnor a sauvé de nombreux octets en se débarrassant principalement du
import Data.Digits
.la source
unDigits b
fait ce que je pense, il devrait être plus court à mettre en œuvre commefoldl(\x y->b*x+y)0
ou de manière équivalentefoldl((+).(b*))0
.maximum
après aplatissement:b<-[1+(maximum$id=<<l)..]
.maximum
asb<-[1..],all(<b)$id=<<l
.d
d'unb
numéro de base ne devraient-ils pas l' être0 <= d < b
, donc pour la base,1
le seul chiffre possible est0
?f [[0],[0],[0,0]]
évalue à1
.MATL , 20 octets
L'entrée est au format (notez les accolades extérieures):
Cela fonctionne dans la version actuelle (15.0.0) .
Essayez-le en ligne!
Explication
la source
MATL,
1312 octetsTraduction de ma réponse Octave en MATL. (Ma première réponse MATL!)
Z, X, Y
(ouZ, Y, X
si vous préférez, je suis facile)Essayez-le en ligne!
Explication
la source