Szalone, ale racjonalne podstawy

11

Mamy wiele wyzwań w oparciu o bazę 10, bazę 2, bazę 36, a nawet bazę -10 , ale co z wszystkimi innymi racjonalnymi bazami?

Zadanie

Biorąc pod uwagę liczbę całkowitą w podstawie 10 i bazę wymierną, zwróć liczbę całkowitą w tej podstawie (jako tablicę, łańcuch itp.).

Proces

Trudno wyobrazić sobie racjonalną bazę, więc wyobraźmy ją sobie za pomocą Exploding Dots :

Rozważ tę animację, wyrażając 17 w bazie 3:

wprowadź opis zdjęcia tutaj

Każda kropka reprezentuje jednostkę, a pola reprezentują cyfry: skrajne pole po prawej to miejsce jednego, pole środkowe to miejsce 3 ^ 1, a skrajne pole po lewej to 3 ^ 2.

Możemy zacząć od 17 kropek w jednym miejscu. Jest to jednak podstawa 3, więc miejsce musi być mniejsze niż 3. Dlatego „eksplodujemy” 3 kropki i tworzymy kropkę na polu po lewej stronie. Powtarzamy to, dopóki nie osiągniemy stabilnej pozycji bez punktów wybuchowych (tj. 3 kropki w tym samym polu).

Zatem 17 w podstawie 10 wynosi 122 w podstawie 3.


Podstawa ułamkowa jest analogiczna do rozbijania pewnej liczby kropek na więcej niż jedną kropkę. Baza 3/2 eksplodowałaby 3 kropkami, tworząc 2.

Wyrażanie 17 w bazie 3/2:

wprowadź opis zdjęcia tutaj

Zatem 17 w podstawie 10 to 21012 w podstawie 3/2.


Zasady ujemne działają podobnie, ale musimy śledzić znaki (używając tak zwanych anty-kropek, równych -1; reprezentowanych przez otwarte koło).

Wyrażanie 17 w bazie -3:

wprowadź opis zdjęcia tutaj

Uwaga: istnieją dodatkowe eksplozje, aby znak wszystkich pól był taki sam (ignorując zera).

Zatem 17 w podstawie 10 wynosi 212 w podstawie -3.

Negatywne racjonalne podstawy działają podobnie, w kombinacji dwóch powyższych przypadków.

Zasady

  • Brak standardowych luk.
  • Znak każdej „cyfry” na wyjściu musi być taki sam (lub zero).
  • Wartość bezwzględna wszystkich cyfr musi być mniejsza niż wartość bezwzględna licznika podstawy.
  • Możesz założyć, że wartość bezwzględna podstawy jest większa niż 1.
  • Możesz założyć, że racjonalna podstawa jest w najniższej zredukowanej formie.
  • Możesz wziąć licznik i mianownik podstawy osobno na wejściu.
  • Jeśli liczba ma wiele reprezentacji, możesz wypisać dowolną z nich. (przykład 12 w bazie 10 można {-2, -8}i {1, 9, 2}w bazie -10)

Przypadki testowe:

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}

Ponieważ niektóre dane wejściowe mogą mieć wiele reprezentacji, zalecam testowanie danych wyjściowych przy użyciu tego fragmentu kodu Mathematica w TIO.

To jest , więc wygrane z najkrótszą liczbą bajtów w każdym języku wygrywają!


Aby uzyskać więcej informacji na temat eksplodujących kropek, odwiedź stronę globalnego projektu matematycznego ! Mają mnóstwo fajnych rzeczy matematycznych!

JungHwan Min
źródło
Powiązane
JungHwan Min

Odpowiedzi:

6

Python 2 , 42 39 bajtów

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

Wypróbuj online!

Dzięki @xnor za znalezienie krótszej formy.

Przestarzała wersja (42 bajty):

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

Wypróbuj online!

Parametry: wejście, licznik (ze znakiem) i mianownik.

Zwraca tablicę, zaczynając od najniższej cyfry.

To po prostu działa, ponieważ podział i modulo w Pythonie podąża za znakiem mianownika, więc nie musimy wyraźnie przejmować się tymi samymi znakami.

Dane wyjściowe przypadku testowego:

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
źródło
4
Niezwykle wygląda na to, że program jest krótszy .
xnor
@xnor Dzięki, zawsze zapominam w ten sposób, aby coś napisać ...
Bubbler,
4

Aheui (esotop) , 91 bajtów

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

Wypróbuj online!

Trwa integer, numerator of baseidenominator of base .

Ze względu na ograniczenia interpretera TIO każde wejście musi kończyć się nową linią.

Implementacja odpowiedzi na pytanie Python 2 w Bubbler . Na szczęście ten interpretator Aheui jest napisany w Pythonie, więc możemy użyć tej samej sztuczki.

JungHwan Min
źródło
4
o_O, co u licha jest ten język ... D:
HyperNeutrino
3

05AB1E , 11 10 bajtów

[D_#²‰`,³*

Wypróbuj online!

Trwa integer, numerator of basei denominator of basejak wszystkie odpowiedzi. Ponieważ interpreter 05AB1E jest napisany w Pythonie (?), Sztuczka odpowiedzi w Pythonie 2 w Bubbler może być również używana w 05AB1E.

Wyjaśnienie

[D_ # ² ‰ `, ³ *
[ Nieskończona pętla
 D_ # Jeśli liczba wynosi 0, wyjdź z pętli (niejawne wejście
                                         w pierwszej iteracji)
     ² Pobierz licznik podstawy
      ‰ Divmod
       `Wciśnij wszystkie elementy na stos
        , Wydrukuj resztę
         ³ Uzyskaj mianownik podstawy
          * Pomnóż to.

Więc program działa mniej więcej tak samo jak ten kod Pythona:

i1, i2, i3 = input ()
stos = []
podczas gdy 1:
 stos = (stos lub [i1])
 stos + = [stos [-1]]
 jeśli nie stos [-1]: przerwa
 stos + = [i2]
 stos = stos [: - 2] + [divmod (stos [-2], stos [-1])]
 stos = stos [: - 1] + lista (stos [-1])
 stos wydruku [-1]
 stos = stos [: - 1]
 stos + = [i3]
 stos = stos [: - 2] + [stos [-2] * stos [-1]]

11> 10 Dzięki Neil

Shieru Asakoto
źródło
Myślę, że możesz użyć _zamiast 0Qtutaj.
Neil
@Neil O, prawda, zapomniałem o negatywnej wartości logicznej!
Shieru Asakoto