Pisząc programy do gry w golfa , zwykle używam stałych liczbowych. Zawsze umieszczam je po przecinku, ponieważ tak myślę, ale właśnie zdałem sobie sprawę, że mój język obsługuje inne formaty liczb, które mogą pozwolić mi nieco skrócić kod.
Wyzwanie
Biorąc pod uwagę nieujemną liczbę całkowitą mniejszą niż 2 ^ 53-1, zdecyduj, czy ta liczba całkowita ma najkrótszą reprezentację w:
- Dziesiętny
- Szesnastkowy
- Notacja naukowa
Dziesiętny
Ponieważ jest to domyślny format mojego języka, dla tego formatu nie jest wymagana dodatkowa notacja. Każda liczba jest reprezentowana jak zwykle po przecinku.
Szesnastkowy
Moje języki używają 0x
prefiksu dla stałych szesnastkowych. Oznacza to, że jeśli liczba ma 4 cyfry szesnastkowe, reprezentacja tej liczby zajmie 6 bajtów.
Notacja naukowa
Mój język używa następującego formatu notacji naukowej:
[Podstawa rzeczywista] e [Wykładnik liczby całkowitej 10]
Na przykład 700
byłoby reprezentowane jako 7e3
i 699
byłoby reprezentowane jako 6.99e3
, ponieważ podstawa musi wynosić od -10 do 10 (nie obejmuje). Dla celów tego wyzwania podstawa zawsze będzie wynosić co najmniej 0, ponieważ wprowadzona liczba nie jest ujemna.
Wydajność
Powinieneś zwrócić sposób identyfikacji, który format jest najkrótszy (tj. 0 dla dziesiętnych, 1 dla szesnastkowych, 2 dla naukowych). Alternatywnie możesz wypisać najmniejszą reprezentację samej liczby.
Przypadki testowe
Decimal | Hexadecimal | Scientific | Winner
--------------|--------------|-------------------|-------------
0 | 0x0 | 0e0 | Decimal
15 | 0xF | 1.5e1 | Decimal
6999 | 0x1B57 | 6.999e3 | Decimal
7000 | 0x1B58 | 7e3 | Scientific
1000000000000 | 0xE8D4A51000 | 1e12 | Scientific
1000000000001 | 0xE8D4A51001 | 1.000000000001e12 | Hexadecimal
1000000001000 | 0xE8D4A513E8 | 1.000000001e12 | Hexadecimal
1000001000000 | 0xE8D4B45240 | 1.000001e12 | Scientific
Punktacja
To jest golf golfowy , więc wygrywa odpowiedź w najkrótszych bajtach dla każdego języka.
źródło
2^63-1
przypadku niektórych języków wymóg przejścia na wyższy poziom może być trudny. Rozważ złagodzenie tego do niższej wartości, takiej jak2^32-1
(aby wartości pasowały do podwójnego zmiennoprzecinkowego typu danych)double
. Tylko sugestia; rób, co uważasz za stosowne1000001000000
można również napisać tak,1000001e6
jakby.Odpowiedzi:
05AB1E , 23 bajty
Wypróbuj online!
-1 dzięki Emignie .
0
dla szesnastkowego,1
dziesiętnego,2
naukowego.źródło
'.ìÁ0
.05AB1E , 27 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
len(hex(input)) + 2
, jeśli to pomaga.¹
zamiastDs
:g¹hgÌ
Galaretka , 28 bajtów
Monadycznego Link powrocie
1
,2
albo3
na szesnastkowy, naukowej lub przecinku odpowiednio.Wypróbuj online! lub zobacz zestaw testowy .
Myślałem, że to będzie krótsze, ale nie widzę tego, więc piszę.
Jak działa ta potworność ...
źródło
JavaScript (ES6), 90 bajtów
Zwraca 0 dla wartości dziesiętnych, 1 dla wartości szesnastkowych, -1 dla wartości naukowych.
Pokaż fragment kodu
Wyjaśnienie
log(n) / log(10)
: logarytm podstawowy 10 dlan
; z grubszan
jako liczba dziesiętna.log(n) / log(16) + 2
: logarytm bazowy 16n
plus 2; w przybliżeniu długośćn
jako wartość szesnastkowa plus wartość dodana0x
.n.toExponential().length - 1
:n.toExponential()
zwraca ciąg znakówn
w formacie naukowym (np.7e+3
), ale odejmujemy 1 od jego długości, aby uwzględnić obce+
.Teraz, gdy mamy długości wszystkich 3 przedstawień
D
,H
iS
porównujemy:S<H?-(S<D):+(H<D)
JavaScript (ES6), 97 bajtów
Ten wypisuje liczbę w formacie o najkrótszej długości. Zainspirowany usuniętą próbą @ Shaggy .
Pokaż fragment kodu
źródło
C #,
1069796143132 bajtówIrytujące w języku C # specyfikator
ulong.ToString
formatue
traci precyzję na wyższych liczbach, więc musiałem to zrobić ręcznie. Prawdopodobnie jest to krótszy sposób, ale na razie to działa. Formatuje go również niepoprawnie dla tego wyzwania, więc i tak musiałbym ręcznie usunąć dane wyjściowe.Jeśli ustawię ciąg znaków na wartość,
n
ponieważvar s=n+"";
działa on dłużej ze względu na wyraźny zwrot i dodatkowe nawiasy klamrowe.Zwraca najkrótszą wartość z tablicy każdej innej wartości gdzie
[0] = decimal, [1] = hexadecimal, [2] = scientific
.Wersja pełna / sformatowana:
Prawidłowy sposób obliczenia wyników naukowych to:
Jednak widząc, że
0
jest krótszy niż0e0
mogę usunąć ten specjalny przypadek.źródło
Python 2,
8377 bajtówZwraca najmniejszą reprezentację liczby.
Wypróbuj online
Nie golfowany:
Wyrażenie regularne usuwa zera końcowe i kropkę dziesiętną, jeśli to konieczne, a także znak plus i wiodące zero z wykładnika, jeśli taki istnieje.
źródło
L
do dużej liczby w zakresie wejściowym.str
uniknąłby tego.int
reprezentacji Pythona . Długo zaczynają się mniej więcej od początku2**63
.+
postacie za pomocąstr.replace
?+
czas, w którym jestem.Ohm , 35 bajtów
Wypróbuj online!
Wyjście 0 dla dziesiętnych, 1 dla szesnastkowych i 2 dla naukowych.
Wyjaśnienie:
źródło
PHP , 90 bajtów
wypisuje 0 dla dziesiętnego, 1 dla szesnastkowego i 2 dla naukowego
w przypadku remisu zostanie wydrukowana najwyższa liczba
Wypróbuj online!
PHP , 91 bajtów
wypisuje 0 dla dziesiętnego, 1 dla szesnastkowego i 2 dla naukowego
w przypadku remisu zostanie wydrukowana najniższa liczba
Wypróbuj online!
PHP , 103 bajty
wypisuje 0 dla dziesiętnego, 1 dla szesnastkowego i 2 dla naukowego
w przypadku remisu wszystkie liczby zostaną wydrukowane
Wypróbuj online!
PHP , 109 bajtów
Wyprowadź tablicę z najkrótszymi rozwiązaniami
Wypróbuj online!
źródło
C
187185 bajtówDekompresowane:
Drukuje 0 dla dziesiętnego, 1 dla szesnastkowego, 2 dla notacji naukowej.
źródło
TI-Basic, 130 bajtów
Lub alternatywnie:
Lub szesnastkowo:
Drukuje 0 dla dziesiętnego, 1 dla szesnastkowego, 2 dla notacji naukowej
źródło