Des bases folles mais rationnelles

11

Nous avons de nombreux défis basés sur la base 10, la base 2, la base 36 ou même la base -10 , mais qu'en est-il de toutes les autres bases rationnelles?

Tâche

Étant donné un entier dans la base 10 et une base rationnelle, renvoyez l'entier dans cette base (sous forme de tableau, de chaîne, etc.).

Processus

Il est difficile d'imaginer une base rationnelle, alors visualisons-la en utilisant Exploding Dots :

Considérez cette animation, exprimant 17 en base 3:

entrez la description de l'image ici

Chaque point représente une unité et les cases représentent des chiffres: la case la plus à droite est la place du un, la case du milieu est la place 3 ^ 1 et la case la plus à gauche est la place 3 ^ 2.

On peut commencer avec 17 points chez soi. Cependant, c'est la base 3, donc la place doit être inférieure à 3. Par conséquent, nous "explosons" 3 points et créons un point sur la boîte à gauche. Nous répétons cela jusqu'à ce que nous nous retrouvions avec une position stable sans points explosibles (c'est-à-dire 3 points dans la même case).

Donc 17 en base 10 est 122 en base 3.


Une base fractionnaire est analogue à l'explosion d'un certain nombre de points en plusieurs points. La base 3/2 exploserait 3 points pour en créer 2.

Exprimant 17 en base 3/2:

entrez la description de l'image ici

Donc 17 en base 10 est 21012 en base 3/2.


Les bases négatives fonctionnent de la même manière, mais nous devons garder une trace des signes (en utilisant des soi-disant anti-points, égaux à -1; représentés par un cercle ouvert).

Exprimant 17 en base -3:

entrez la description de l'image ici

Remarque, il y a des explosions supplémentaires pour rendre le signe de toutes les cases identique (en ignorant les zéros).

Ainsi, 17 en base 10 est 212 en base -3.

Les bases rationnelles négatives fonctionnent de manière similaire, dans une combinaison des deux cas ci-dessus.

Règles

  • Pas de failles standard.
  • Le signe de chaque "chiffre" dans la sortie doit être le même (ou zéro).
  • La valeur absolue de tous les chiffres doit être inférieure à la valeur absolue du numérateur de la base.
  • Vous pouvez supposer que la valeur absolue de la base est supérieure à 1.
  • Vous pouvez supposer qu'une base rationnelle est dans sa forme réduite la plus basse.
  • Vous pouvez prendre le numérateur et le dénominateur de la base séparément dans l'entrée.
  • Si un nombre a plusieurs représentations, vous pouvez sortir n'importe laquelle d'entre elles. (par exemple 12 en base 10 peuvent être {-2, -8}et {1, 9, 2}en base -10)

Cas de test:

Format: {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}

Étant donné que certaines entrées peuvent avoir plusieurs représentations, je recommande de tester la sortie à l'aide de cet extrait Mathematica sur TIO.

Il s'agit de , donc les soumissions avec le plus petit nombre d'octets dans chaque langue gagnent!


Pour plus d'informations sur l'explosion des points, visitez le site Web du projet mathématique mondial ! Ils ont plein de trucs sympas de maths!

JungHwan Min
la source
En relation
JungHwan Min

Réponses:

6

Python 2 , 42 39 octets

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

Essayez-le en ligne!

Merci à @xnor d'avoir trouvé le formulaire le plus court.

Version obsolète (42 octets):

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

Essayez-le en ligne!

Paramètres: entrée, numérateur (avec signe) et dénominateur.

Renvoie un tableau, le chiffre le plus bas en premier.

Cela fonctionne simplement parce que la division et le modulo en Python suivent le signe du dénominateur, nous n'avons donc pas à nous soucier explicitement des mêmes signes.

Sortie du scénario de test:

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
la source
4
Exceptionnellement, il semble qu'un programme soit plus court .
xnor
@xnor Merci, j'oublie toujours cette façon d'écrire quelque chose ...
Bubbler
4

Aheui (ésotope) , 91 octets

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

Essayez-le en ligne!

Prend integer, numerator of baseet denominator of base.

En raison de la limitation de l'interpréteur TIO, chaque entrée doit se terminer par une nouvelle ligne.

Implémentation de la réponse @ Bubbler Python 2 . Heureusement, cet interpréteur Aheui est écrit en Python, nous pouvons donc utiliser la même astuce.

JungHwan Min
la source
4
o_O qu'est-ce que c'est que ce langage ... D:
HyperNeutrino
3

05AB1E , 11 10 octets

[D_#²‰`,³*

Essayez-le en ligne!

Prend integer, numerator of baseet denominator of basecomme toutes les réponses. Comme l'interpréteur 05AB1E est écrit en Python (?), L'astuce de réponse Python 2 de Bubbler peut également être utilisée dans 05AB1E.

Explication

[D_ # ² ‰ `, ³ *
[ Boucle infinie
 D_ # Si le nombre est 0, boucle de sortie (entrée implicite
                                         lors de la première itération)
     ² Obtenez le numérateur de la base
      ‰ Divmod
       `Poussez tous les éléments dans la pile
        , Imprimer le reste
         ³ Obtenez le dénominateur de base
          * Multipliez-le.

Le programme fonctionne donc à peu près de la même manière que ce code Python:

i1, i2, i3 = entrée ()
pile = []
tandis que 1:
 pile = (pile ou [i1])
 pile + = [pile [-1]]
 sinon pile [-1]: break
 pile + = [i2]
 stack = stack [: - 2] + [divmod (stack [-2], stack [-1])]
 stack = stack [: - 1] + list (stack [-1])
 pile d'impression [-1]
 stack = stack [: - 1]
 pile + = [i3]
 stack = stack [: - 2] + [stack [-2] * stack [-1]]

11> 10 Merci Neil

Shieru Asakoto
la source
Je pense que vous pouvez utiliser à la _place d' 0Qici.
Neil
@Neil Oh vrai, j'ai oublié le booléen négatif!
Shieru Asakoto