Bases équilibrées:
Les bases équilibrées sont essentiellement les mêmes que les bases normales, sauf que les chiffres peuvent être positifs ou négatifs, tandis que dans les bases normales, les chiffres ne peuvent être que positifs.
A partir de là, les bases équilibrées de la base b
peuvent être représentées comme balb
- donc la base équilibrée 4 = bal4
.
Dans la définition de ce défi, la plage de chiffres dans une base de base équilibrée b
est de -(k - 1)
à b - k
, où
k = ceil(b/2)
Exemples de plage de chiffres dans diverses bases équilibrées:
bal10:
k = ceil(10/2) = 5
range = -(5 - 1) to 10 - 5 = -4 to 5
= -4, -3, -2, -1, 0, 1, 2, 3, 4, 5
bal5:
k = ceil(5/2) = 3
range = -(3 - 1) to 5 - 3 = -2 to 2
= -2, -1, 0, 1, 2
Les représentations des nombres dans les bases équilibrées sont fondamentalement les mêmes que les bases normales. Par exemple, la représentation du nombre 27
(base 10) à bal4
(base équilibrée 4) est 2 -1 -1
, car
2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)
Tâche:
Votre tâche est, compte tenu de trois entrées:
- le nombre à convertir (
n
)- cette entrée peut être flexible, voir "Flexibilité des E / S"
- la base qui
n
est actuellement en (b
) - la base qui
n
doit être convertie en (c
)
O 2 < b, c < 1,000
..
Renvoie le nombre en c
représentation de base équilibrée de n
. La sortie peut également être flexible.
Le programme / fonction doit déterminer la longueur de n
l'entrée elle-même.
Flexibilité d'E / S:
Vos entrées n
et sorties peuvent être représentées de ces manières:
- la définition de votre langue d'un tableau
- une chaîne, avec n'importe quel caractère comme séparateur (par exemple des espaces, des virgules)
Exemples:
Notez que ceux-ci utilisent un tableau Python en tant que n
et la sortie. Vous pouvez utiliser ce qui convient à votre langue, tant qu'il correspond à la définition de la «flexibilité des E / S».
[2, -1, -1] 4 7 = [1, -3, -1]
[1, 2, 3, 4] 9 5 = [1, 2, 2, -1, 2]
[10, -9, 10] 20 5 = [1, 1, 1, -2, 1, 0]
C'est le code-golf , donc le code le plus court en octets gagne!
la source
[1,1,1,-2,1,0]
Réponses:
Mathematica, 85 octets
Explication
Convertir
#1
(1 est implicite - entrée 1, une liste de chiffres) en une base entière#2
(entrée 2).Convertissez l'entier résultant en base
#3
(entrée 3), créant une liste de chiffres.Remplacez à plusieurs reprises la liste des chiffres; si un chiffre est supérieur au plancher (
#3
/ 2), soustrayez-#3
le et ajoutez-le1
au chiffre de gauche. S'il n'y a rien à gauche, insérez a0
et ajoutez1
.la source
{...}
car il n'y a qu'une seule règle de remplacement.p___
. Cela trouve-t-il le plus courtp___
suivi dea_,b_
oub_
, ou vérifie-t-il le modèle entier nécessitant chacun des modèles facultatifs, puis supprime progressivement les modèles facultatifs jusqu'à ce qu'il trouve une correspondance (ou une troisième option)?FixedPointList[k=#3;#/.{p___,a_:0,b_,q___}/;b>⌊k/2⌋:>{p,a+1,b-k,q}&, #~FromDigits~#2~IntegerDigits~#3]&
.{p___,a_,b_,q___}
est mis en correspondance en premier (pour tous les possiblesp
), puis{p___,b_,q___}
est mis en correspondance. Le deuxième remplacement ne s'applique que lorsqueb
est au début, car s'il y a unb
milieu qui satisfait la condition,{p___,a_,b_,q___}
il correspondrait à la place.Perl 6 , 121 octets
Solution de force brute lente.
Comment ça fonctionne:
map {[ .base(c).comb]}, 0..*
- Générez la séquence infinie paresseuse de nombres naturels en basec
, chaque nombre étant représenté par un tableau de chiffres.$_ - ($_ > floor c/2) * c
- Transformez-le en soustrayantc
de chaque chiffre supérieur au plancher (c / 2).first { f(b, n) == f(c, $_) }, ...
- Obtenez le premier tableau de cette séquence qui, lorsqu'il est interprété comme unc
numéro de base , est égal au tableau d'entréen
interprété comme unb
numéro de base .sub f { sum [R,](@^n) Z* ($^b X** 0..*) }
- Fonction d'assistance qui transforme un tableau@^n
en nombre dans la base$^b
, en prenant la somme des produits obtenus en zippant le tableau inversé avec la séquence de puissances de la base.la source
JavaScript (ES6), 89 octets
100 octets fonctionne pour des valeurs négatives de
n
.la source
Mathematica,
118114 octets⌊
et⌋
sont les caractères à 3 octetsU+230A
etU+230B
, respectivement. Convertit#3
en base10
depuis base#2
, puis convertit en base#
(donc l'ordre des arguments est inversé par rapport aux exemples). Si un chiffre est supérieur au chiffre maximal autorisék=⌊#/2⌋
, décrémentez ce chiffre de#
et incrémentez le chiffre suivant (il peut être nécessaire de faire précéder1
). Continuez ainsi jusqu'à ce que tous les chiffres soient inférieurs àk
.la source