Mieliśmy kilka wyzwań związanych z konwersją podstawową, ale wszystkie wydają się mieć zastosowanie do wartości całkowitych. Zróbmy to z liczbami rzeczywistymi!
Wyzwanie
Wejścia:
- Rzeczywista liczba dodatnia x , wyrażona w podstawie 10. Można to przyjąć jako zmiennoprzecinkowe podwójnej precyzji lub jako ciąg. Aby uniknąć problemów z precyzją, można założyć, że liczba ta jest większa niż 10 -6 i mniejsza niż 10 15 .
- Podstawy cel b . Będzie to liczba całkowita od 2 do 36.
- Liczbę ułamkową cyfr n . Będzie to liczba całkowita od 1 do 20.
Komunikat: przedstawienie z X bazy B, z n cyfr dziesiętnych.
Podczas obliczania wyrażenia wyjściowego cyfry poza n-tą powinny zostać obcięte (nie zaokrąglone). Na przykład x = 3.141592653589793
w bazie b = 3
jest 10.0102110122...
, więc dla n = 3
danych wyjściowych byłoby 10.010
(obcięcie), a nie 10.011
(zaokrąglenie).
Dla x i b, które tworzą skończoną liczbę cyfr w części ułamkowej, dozwolona jest również równoważna nieskończona reprezentacja (obcięta do n cyfr). Na przykład 4.5
w systemie dziesiętnym można również przedstawić jako 4.49999...
.
Nie martw się błędami zmiennoprzecinkowymi .
Format wejściowy i wyjściowy
x będzie podane bez zer wiodących. Jeśli x jest liczbą całkowitą, możesz założyć, że zostanie podana z zerową częścią dziesiętną ( 3.0
) lub bez części dziesiętnej ( 3
).
Dane wyjściowe są elastyczne. Na przykład może to być:
- Ciąg reprezentujący liczbę z odpowiednim separatorem (kropka dziesiętna) między częściami całkowitymi i ułamkowymi. Cyfry
11
,12
etc (dla b poza 10) można przedstawić jako literyA
,B
jak zwykle, lub jakichkolwiek innych wyraźnych znaków (proszę określić). - Ciąg dla części całkowitej i kolejny ciąg dla części ułamkowej.
- Dwie tablice / listy, po jednej dla każdej części, zawierające liczby od
0
do35
jako cyfry.
Jedynymi ograniczeniami są to, że części całkowite i ułamkowe można rozdzielić (odpowiedni separator) i użyć tego samego formatu (na przykład nie [5, 11]
dla listy reprezentującej część całkowitą i ['5', 'B']
dla listy reprezentującej część ułamkową).
Dodatkowe zasady
- Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
- Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Wyjście jest pokazany jako ciąg cyfr z 0
, ..., 9
, A
, ..., Z
, używając .
jako separatora dziesiętnego.
x, b, n -> output(s)
4.5, 10, 5 -> 4.50000 or 4.49999
42, 13, 1 -> 33.0 or 32.C
3.141592653589793, 3, 8 -> 10.01021101
3.141592653589793, 5, 10 -> 3.0323221430
1.234, 16, 12 -> 1.3BE76C8B4395
10.5, 2, 8 -> 1010.10000000 or 1010.01111111
10.5, 3, 8 -> 101.11111111
6.5817645, 20, 10 -> 6.BCE2680000 or 6.BCE267JJJJ
0.367879441171442, 25, 10 -> 0.94N2MGH7G8
12944892982609, 29, 9 -> PPCGROCKS.000000000
źródło
42, 13, 1
czy możemy33
zamiast tego33.0
?n
cyfry dziesiętneOdpowiedzi:
Galaretka , 16 bajtów
Wypróbuj online!
Zauważ, że singletony są drukowane jako element na wyjściu.
źródło
JavaScript (ES8),
817471 bajtówDziała
x
między1e-6
i1e21
,b
od2
do36
(dokładnie tak, jak jest to wymagane) in
od1
do dowolnego od,10
w48
zależności od podstawy, zanim wkroczą błędy zmiennoprzecinkowe. Edytuj: Zapisano 7 bajtów przy pomocy @Birjolaxew. Zapisano kolejne 3 bajty z pomocą @tsh. Poprzednia 74-bajtowa wersja działała również z liczbami ujemnymi:źródło
n
„cyfr” z łańcucha..toString(b)
... głupi mnie> _ <Python 2 ,
153149144137135109 109 bajtówNie zauważyłem, że mogę po prostu zwrócić cyfry jako liczby, dzięki czemu jest to o wiele prostsze. Zwraca dwie listy cyfr, pierwsza dla części całkowitej, druga dla ułamka.
Wypróbuj online!
źródło
1e-6
(i mniejsze niż1e15
, jak poprzednio)Perl 6 , 25 bajtów
Spróbuj
Rozszerzony:
Zauważ, że spacja jest tak przetworzona, że
(+x).base(b,n)
nie
+( x.base(b,n) )
.źródło
1e-6
(i mniejsze niż1e15
, jak poprzednio)Mathematica, 158 bajtów
ponieważ to wyzwanie otrzymało już bardzo dobrą odpowiedź w matematyce autorstwa @KellyLowder, starałem się uzyskać (z innym podejściem) dokładne wyniki, jak pokazano w przypadkach testowych
Wejście
wynik
źródło
Rubinowy , 45 bajtów
Dlaczego?
Ponieważ b ^ n w podstawie b wynosi 10 ^ n, mnożymy x przez tę liczbę, a następnie dodajemy przecinek dziesiętny, do którego należy.
Wypróbuj online!
źródło
.round
w.to_i
; naprawia to ostatnią cyfrę wyjścia, dla tych, które nie pasują do wyników testu. -1 więcej bajtów przy użyciu.insert ~n,?.
, bez nawiasów.C (gcc) ,
157152 bajtyPotrzebuje 64 bitów,
long int
aby działało to z większymi przypadkami testowymi.-5 bajtów dzięki Peterowi Cordesowi
Wypróbuj online!
edycja: kilka bajtów można ogolić, jeśli można wypisać dwa ciągi znaków oddzielone separatorem nowego wiersza:
149 bajtów:
edycja: to zgłoszenie nie jest najdłuższe, tak!
źródło
printf(z+r)
jeśli nie zawiera żadnych%
znaków. (To jest kod-golf; bezpieczeństwo i dobre praktyki wychodzą przez okno: P). Możesz także użyć,puts(z+r)
aby uzyskać nowy wiersz za darmo (zapisującputs("")
w drugiej wersji).float
jest krótszy niżdouble
, ale wydaje się, że pytanie wymaga wprowadzeniadouble
ciągu lub łańcucha.long
i zgodnie z regułami golfa to wszystko, czego potrzebujesz, aby odpowiedź była poprawna. (Poza tym odpowiedzi C-C ++ w golfa kodowego są typowe dla wersji 64-bitowejlong
, ponieważ tego właśnie używa Try It Online.) Sugeruję wycofanie edycji i dodanie uwagi typu „long
musi być 64-bitowy dla obsługuje to większe przypadki testowe ”.Mathematica 47 bajtów
RealDigits
Dwukrotne wywołanie w celu ustalenia liczby cyfr po lewej stronie dziesiętnej.źródło
1e-6
(i mniejsze niż1e15
, jak poprzednio)TakeDrop@@RealDigits[##]
ale potem zdałem sobie sprawę, że źle odczytałem - Twoje rozwiązanie wydaje się optymalne.SageMath , 68 bajtów
Wypróbuj online!
źródło
1e-6
(i mniejsze niż1e15
, jak poprzednio)Haskell , 188 bajtów
Wypróbuj online!
g
konwertuje liczbę na listę reprezentującą ten numer w danej baziez
mapuje liczby całkowite na litery (36 = .
)h
stosuje poprzednie funkcje do liczby całkowitej i części ułamkowej liczby.źródło
Aksjomat, 566 bajtów
to pytanie było szczególnie trudne; po pewnym czasie coś napisać, wydaje się, że właściwe wyniki generują za pomocą jednego makra dla zachowania cyfr () ... to nie jest zbyt gra w golfa ... wyniki:
prawdziwym celem jest jedna funkcja, która konwertuje do podstawy 2..36 każdy zmiennoprzecinkowy [który ma k: = cyfry ()] lub każdą obliczoną liczbę jako% pi lub% e lub podział dwóch zmiennoprzecinkowych / int jak w 1./3 . [cyfry „oo”]
źródło
Aksjomat, 127 bajtów
wyniki
Ma mały problem z końcowym przykładem zerowym
Zwróciłby „4.5”, a nie „4.50000”
źródło