Bases equilibradas:
Las bases equilibradas son esencialmente las mismas que las bases normales, excepto que los dígitos pueden ser positivos o negativos, mientras que en las bases normales los dígitos solo pueden ser positivos.
A partir de aquí, las bases de equilibrado de la base b
pueden ser representados como balb
- por lo equilibrado de base 4 = bal4
.
En la definición de este desafío, el rango de dígitos en una base de base equilibrada b
es de -(k - 1)
a b - k
, donde
k = ceil(b/2)
Ejemplos del rango de dígitos en varias bases balanceadas:
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
Las representaciones de números en bases balanceadas son básicamente las mismas que las bases normales. Por ejemplo, la representación del número 27
(base 10) a bal4
(base equilibrada 4) es 2 -1 -1
, porque
2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)
Tarea:
Su tarea es, dado tres entradas:
- el número a convertir (
n
)- esta entrada puede ser flexible, consulte "Flexibilidad de E / S"
- la base que se
n
encuentra actualmente en (b
) - la base que
n
se convertirá a (c
)
Donde 2 < b, c < 1,000
.
Devuelve el número en c
representación base equilibrada de n
. La salida también puede ser flexible.
El programa / función debe determinar la longitud de n
la entrada en sí.
Flexibilidad de E / S:
Su entrada n
y salida se pueden representar de estas maneras:
- la definición de su idioma de una matriz
- una cadena, con cualquier carácter como separador (por ejemplo, espacios, comas)
Ejemplos:
Tenga en cuenta que estos usan una matriz Python como n
y la salida. Puede usar lo que se ajuste a su idioma, siempre que se ajuste a la definición de "Flexibilidad de 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]
Este es el código de golf , por lo que gana el código más corto en bytes.
fuente
[1,1,1,-2,1,0]
Respuestas:
Mathematica, 85 bytes
Explicación
Convierta
#1
(1 está implícito - entrada 1, una lista de dígitos) en una base entera#2
(entrada 2).Convierta el entero resultante en base
#3
(entrada 3), creando una lista de dígitos.Reemplazar repetidamente la lista de dígitos; si un dígito es mayor que el piso (
#3
/ 2), reste#3
de él y sume1
al dígito a la izquierda. Si no hay nada a la izquierda, inserte ay0
agregue1
.fuente
{...}
ya que solo hay una regla de reemplazo.p___
. ¿Encuentra esto el más cortop___
seguido de unoa_,b_
ob_
, o verifica todo el patrón que requiere cada uno de los patrones opcionales y luego elimina progresivamente los patrones opcionales hasta que encuentra una coincidencia (o alguna tercera opción)?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___}
se compara primero (para todos los posiblesp
), y luego{p___,b_,q___}
se hace coincidir. El segundo reemplazo solo se aplica cuandob
está al principio porque si hay unb
en el medio que satisface la condición, en{p___,a_,b_,q___}
su lugar lo igualará.Perl 6 , 121 bytes
Solución de fuerza bruta lenta.
Cómo funciona:
map {[ .base(c).comb]}, 0..*
- Genere la secuencia infinita perezosa de números naturales en basec
, con cada número representado como una matriz de dígitos.$_ - ($_ > floor c/2) * c
- Transfórmalo restandoc
de cada dígito que sea mayor que el piso (c / 2).first { f(b, n) == f(c, $_) }, ...
- Obtenga la primera matriz de esa secuencia que, cuando se interpreta como unc
número base , es igual a la matriz de entradan
interpretada como una baseb
número .sub f { sum [R,](@^n) Z* ($^b X** 0..*) }
- Función auxiliar que convierte una matriz@^n
en un número en base$^b
, al tomar la suma de los productos producidos al comprimir la matriz invertida con la secuencia de potencias de la base.fuente
JavaScript (ES6), 89 bytes
100 bytes funciona para valores negativos de
n
.fuente
Mathematica,
118114bytes⌊
y⌋
son los caracteres de 3 bytesU+230A
yU+230B
, respectivamente. Convierte#3
a base10
de base#2
, luego convierte a base#
(por lo que el orden de los argumentos se invierte de los ejemplos). Si algún dígito es mayor que el dígito máximo permitidok=⌊#/2⌋
, disminuya ese dígito#
e incremente el siguiente dígito hacia arriba (puede que tenga que anteponerse1
). Siga haciendo esto hasta que todos los dígitos sean menores quek
.fuente