Verrückte, aber rationale Grundlagen


11

Wir haben viele Herausforderungen basierend auf Basis 10, Basis 2, Basis 36 oder sogar Basis -10 , aber was ist mit all den anderen rationalen Basen?

Aufgabe

Geben Sie bei einer Ganzzahl in Basis 10 und einer rationalen Basis die Ganzzahl in dieser Basis zurück (als Array, Zeichenfolge usw.).

Prozess

Es ist schwierig, sich eine rationale Basis vorzustellen. Visualisieren wir sie also mit Exploding Dots :

Betrachten Sie diese Animation und drücken Sie 17 in Basis 3 aus:

Geben Sie hier die Bildbeschreibung ein

Jeder Punkt stellt eine Einheit dar, und Kästchen stellen Ziffern dar: Das Feld ganz rechts ist der Platz eines Menschen, das mittlere Feld ist der Platz 3 ^ 1 und das Feld ganz links ist der Platz 3 ^ 2.

Wir können mit 17 Punkten am eigenen Platz beginnen. Dies ist jedoch Basis 3, daher muss die Einerstelle kleiner als 3 sein. Daher "explodieren" wir 3 Punkte und erstellen einen Punkt auf dem Feld links. Wir wiederholen dies, bis wir eine stabile Position ohne explodierbare Punkte haben (dh 3 Punkte in derselben Box).

17 in Basis 10 ist also 122 in Basis 3.


Eine gebrochene Basis ist analog zum Explodieren einer bestimmten Anzahl von Punkten in mehr als einen Punkt. Basis 3/2 würde 3 Punkte explodieren lassen, um 2 zu erzeugen.

17 in Basis 3/2 ausdrücken:

Geben Sie hier die Bildbeschreibung ein

17 in Basis 10 ist also 21012 in Basis 3/2.


Negative Basen funktionieren ähnlich, aber wir müssen die Zeichen im Auge behalten (unter Verwendung sogenannter Anti-Punkte, gleich -1; dargestellt durch einen offenen Kreis).

17 in Basis -3 ausdrücken:

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass es zusätzliche Explosionen gibt, um das Vorzeichen aller Kästchen gleich zu machen (Nullen werden ignoriert).

Somit ist 17 in Basis 10 212 in Basis -3.

Negative rationale Grundlagen funktionieren in einer Kombination der beiden oben genannten Fälle ähnlich.

Regeln

  • Keine Standardlücken.
  • Das Vorzeichen jeder "Ziffer" in der Ausgabe muss gleich (oder Null) sein.
  • Der Absolutwert aller Ziffern muss kleiner sein als der Absolutwert des Zählers der Basis.
  • Sie können davon ausgehen, dass der Absolutwert der Basis größer als 1 ist.
  • Sie können annehmen, dass eine rationale Basis in ihrer niedrigsten reduzierten Form vorliegt.
  • Sie können den Zähler und den Nenner der Basis separat in der Eingabe verwenden.
  • Wenn eine Zahl mehrere Darstellungen hat, können Sie eine davon ausgeben. (zB 12 in Basis 10 kann {-2, -8}und {1, 9, 2}in Basis -10 sein)

Testfälle:

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}

Da einige Eingaben möglicherweise mehrere Darstellungen haben, empfehle ich, die Ausgabe mit diesem Mathematica-Snippet auf TIO zu testen .

Dies ist , also gewinnen Einsendungen mit kürzesten Bytes in jeder Sprache!


Weitere Informationen zu explodierenden Punkten finden Sie auf der Website des globalen Mathematikprojekts ! Sie haben ein paar coole Mathe-Sachen!


Antworten:


6

Python 2 , 42 39 Bytes

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

Probieren Sie es online aus!

Vielen Dank an @xnor für das Finden der kürzeren Form.

Veraltete Version (42 Bytes):

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

Probieren Sie es online aus!

Parameter: Eingabe, Zähler (mit Vorzeichen) und Nenner.

Gibt ein Array zurück, niedrigste Ziffer zuerst.

Dies funktioniert nur, weil die Division und das Modulo in Python dem Vorzeichen des Nenners folgen, sodass wir uns nicht explizit um dieselben Vorzeichen kümmern müssen.

Testfallausgabe:

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
Ungewöhnlich sieht es so aus, als wäre ein Programm kürzer .
xnor

@xnor Danke, ich vergesse immer so, etwas zu schreiben ...
Bubbler

4

Aheui (Esotop) , 91 Bytes

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

Probieren Sie es online aus!

Nimmt integer, numerator of baseund denominator of base.

Aufgrund der Einschränkung des TIO-Interpreters muss jede Eingabe mit einer neuen Zeile enden.

Implementierung der Python 2-Antwort von @ Bubbler . Glücklicherweise ist dieser Aheui-Interpreter in Python geschrieben, sodass wir denselben Trick anwenden können.


4
o_O was um alles in der Welt ist diese Sprache ... D:
HyperNeutrino

3

05AB1E , 11 10 Bytes

[D_#²‰`,³*

Probieren Sie es online aus!

Nimmt integer, numerator of baseund denominator of basewie alle Antworten. Da der 05AB1E-Interpreter in Python (?) Geschrieben ist, kann der Python 2-Antworttrick von Bubbler auch in 05AB1E verwendet werden.

Erläuterung

[D_ # ² ‰ `, ³ *
[ Endlosschleife
 D_ # Wenn die Zahl 0 ist, beenden Sie die Schleife (implizite Eingabe
                                         in der ersten Iteration)
     ² Holen Sie sich den Zähler der Basis
      ‰ Divmod
       `Schieben Sie alle Elemente in den Stapel
        , Drucken Sie den Rest
         ³ Ermitteln Sie den Nenner der Basis
          * Multipliziere es.

Das Programm funktioniert also ungefähr genauso wie dieser Python-Code:

i1, i2, i3 = input ()
stack = []
während 1:
 stack = (stack oder [i1])
 Stapel + = [Stapel [-1]]
 wenn nicht stapeln [-1]: brechen
 Stapel + = [i2]
 stack = stack [: - 2] + [divmod (stack [-2], stack [-1])]
 Stapel = Stapel [: - 1] + Liste (Stapel [-1])
 Druckstapel [-1]
 stack = stack [: - 1]
 Stapel + = [i3]
 Stapel = Stapel [: - 2] + [Stapel [-2] * Stapel [-1]]

11> 10 Danke Neil


Ich denke, Sie können _anstelle von 0Qhier verwenden.
Neil

@Neil Oh wahr, ich habe den negativen Booleschen Wert vergessen!
Shieru Asakoto
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.