Bases locas pero racionales

11

Tenemos muchos desafíos basados ​​en la base 10, la base 2, la base 36 o incluso la base -10 , pero ¿qué pasa con todas las otras bases racionales?

Tarea

Dado un número entero en la base 10 y una base racional, devuelve el número entero en esa base (como una matriz, cadena, etc.).

Proceso

Es difícil imaginar una base racional, así que visualicémosla usando puntos de explosión :

Considere esta animación, que expresa 17 en la base 3:

ingrese la descripción de la imagen aquí

Cada punto representa una unidad, y los cuadros representan dígitos: el cuadro más a la derecha es el lugar de uno, el cuadro del medio es el lugar 3 ^ 1, y el cuadro más a la izquierda es el lugar 3 ^ 2.

Podemos comenzar con 17 puntos en el lugar de uno. Sin embargo, esta es la base 3, por lo que el lugar de las unidades debe ser menor que 3. Por lo tanto, "explotamos" 3 puntos y creamos un punto en el cuadro a la izquierda. Repetimos esto hasta que terminemos con una posición estable sin puntos explotables (es decir, 3 puntos en el mismo cuadro).

Entonces 17 en la base 10 es 122 en la base 3.


Una base fraccional es análoga a la explosión de cierto número de puntos en más de un punto. Base 3/2 estaría explotando 3 puntos para crear 2.

Expresando 17 en base 3/2:

ingrese la descripción de la imagen aquí

Entonces 17 en la base 10 es 21012 en la base 3/2.


Las bases negativas funcionan de manera similar, pero debemos hacer un seguimiento de los signos (usando los llamados antidotos, igual a -1; representado por un círculo abierto).

Expresando 17 en base -3:

ingrese la descripción de la imagen aquí

Tenga en cuenta que hay explosiones adicionales para que el signo de todas las cajas sea el mismo (ignorando los ceros).

Por lo tanto, 17 en la base 10 es 212 en la base -3.

Las bases racionales negativas funcionan de manera similar, en una combinación de los dos casos anteriores.

Reglas

  • No hay lagunas estándar.
  • El signo de cada "dígito" en la salida debe ser el mismo (o cero).
  • El valor absoluto de todos los dígitos debe ser menor que el valor absoluto del numerador de la base.
  • Puede suponer que el valor absoluto de la base es mayor que 1.
  • Puede suponer que una base racional está en su forma reducida más baja.
  • Puede tomar el numerador y el denominador de la base por separado en la entrada.
  • Si un número tiene múltiples representaciones, puede generar cualquiera de ellas. (por ejemplo, 12 en base 10 pueden ser {-2, -8}y {1, 9, 2}en base -10)

Casos de prueba:

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}

Dado que algunas entradas pueden tener múltiples representaciones, recomiendo probar la salida usando este fragmento de Mathematica en TIO.

Este es el , por lo que las presentaciones con el menor número de bytes en cada idioma ganan


Para obtener más información sobre puntos explosivos, visite el sitio web del proyecto global de matemáticas . ¡Tienen un montón de cosas geniales!

JungHwan Min
fuente
Relacionado
JungHwan Min

Respuestas:

6

Python 2 , 42 39 bytes

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

Pruébalo en línea!

Gracias a @xnor por encontrar la forma más corta.

Versión obsoleta (42 bytes):

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

Pruébalo en línea!

Parámetros: entrada, numerador (con signo) y denominador.

Devuelve una matriz, el dígito más bajo primero.

Esto simplemente funciona porque la división y el módulo en Python siguen el signo del denominador, por lo que no tenemos que preocuparnos por los mismos signos explícitamente.

Salida de caso de prueba:

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
fuente
44
Inusualmente, parece que un programa es más corto .
xnor
@xnor Gracias, siempre olvido esa forma de escribir algo ...
Bubbler el
4

Aheui (esótopo) , 91 bytes

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

Pruébalo en línea!

Toma integer, numerator of basey denominator of base.

Debido a la limitación del intérprete TIO, cada entrada debe terminar con una nueva línea.

Implementación de la respuesta de @ Bubbler's Python 2 . Afortunadamente, este intérprete de Aheui está escrito en Python, por lo que podemos usar el mismo truco.

JungHwan Min
fuente
44
o_O qué demonios es este lenguaje ... D:
HyperNeutrino
3

05AB1E , 11 10 bytes

[D_#²‰`,³*

Pruébalo en línea!

Toma integer, numerator of basey denominator of basecomo todas las respuestas. Como el intérprete 05AB1E está escrito en Python (?), El truco de respuesta de Bubbler Python 2 también se puede utilizar en 05AB1E.

Explicación

[D_ # ² ‰ `, ³ *
[ Bucle infinito
 D_ # Si el número es 0, salga del bucle (entrada implícita
                                         en la primera iteración)
     ² Obtener el numerador de base
      ‰ Divmod
       `Empuja todos los elementos en la pila
        Imprima el resto
         ³ Obtenga el denominador de base
          * Multiplicalo.

Entonces, el programa funciona más o menos igual que este código Python:

i1, i2, i3 = input ()
pila = []
mientras que 1:
 pila = (pila o [i1])
 pila + = [pila [-1]]
 si no se apila [-1]: descanso
 apilar + = [i2]
 pila = pila [: - 2] + [divmod (pila [-2], pila [-1])]
 pila = pila [: - 1] + lista (pila [-1])
 pila de impresión [-1]
 pila = pila [: - 1]
 apilar + = [i3]
 pila = pila [: - 2] + [pila [-2] * pila [-1]]

11> 10 Gracias Neil

Shieru Asakoto
fuente
Creo que puedes usar en _lugar de 0Qaquí.
Neil
@Neil ¡Oh cierto, me olvidé del booleano negativo!
Shieru Asakoto