Bases loucas mas racionais

11

Temos muitos desafios baseados nas bases 10, 2, 36 ou até 10 , mas e todas as outras bases racionais?

Tarefa

Dado um número inteiro na base 10 e uma base racional, retorne o número inteiro nessa base (como uma matriz, sequência, etc.).

Processo

É difícil imaginar uma base racional, então vamos visualizá-la usando pontos explosivos :

Considere esta animação, expressando 17 na base 3:

insira a descrição da imagem aqui

Cada ponto representa uma unidade e as caixas representam dígitos: a caixa mais à direita é o lugar da pessoa, a caixa do meio é o lugar 3 ^ 1 e a caixa mais à esquerda é o lugar 3 ^ 2.

Podemos começar com 17 pontos no lugar da pessoa. No entanto, essa é a base 3, portanto, o local deve ser menor que 3. Portanto, "explodimos" 3 pontos e criamos um ponto na caixa à esquerda. Repetimos isso até terminarmos em uma posição estável, sem pontos explosivos (ou seja, 3 pontos na mesma caixa).

Então 17 na base 10 é 122 na base 3.


Uma base fracionária é análoga à explosão de um número de pontos em mais de um ponto. A base 3/2 estaria explodindo 3 pontos para criar 2.

Expressando 17 na base 3/2:

insira a descrição da imagem aqui

Então 17 na base 10 é 21012 na base 3/2.


Bases negativas funcionam da mesma forma, mas devemos acompanhar os sinais (usando os chamados anti-pontos, iguais a -1; representados por um círculo aberto).

Expressando 17 na base -3:

insira a descrição da imagem aqui

Observe que há explosões extras para tornar o sinal de todas as caixas iguais (ignorando zeros).

Assim, 17 na base 10 é 212 na base -3.

Bases racionais negativas funcionam de maneira semelhante, em uma combinação dos dois casos acima.

Regras

  • Sem brechas padrão.
  • O sinal de cada "dígito" na saída deve ser o mesmo (ou zero).
  • O valor absoluto de todos os dígitos deve ser menor que o valor absoluto do numerador da base.
  • Você pode assumir que o valor absoluto da base é maior que 1.
  • Você pode assumir que uma base racional está em sua forma reduzida mais baixa.
  • Você pode levar o numerador e o denominador da base separadamente na entrada.
  • Se um número tiver várias representações, você poderá gerar qualquer uma delas. (por exemplo, 12 na base 10 pode ser {-2, -8}e {1, 9, 2}na base -10)

Casos de teste:

Formato: {in, base} -> result

{7, 4/3}        ->  {3, 3}
{-42, -2}       ->  {1, 0, 1, 0, 1, 0}
{-112, -7/3}    ->  {-6, -5, 0, -1, 0}
{1234, 9/2}     ->  {2, 3, 6, 4, 1}
{60043, -37/3}  ->  {-33, -14, -22, -8}

Como algumas entradas podem ter várias representações, recomendo testar a saída usando esse trecho do Mathematica no TIO.

Isso é ; portanto, envios com contagens de bytes mais curtas em cada idioma ganham!


Para mais informações sobre pontos explosivos, visite o site do projeto global de matemática ! Eles têm um monte de coisas matemáticas legais!

JungHwan Min
fonte
Relacionado
JungHwan Min

Respostas:

6

Python 2 , 42 39 bytes

n,a,b=input()
while n:print n%a;n=n/a*b

Experimente online!

Agradecemos a @xnor por encontrar o formulário mais curto.

Versão obsoleta (42 bytes):

f=lambda n,a,b:n and[n%a]+f(n/a*b,a,b)or[]

Experimente online!

Parâmetros: entrada, numerador (com sinal) e denominador.

Retorna uma matriz, primeiro dígito mais baixo.

Isso simplesmente funciona porque a divisão e o módulo em Python seguem o sinal do denominador, portanto, não precisamos nos preocupar explicitamente com os mesmos sinais.

Saída do caso de teste:

f(7, 4, 3)       == [3, 3]
f(-42, -2, 1)    == [0, -1, -1, -1, -1, -1, -1]
f(-112, -7, 3)   == [0, -1, 0, -5, -6]
f(1234, 9, 2)    == [1, 4, 6, 3, 2]
f(60043, -37, 3) == [-8, -22, -14, -33]
Bubbler
fonte
4
Excepcionalmente, parece que um programa é mais curto .
Xnor
@xnor Obrigado, eu sempre esqueço de que maneira de escrever alguma coisa ...
Bubbler
4

Aheui (esótopo) , 91 bytes

벙수벙섞벙석
희빠챠쌳뻐삭빠빠싻싸삯라망밣밭따맣사나삮빠싸사땨

Experimente online!

Toma integer, numerator of basee denominator of base.

Devido à limitação do intérprete TIO, cada entrada deve terminar com uma nova linha.

Implementação da resposta Python 2 do @ Bubbler . Felizmente, esse intérprete do Aheui é escrito em Python, para que possamos usar o mesmo truque.

JungHwan Min
fonte
4
o_O que na terra é essa linguagem ... D:
HyperNeutrino
3

05AB1E , 11 10 bytes

[D_#²‰`,³*

Experimente online!

Toma integer, numerator of basee denominator of basecomo todas as respostas. Como o intérprete 05AB1E é escrito em Python (?), O truque de resposta do Python 2 do Bubbler também pode ser usado no 05AB1E.

Explicação

[D_ # ² ‰ `, ³ *
[ Loop infinito
 D_ # Se o número for 0, saia do loop (entrada implícita
                                         na primeira iteração)
     ² Obter o numerador da base
      Mod Divmod
       `Empurre todos os elementos para dentro da pilha
        , Imprima o restante
         ³ Obtenha o denominador da base
          * Multiplique.

Portanto, o programa funciona aproximadamente da mesma forma que este código Python:

i1, i2, i3 = entrada ()
pilha = []
enquanto 1:
 pilha = (pilha ou [i1])
 pilha + = [pilha [-1]]
 se não empilhar [-1]: pausa
 pilha + = [i2]
 pilha = pilha [: - 2] + [divmod (pilha [-2], pilha [-1])]
 pilha = pilha [: - 1] + lista (pilha [-1])
 pilha de impressão [-1]
 pilha = pilha [: - 1]
 pilha + = [i3]
 pilha = pilha [: - 2] + [pilha [-2] * pilha [-1]]

11> 10 Obrigado Neil

Shieru Asakoto
fonte
Eu acho que você pode usar em _vez de 0Qaqui.
305 Neil
@ Neil Oh verdade, eu esqueci booleano negativo!
Shieru Asakoto 5/0318