Basi pazze ma razionali


11

Abbiamo molte sfide basate su base 10, base 2, base 36 o persino base -10 , ma per quanto riguarda tutte le altre basi razionali?

Compito

Dato un numero intero in base 10 e una base razionale, restituisce il numero intero in quella base (come una matrice, una stringa, ecc.).

Processi

È difficile immaginare una base razionale, quindi visualizziamola usando Exploding Dots :

Considera questa animazione, esprimendo 17 in base 3:

inserisci qui la descrizione dell'immagine

Ogni punto rappresenta un'unità e le caselle rappresentano le cifre: la casella più a destra è il posto di una, la casella centrale è il posto di 3 ^ 1 e la casella più a sinistra è il posto di 3 ^ 2.

Possiamo iniziare con 17 punti al posto di uno. Tuttavia, questa è la base 3, quindi il posto deve essere inferiore a 3. Pertanto, "esplodiamo" 3 punti e creiamo un punto sulla casella a sinistra. Lo ripetiamo fino a quando non finiamo con una posizione stabile senza punti sfruttabili (cioè 3 punti nella stessa casella).

Quindi 17 nella base 10 è 122 nella base 3.


Una base frazionaria è analoga all'esplosione di un numero di punti in più di un punto. Base 3/2 esploderebbe 3 punti per creare 2.

Esprimendo 17 in base 3/2:

inserisci qui la descrizione dell'immagine

Quindi 17 nella base 10 è 21012 nella base 3/2.


Le basi negative funzionano in modo simile, ma dobbiamo tenere traccia dei segni (usando i cosiddetti anti-punti, pari a -1; rappresentato da un cerchio aperto).

Esprimendo 17 in base -3:

inserisci qui la descrizione dell'immagine

Nota, ci sono esplosioni extra per rendere uguale il segno di tutte le caselle (ignorando gli zeri).

Pertanto, 17 nella base 10 è 212 nella base -3.

Le basi razionali negative funzionano in modo simile, in una combinazione dei due casi precedenti.

Regole

  • Nessuna scappatoia standard.
  • Il segno di ogni "cifra" nell'output deve essere lo stesso (o zero).
  • Il valore assoluto di tutte le cifre deve essere inferiore al valore assoluto del numeratore della base.
  • Si può presumere che il valore assoluto della base sia maggiore di 1.
  • Si può presumere che una base razionale sia nella sua forma ridotta più bassa.
  • È possibile prendere il numeratore e il denominatore della base separatamente nell'input.
  • Se un numero ha più rappresentazioni, è possibile emetterne una qualsiasi. (es. 12 nella base 10 può essere {-2, -8}e {1, 9, 2}nella base -10)

Casi test:

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}

Poiché alcuni input possono avere rappresentazioni multiple, ti consiglio di testare l'output usando questo frammento di Mathematica su TIO.

Questo è , quindi vinci gli invii con il numero di byte più breve in ogni lingua!


Per ulteriori informazioni sull'esplosione di punti, visitare il sito Web del progetto di matematica globale ! Hanno un sacco di cose fantastiche di mathy!


Risposte:


6

Python 2 , 42 39 byte

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

Provalo online!

Grazie a @xnor per aver trovato la forma più breve.

Versione obsoleta (42 byte):

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

Provalo online!

Parametri: input, numeratore (con segno) e denominatore.

Restituisce un array, prima la cifra più bassa.

Questo funziona solo perché la divisione e il modulo in Python seguono il segno del denominatore, quindi non dobbiamo preoccuparci esplicitamente degli stessi segni.

Uscita del test case:

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]

4
Insolitamente, sembra che un programma sia più breve .
xnor

@xnor Grazie, ho sempre dimenticato quel modo di scrivere qualcosa ...
Bubbler

4

Aheui (esotopo) , 91 byte

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

Provalo online!

Prende integer, numerator of basee denominator of base.

A causa della limitazione dell'interprete TIO, ogni input deve terminare con una nuova riga.

Implementazione della risposta Python 2 di @ Bubbler . Fortunatamente, questo interprete Aheui è scritto in Python, quindi possiamo usare lo stesso trucco.


4
o_O cosa
diavolo

3

05AB1E , 11 10 byte

[D_#²‰`,³*

Provalo online!

Prende integer, numerator of basee denominator of basecome tutte le risposte. Poiché l'interprete 05AB1E è scritto in Python (?), Il trucco di risposta Python 2 di Bubbler può essere utilizzato anche in 05AB1E.

Spiegazione

[D_ # ² ‰ `, ³ *
[ Ciclo infinito
 D_ # Se il numero è 0, esci dal loop (input implicito
                                         nella prima iterazione)
     ² Ottieni il numeratore della base
      ‰ Divmod
       `Spingi tutti gli elementi nella pila
        , Stampa il resto
         ³ Ottieni il denominatore di base
          * Moltiplicalo.

Quindi il programma funziona più o meno allo stesso modo di questo codice Python:

i1, i2, i3 = input ()
stack = []
mentre 1:
 stack = (stack o [i1])
 stack + = [stack [-1]]
 in caso contrario stack [-1]: break
 stack + = [i2]
 stack = stack [: - 2] + [divmod (stack [-2], stack [-1])]
 stack = stack [: - 1] + list (stack [-1])
 stack di stampa [-1]
 stack = stack [: - 1]
 stack + = [i3]
 stack = stack [: - 2] + [stack [-2] * stack [-1]]

11> 10 Grazie Neil


Penso che tu possa usare al _posto di 0Qqui.
Neil

@Neil Oh vero, mi sono dimenticato del booleano negativo!
Shieru Asakoto,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.