Bases balanceadas:
As bases equilibradas são essencialmente as mesmas que as bases normais, exceto que os dígitos podem ser positivos ou negativos, enquanto nas bases normais os dígitos podem ser apenas positivos.
Daqui em diante, bases balanceadas de base b
podem ser representadas como balb
- base balanceada 4 = bal4
.
Na definição deste desafio, a gama de dígitos em uma base equilibrada da base b
é de -(k - 1)
que b - k
, onde
k = ceil(b/2)
Exemplos do intervalo de dígitos em várias 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
As representações de números em bases balanceadas são basicamente as mesmas que as bases normais. Por exemplo, a representação do número 27
(base 10) a bal4
(base balanceada 4) é 2 -1 -1
porque
2 -1 -1 (bal4)
= 2 * 4^2 + -1 * 4 + -1 * 1
= 32 + (-4) + (-1)
= 27 (base 10)
Tarefa:
Sua tarefa é, com três entradas:
- o número a ser convertido (
n
)- essa entrada pode ser flexível, consulte "Flexibilidade de E / S"
- a base que
n
está atualmente em (b
) - a base que
n
deve ser convertida em (c
)
Onde 2 < b, c < 1,000
.
Retorne o número na c
representação base balanceada de n
. A saída também pode ser flexível.
O programa / função deve determinar o comprimento da n
própria entrada.
Flexibilidade de E / S:
Sua entrada n
e saída podem ser representadas das seguintes maneiras:
- a definição de matriz de seu idioma
- uma string, com qualquer caractere como separador (por exemplo, espaços, vírgulas)
Exemplos:
Observe que eles usam uma matriz Python como n
e a saída. Você pode usar o que for adequado ao seu idioma, desde que ele se enquadre na definição de "I / O Flexibility".
[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]
Isso é código-golfe , então o código mais curto em bytes vence!
fonte
[1,1,1,-2,1,0]
Respostas:
Mathematica, 85 bytes
Explicação
Converter
#1
(1 está implícito - entrada 1, uma lista de dígitos) em uma base inteira#2
(entrada 2).Converta o número inteiro resultante em base
#3
(entrada 3), criando uma lista de dígitos.Substitua repetidamente a lista de dígitos; se um dígito for maior que o piso (
#3
/ 2), subtraia#3
e adicione1
ao dígito à esquerda. Se não houver nada à esquerda, insira ae0
adicione1
.fonte
{...}
pois existe apenas uma regra de substituição.p___
. Isso encontra o mais curtop___
seguido por uma_,b_
oub_
, ou verifica todo o padrão que requer cada um dos padrões opcionais e depois elimina progressivamente os padrões opcionais até encontrar uma correspondência (ou alguma terceira opção)?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___}
é correspondido primeiro (para todos os possíveisp
) e depois{p___,b_,q___}
é correspondido. A segunda substituição se aplica apenas quandob
está no início, porque se houver umab
no meio que satisfaça a condição,{p___,a_,b_,q___}
ela corresponderá a ela.Perl 6 , 121 bytes
Solução lenta de força bruta.
Como funciona:
map {[ .base(c).comb]}, 0..*
- Gere a sequência infinita lenta de números naturais na basec
, com cada número representado como uma matriz de dígitos.$_ - ($_ > floor c/2) * c
- Transforme-o subtraindoc
de cada dígito maior que o piso (c / 2).first { f(b, n) == f(c, $_) }, ...
- Obtenha a primeira matriz dessa sequência que, quando interpretada como umc
número base , é igual à matriz de entradan
interpretada como umb
número base .sub f { sum [R,](@^n) Z* ($^b X** 0..*) }
- Função auxiliar que transforma uma matriz@^n
em um número na base$^b
, calculando a soma dos produtos produzidos fechando a matriz invertida com a sequência de potências da base.fonte
JavaScript (ES6), 89 bytes
100 bytes funciona para valores negativos de
n
.fonte
Mathematica,
118114 bytes⌊
e⌋
são os caracteres de 3 bytesU+230A
eU+230B
, respectivamente. Converte#3
em base a10
partir de base#2
e depois em base#
(portanto, a ordem dos argumentos é revertida nos exemplos). Se qualquer dígito for maior que o dígito máximo permitidok=⌊#/2⌋
, diminua esse dígito#
e aumente o próximo dígito para cima (pode ser necessário adicionar previamente1
). Continue fazendo isso até que todos os dígitos sejam menores quek
.fonte