Wyzwanie
Oto prosty.
Napisz funkcję lub program, gdy otrzyma liczbę w bazie 10 jako dane wejściowe, zwróci lub wydrukuje wartość tej liczby w systemie szesnastkowym .
Przykłady
15 -> F
1000 -> 3E8
256 -> 100
Zasady
- Brak wbudowanych funkcji szesnastkowych
- Litery mogą być małe lub wielkie
- Będziesz musiał się tylko martwić o nieujemne liczby całkowite, bez negatywów i nieznośnych miejsc po przecinku
- Powinien działać z dowolną dowolną dużą liczbą, aż do domyślnego limitu typu języka.
- Newline nie jest obowiązkowy
- Jak zwykle jest to gra w golfa , więc wygrywa najkrótszy kod mierzony w bajtach!
code-golf
math
base-conversion
hexadecimal
Losowa osoba
źródło
źródło
000003E8
?Odpowiedzi:
APL (Dyalog APL) , 17 bajtów
Musi być uruchamiany z
⎕IO←0
, co jest domyślne w wielu systemach APL.Wypróbuj online!
(⎕D,⎕A)[
…]
D igits połączone z alfabetem A , a następnie indeksowane przez…16⊥⍣¯1
odwrotność 16-Base-to-Number, tj. Number-to-Base-16⊢
stosowane do⎕
wprowadzanie numeryczneźródło
Kod maszynowy Turinga, 412 bajtów
Jak zwykle używam zdefiniowanej tutaj składni tabeli reguł . Możesz to przetestować na tej stronie lub, alternatywnie, za pomocą tej implementacji Java.
Odlicza od wejścia w bazie 10, odliczając w górę od 0 w bazie 16. Po zmniejszeniu zera kasuje blok wejściowy i kończy działanie.
źródło
10*n + 33
instrukcji do wykonania dla każdego dowolnegon
. Nie rozumiem jednak kodu.Java,
9289 bajtówźródło
JavaScript,
4943 bajtów.6 bajtów zapisanych przez użytkownika 81655 .
Sprawdź to tutaj .
Ma dwa wiodące zera, co jest dozwolone przez reguły.
Oto wersja bez wiodących zer: (47 bajtów).
Sprawdź to tutaj .
Oba używają dokładnie tego samego podejścia, co moja odpowiedź w języku Python .
źródło
i&15
automatycznie zamieni się na liczbę całkowitą, usuwając miejsca po przecinku. Nie ma potrzeby~~
h=i=>i&&h(i>>4)+"0123456789abcdef"[i&15]
CJam,
2221 bajtówDzięki @ MartinBüttner za grę w golfa na 1 bajcie!
Wypróbuj online!
Jak to działa
źródło
ri{Gmd_9>7*sc+\}h;]W%
Pyth,
33262120 bajtówTo było zabawne.
Wypróbuj online.
Wyjaśnił:
źródło
C (funkcja), 51
Funkcja rekurencyjna przyjmuje jako liczbę całkowitą wejściową parametr:
Kierowca testowy:
źródło
Haskell,
5958434139 bajtówPrzykład użycia:
sequence(s<$s)!!) $ 1000
->"00000000000003E8"
.Spowoduje to utworzenie listy wszystkich liczb szesnastkowych do 16 cyfr szesnastkowych. Na szczęście dzieje się to w porządku, więc możemy po prostu wybrać ten
n
.Edycja: @ Mauris wycisnął 2 bajty. Dzięki!
źródło
s="0123456789ABCDEF";(sequence(s<$s)!!)
dc, 37
Rekurencyjnie divmoduje przez 16, pchając resztę na stos, dopóki nic nie pozostało do podzielenia. Następnie wydrukuj każdy element stosu, używając divmod przez 10, aby uzyskać cyfry AF. Prawdopodobnie więcej szczegółów jutro ... (i mam nadzieję, że mniej bajtów).
źródło
Python,
5958 bajtów1 bajt zapisany przez CarpetPython
Uruchom jako:
print h(15)
Przetestuj tutaj (Ideone.com).
Wyjaśnienie:
źródło
h=lambda i:(i>15 and h(i/16)or'')+"0123456789abcdef"[i%16]
.h=lambda i:(i>15 and h(i/16)or'')+chr(48+i%16+i%16/10*7)
C (gcc) ,
4544 bajtówWypróbuj online!
źródło
Bash (funkcja), 62
Dzięki @manatwork za sugerowanie użycia rekurencji.
źródło
h(){ x=({0..9} {A..F});echo `(($1>15))&&h $[$1/16]`${x[$1%16]}; }
()
zamiast{ ;}
funkcji ciała oszczędza jeszcze więcej :)Perl 6 ,
5348 bajtówTworzy to sekwencję wartości, które są podzielone na liczby całkowite (
div
), dopóki wynik nie zostanie0
wykluczony0
z sekwencjiNastępnie przecina
X
tę sekwencję za pomocą operatora modułu (%
) za pomocą16
Używa tych wartości jako indeksów do spłaszczonej listy składającej się z dwóch zakresów
0..9
i'A'..'Z'
Wreszcie konkatenuje je (
~
) za pomocą metaoperatora reverse (R
)Jeśli wynikiem jest Fałszywa wartość (pusty ciąg), zwróć
0
Stosowanie:
źródło
MATL , 27 bajtów
Używa wersji 5.1.0 języka / kompilatora, która jest wcześniejsza niż to wyzwanie.
Przykład
Wyjaśnienie
źródło
𝔼𝕊𝕄𝕚𝕟, 31 znaków / 62 bajty
Try it here (Firefox only).
Okej, wymyśliłem jeszcze kilka rzeczy, które sprawiły, że grałem w golfa.
Wyjaśnienie
Jest to zasadniczo to samo rozwiązanie, co rozwiązanie ES6 @ SuperJedi224 - ale z czymś innym.
Widzisz
⩥ḊĀⒸª⩥⁽ṁṇ⸩⨝
? To naprawdę fantazyjny sposób pisania"0123456789ABCDEF"
.⩥Ḋ
tworzy zakres od 0 do 10,Ⓒª⩥⁽ṁṇ⸩
tworzy zakres od 65 do 71 i konwertuje go na ciąg ASCII,Ā...⨝
łączy dwa zakresy i łączy je w jeden ciąg. To była prawdopodobnie najfajniejsza część mojego rozwiązania.Dodatkowa wersja niekonkurencyjna, 24 znaki / 45 bajtów
Postanowiłem dodać ciąg alfabetu, jak w Pyth.
źródło
sed, 341 bajtów
Nie jest to oczywisty język dla tego wyzwania, ale ma tę zaletę, że obsługuje liczby wejściowe do (w zależności od implementacji) od 4000 cyfr do limitu dostępnej (wirtualnej) pamięci systemu. Przekształciłem RSA-1024 na hex w około 0,6 sekundy, więc skaluje się dość dobrze.
Działa z wykorzystaniem sukcesywnego dzielenia przez dwa, gromadząc co 4 bity przeniesienia na cyfrę szesnastkową. Używamy znaków nieliterowych do reprezentowania naszego wyniku, dzięki czemu zawsze kumulujemy przenoszenie między danymi dziesiętnymi a danymi szesnastkowymi, a na samym końcu konwertujemy do konwencjonalnych znaków szesnastkowych.
źródło
PHP,
65 66 64 + 1 6259 bajtówfunkcja drukowania rekurencyjnego, drukuje wiodące zero (wstaw
>16
przed,&&
aby je usunąć)programy, 64 bajty +1 dla
-R
(uruchom jako potok z-nR
)wymaga PHP 5.6 lub nowszego (5.5 nie może indeksować literałów łańcuchowych)
lub
wymaga PHP 5.6 lub 7.0 (7.1 rozumie indeksy ciągów ujemnych)
Uruchom jako potok z
-nR
lub wypróbuj je online .źródło
echo+$s
dla wejścia 0+
znak odcina wynik przy pierwszej literze ... więc ...?:0
Julia, 55 bajtów
Jest to podstawowa implementacja funkcji rekurencyjnej. Akceptuje liczbę całkowitą i zwraca ciąg znaków.
Jeśli wartość wejściowa jest mniejsza niż 15, podziel ją przez 16 i powtórz, w przeciwnym razie weź pusty łańcuch. Tackuj to z przodu odpowiednio wybranego znaku szesnastkowego.
źródło
Stos , 98 bajtów
Robienie tego w języku bez operatorów arytmetycznych było prawdopodobnie błędem.
Użyj w ten sposób:
Nie golfowany:
źródło
Ruby, 48 znaków
(Kopia Loovjo „s Python odpowiedź .)
Przykładowy przebieg:
źródło
Poważnie, 35 bajtów
Hex Dump:
Wypróbuj online
Wyjaśnienie:
Zauważ, że
;7ªD+@9<7*+c
jest to odpowiednik4ª▀E
, który zaoszczędziłby 8 bajtów, ale pomyślałem, że być może funkcja, która wypycha podstawowe cyfry b jako ciąg znaków, może być uważana za zbyt „wbudowaną heksadecymalnie”.źródło
JavaScript ES6,
6458 bajtówZaoszczędzono 6 bajtów dzięki ן nɟuɐɯɹɐ ן oɯ i user81655.
źródło
v=>eval('for(z="";v;v=v/16|0)z="0123456789ABCDEF"[v%16]+z')
v=>{for(z="";v>0;v=v/16|0)z=btoa``Ó]·ã»óÐ1``[v%16]+z;return z}
(podwójne tyldy są pojedynczymi tyldami) ==> 64 znaków, 71 bajtów. Nie warty tego.v=v/16|0
to po prostu złożony sposób pisaniav>>=4
.Befunge-93, 58
Po raz pierwszy wykonując prawdziwe wyzwanie w golfa w Befunge, założę się, że jest tam jeden linijka, która jest krótsza, ponieważ wszystkie te pola na środku drugiej linii wydają się marnotrawstwem.
Możesz przejść przez to tutaj . Częściowe wyjaśnienie:
&
: Weź wkład.:88+%
: Weź resztę modulo 16."0"+
: Dodaj go do wartości ASCII równej 0.:"9"`
: Jeśli wynik jest większy niż wartość ASCII wynosząca 9 ...7*+
: Dodaj 7, aby przekształcić go w literę.\
: Zapisz wynikową postać na stosie.8/2/
: Podziel przez 16 zaokrąglając w dół.:!#|_
: Wyjdź z pętli, jeśli wynikiem jest 0.#
: W przeciwnym razie wróć do kroku modułu.>:#,_@
(owijanie wokół): Po zakończeniu wyślij stos w kolejności LIFO.źródło
> <> , 46 + 3 = 49 bajtów
Byłoby to krótsze, gdyby> <> miałoby dzielenie liczb całkowitych, które teraz musimy naśladować, odejmując modulo 1. Mimo to myślę, że używa to całkiem fajnego owijania wokół sztuczek!
Wypróbuj online!
Wyjaśnienie
Pierwsza pętla
Pierwsza pętla wykonuje klasyczną konwersję do algorytmu szesnastkowego. Robi modulo 16 (
:f1+%
) i sprawdza, czy wynik jest <10 (:a(?
). Jeśli tak nie jest, musimy dodać 7 (7+
), aby przejść od miejsc po przecinku do dużego alfabetu w tabeli ASCII. W przeciwnym razie możemy kontynuować dodając wartość ASCII dla 0 ("0"+
) i przesuwając znak, który ma być wyprowadzany na dół stosu, ponieważ będziemy musieli wyprowadzać je w odwrotnej kolejności. Najwyższa wartość jest następnie zastępowana przez wynik dzielenia liczb całkowitych przez 16. Jest to emulowane przez obliczenie a / b - (a / b)% 1 (f1+,:1%-
). Po zakończeniu pętli stos zawiera znaki szesnastkowe w odwrotnej kolejności wyjściowej i 0.Druga pętla
Druga pętla odwraca listę i sprawdza, czy górny element ma wartość 0. Jeśli tak, wiemy, że wszystkie niezerowe zostały wydrukowane i powinniśmy zakończyć. W przeciwnym razie wypisujemy znak i ponownie odwracamy listę, aby przygotować się do następnej iteracji.
:
Przy wejściu do drugiej pętli powiela 0, co nie ma żadnego wpływu.źródło
SpecBAS - 110 bajtów
Wykorzystuje algorytm znaleziony na WikiHow (2. metoda).
Ciągi znaków w SpecBAS są oparte na 1, stąd
+1
wybór właściwego elementu.źródło
C (brzęk) , 83 bajty
Wypróbuj online!
Alternatywne rozwiązanie w C.
źródło
Rubinowy, 40 bajtów
Skradzione zinspiracji odpowiedzią manatwork, ale używając ciekawej luki, aby ją skrócić.źródło
REXX,
8078 bajtówźródło
C, 48 bajtów
Nie jest to całkowicie oryginalne, ogoliłem 5 bajtów z wersji Digital Trauma.
źródło
APL (NARS), znaki 34, bajty 68
test:
źródło