¡Convierte entre bases equilibradas!

13

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 bpueden 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 bes 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 nencuentra actualmente en ( b)
  • la base que nse convertirá a ( c)

Donde 2 < b, c < 1,000.

Devuelve el número en crepresentación base equilibrada de n. La salida también puede ser flexible.

El programa / función debe determinar la longitud de nla entrada en sí.

Flexibilidad de E / S:

Su entrada ny 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 ny 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 , por lo que gana el código más corto en bytes.

clismique
fuente
En su primera respuesta, 4 no es un dígito bal7 legal; Creo que la respuesta debería ser [1, -3, -1]. ¿Y obtengo diferentes respuestas para el segundo caso de prueba ([1,2,2, -1,2]) y el tercer caso de prueba ([1,1,0, -2,1,0]) también ...?
Greg Martin el
@ GregMartin Ah, ¡vaya! Los calculé a mano, así que seguramente habría algunos problemas. ¡Gracias por notarlo! ¿Puede verificar sus soluciones, por si acaso?
clismique
@GregMartin @ Qwerp-Derp El tercer caso de prueba es[1,1,1,-2,1,0]
ngenisis

Respuestas:

2

Mathematica, 85 bytes

#~FromDigits~#2~IntegerDigits~#3//.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}&

Explicación

#~FromDigits~#2

Convierta #1(1 está implícito - entrada 1, una lista de dígitos) en una base entera #2(entrada 2).

... ~IntegerDigits~#3

Convierta el entero resultante en base #3(entrada 3), creando una lista de dígitos.

... //.{p___,a_:0,b_,q___}/;b>⌊#3/2⌋:>{p,a+1,b-#3,q}

Reemplazar repetidamente la lista de dígitos; si un dígito es mayor que el piso ( #3/ 2), reste #3de él y sume 1al dígito a la izquierda. Si no hay nada a la izquierda, inserte ay 0agregue 1.

JungHwan Min
fuente
Por lo general, se recomienda hablar un poco sobre su solución y explicarla a las personas que pueden no conocer Mathematica.
ATaco
@ATaco ¡Explicación añadida!
JungHwan Min
Estoy un poco desconcertado por esto. Nunca he visto patrones opcionales utilizados en otro lugar que no sean definiciones de funciones. No necesita el exterior {...}ya que solo hay una regla de reemplazo.
ngenisis
1
@JungHwanMin Cierto, supongo que lo que me confunde es cómo afecta esto al partido p___. ¿Encuentra esto el más corto p___seguido de uno a_,b_o b_, 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)?
ngenisis
1
@ngenisis Creo que me equivoqué en el comentario anterior (eliminado), observando el resultado de 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 posibles p), y luego {p___,b_,q___}se hace coincidir. El segundo reemplazo solo se aplica cuando bestá al principio porque si hay un ben el medio que satisface la condición, en {p___,a_,b_,q___}su lugar lo igualará.
JungHwan Min
1

Perl 6 , 121 bytes

->\n,\b,\c{sub f{sum [R,](@^n)Z*($^b X**0..*)}
first {f(b,n)==f c,$_},map {[$_-($_>floor c/2)*c for .base(c).comb]},0..*}

Solución de fuerza bruta lenta.

Cómo funciona:

  • map {[ .base(c).comb]}, 0..*- Genere la secuencia infinita perezosa de números naturales en base c, con cada número representado como una matriz de dígitos.
  • $_ - ($_ > floor c/2) * c - Transfórmalo restando c 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 un cnúmero base , es igual a la matriz de entrada ninterpretada como una baseb número .
  • sub f { sum [R,](@^n) Z* ($^b X** 0..*) }- Función auxiliar que convierte una matriz @^nen 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.
smls
fuente
1

JavaScript (ES6), 89 bytes

(n,b,c,g=(n,d=n%c,e=d+d<c)=>[...(n=n/c+!e|0)?g(n):[],e?d:d-c])=>g(n.reduce((r,d)=>r*b+d))

100 bytes funciona para valores negativos de n.

(n,b,c,g=(n,d=(n%c+c)%c)=>[...(n-=d,n/=c,d+d<c||(d-=c,++n),n?g(n):[]),d])=>g(n.reduce((r,d)=>r*b+d))
Neil
fuente
0

Mathematica, 118114 bytes

IntegerDigits[#3~FromDigits~#2,k=⌊#/2⌋;#]//.{{a_,x___}/;a>k:>{1,a-#,x},{x___,a_,b_,y___}/;b>k:>{x,a+1,b-#,y}}&

y son los caracteres de 3 bytes U+230Ay U+230B, respectivamente. Convierte #3a base 10de 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 permitido k=⌊#/2⌋, disminuya ese dígito #e incremente el siguiente dígito hacia arriba (puede que tenga que anteponerse 1). Siga haciendo esto hasta que todos los dígitos sean menores que k.

ngenisis
fuente