Komputery żyją w systemie binarnym. Wszyscy programiści znają binarny.
Ale 2**x
podstawy są często zaniedbywane jako niepraktyczne, podczas gdy mają piękne relacje z binarnymi.
Aby pokazać wam przykład takiego pięknego związku, 19 będzie moim świadectwem.
19 10011 103 23 13 j
19 jest ułamkiem dziesiętnym, podanym dla zachowania przejrzystości.
10011 ma 19 cyfr binarnych.
103, w bazie 4 powstaje począwszy od binarnego w ten sposób:
- log2 (4) == 2, pamiętajmy dwa.
- Podkładka 10011, aby miała wielokrotność 2 długości -> 010011
Weź cyfry 2 na 2 od lewej do prawej i traktuj je jak dwucyfrowe liczby binarne:
- 01 -> 1
- 00 -> 0
- 11 -> 3
Sporządzono , 10011 w bazie 4 to 103.
W przypadku podstawy 8 wykonaj to samo, ale 3 na 3, co log2 (8) = 3.
- Pad 010011
- 010 -> 2
011 -> 3
23, Gotowe .
Dla podstawy 16 wykonaj to samo, ale 4 na 4, jak log2 (16) = 4.
- Pad 00010011
- 0001 -> 1
0011 -> 3
13, Gotowe .
Zadanie
Biorąc pod uwagę maksymalną liczbę jako dane wejściowe, wypiszesz tabelę
base-ten-i base-two-i base-four-i base-eight-i base-sixteen-i base-thirtytwo-i
dla i, który przechodzi od 0 do n włącznie. Liczby binarne są uosobieniem absolutnego minimum niezbędnego do działania, więc kod powinien być możliwie jak najkrótszy.
Ograniczenia i bonusy
Base-ten -> binarny i binarny -> Wbudowane Base-ten są uważane za luki, podobnie jak Base-a -> Base-b.
Jeśli wygenerujesz wszystkie
2**i
bazy (dla i> 2) przy użyciu wyżej wymienionych relacji, otrzymasz*0.6
bonus, ale ogólne konwersje bazy (napisane przez ciebie ) są dozwolone.
Przykładowa tabela
> 32
0 0 0 0 0 0
1 1 1 1 1 1
2 10 2 2 2 2
3 11 3 3 3 3
4 100 10 4 4 4
5 101 11 5 5 5
6 110 12 6 6 6
7 111 13 7 7 7
8 1000 20 10 8 8
9 1001 21 11 9 9
10 1010 22 12 a a
11 1011 23 13 b b
12 1100 30 14 c c
13 1101 31 15 d d
14 1110 32 16 e e
15 1111 33 17 f f
16 10000 100 20 10 g
17 10001 101 21 11 h
18 10010 102 22 12 i
19 10011 103 23 13 j
20 10100 110 24 14 k
21 10101 111 25 15 l
22 10110 112 26 16 m
23 10111 113 27 17 n
24 11000 120 30 18 o
25 11001 121 31 19 p
26 11010 122 32 1a q
27 11011 123 33 1b r
28 11100 130 34 1c s
29 11101 131 35 1d t
30 11110 132 36 1e u
31 11111 133 37 1f v
32 100000 200 40 20 10
źródło
Odpowiedzi:
CJam, 54 * 0,6 = 32,4 bajtów
Sprawdź to tutaj.
Dla porównania, oto krótsze rozwiązanie, które nie kwalifikuje się do premii (39 bajtów):
źródło
Pyth, 52 * 0,6 = 31,2 bajtów
Przetestuj online
Moja odpowiedź bez premii wynosi 39 bajtów
źródło
PHP,
232230233217 * 0,6 = 130,2nie ma szans na pokonanie języków golfowych, ale podobało mi się to wyzwanie.
$n=32;
lub wymiany$n
z32
(lub dowolny inny niż ujemna); zadzwoń przez cli$n
z$_GET[n]
(+ 6 / + 3.6) i wezwanie albo w przeglądarcelub na CLI z
php-cgi -f bases.php -n=32
<br>
znak podziału wiersza na lub przejdź<pre>
do testu w przeglądarceUsuń E_NOTICE z raportowania o błędzie (prepend
error_reporting(0);
), aby je ukryć.awaria:
główna edycja:
74 bajtów, aby naprawić wyniki dziesiętne 0 po przeróbcewersja bez premii, 142 bajty
PHP pokonuje Python?
Nawet jeśli dodam 6 (3,6) bajtów, aby uczynić fragment kodu programem, nadal bym pokonał Pythona (223 * 0,6 = 133,8 lub 148 bez premii vs. 158). Niesamowity.
źródło
for
słowie kluczowym w najbardziej zewnętrznej pętli for."\n"
-> fizyczny podział linii.Ruby, 80 bajtów (wersja bez premii)
źródło
Python 3 -
189, 167, 166150 bajtówZapisano 16 bajtów przy pomocy @ LeakyNun !
Wersja
premiowa-296 * 0,6 = 177,6279 * 0,6 = 167,4 bajtówNieco bardziej czytelna wersja wersji bonusowej.
źródło
"0123456789abcdefghijklmnopqrstuv"
jest krótszy niżfrom string import* digits+ascii_lowercase
digits+ascii_lowercase
: D. Dzięki!for i in range(int(input())+1):f=lambda n=i,b,c="0123456789abcdefghijklmnopqrstuv":n<b and c[n]or f(n//b,b)+c[n%b];print(i,f(2),f(4),f(8),f(16),f(32))
(jedna linia)