Utwórz procedurę, która pobiera tablicę bloków w jednym numerycznym systemie bazowym i przekształca je w tablicę bloków w innym numerycznym systemie bazowym. Zarówno do, jak i do systemów są arbitralne i powinny zostać zaakceptowane jako parametr. Tablica wejściowa może mieć dowolną długość (jeśli używasz języka, w którym długości tablic nie są przechowywane w tablicy, takiego jak C, parametr długości należy przekazać do funkcji).
Oto jak powinno to działać:
fromArray = [1, 1]
fromBase = 256
toBase = 16
result = convertBase(fromArray, fromBase, toBase);
Które powinny zwrócić [0, 1, 0, 1]
lub ewentualnie [1, 0, 1]
(wiodące 0
s są opcjonalne, ponieważ nie zmieniają wartości odpowiedzi).
Oto kilka wektorów testowych:
Wektor testu tożsamości
fromArray = [1, 2, 3, 4] fromBase = 16 toBase = 16 result = [1, 2, 3, 4]
Trywialny wektor testowy
fromArray = [1, 0] fromBase = 10 toBase = 100 result = [10]
Duży testowy wektor
fromArray = [41, 15, 156, 123, 254, 156, 141, 2, 24] fromBase = 256 toBase = 16 result = [2, 9, 0, 15, 9, 12, 7, 11, 15, 14, 9, 12, 8, 13, 0, 2, 1, 8]
Naprawdę duży wektor testowy
fromArray = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] fromBase = 2 toBase = 10 result = [1, 2, 3, 7, 9, 4, 0, 0, 3, 9, 2, 8, 5, 3, 8, 0, 2, 7, 4, 8, 9, 9, 1, 2, 4, 2, 2, 3]
Niezrównany wektor bazowy
fromArray = [41, 42, 43] fromBase = 256 toBase = 36 result = [1, 21, 29, 22, 3]
Inne kryteria / zasady:
Wszystkie zmienne całkowite powinny mieścić się w standardowej 32-bitowej liczbie całkowitej ze wszystkimi rozsądnymi zakresami wejściowymi.
Możesz przekonwertować na reprezentację pośredniczącą, o ile pośrednik nie jest niczym więcej niż tablicą 32-bitowych liczb całkowitych ze znakiem.
Spodziewaj się obsługiwać bazy od 2 do 256. Nie ma potrzeby obsługi wyższych baz od tego (ale jeśli chcesz, na pewno).
Spodziewaj się obsługiwać rozmiary wejściowe i wyjściowe co najmniej do 1000 elementów. Rozwiązanie skalowane do 2 ^ 32-1 elementów byłoby lepsze, ale 1000 jest w porządku.
Nie musi to oznaczać posiadania najkrótszego kodu spełniającego te reguły. Chodzi o posiadanie najczystszego i najbardziej eleganckiego kodu.
Nie jest to do końca trywialne, więc odpowiedź, która prawie działa, może zostać zaakceptowana!
źródło
Odpowiedzi:
Pyton
źródło
Oto rozwiązanie Haskell
I przeprowadzanie testów z pytania:
źródło
R
Obsługuje wiele tysięcy elementów * w mniej niż minutę.
* dla> 500 elementów musisz podnieść domyślny poziom rekurencji lub nie resetować
mm
matrycydothelocomotion()
Przykłady:
źródło
Mniej zaciemniona i szybsza wersja JavaScript:
Czas obliczeń rośnie o o (liczba cyfr 2 ).
Niezbyt wydajny w przypadku dużych liczb.
Wersje specjalizowane Kodowanie liniowe base64 korzysta ze współczynników podstawowych w celu przyspieszenia obliczeń.
źródło
JavaScript
Dziękuję Keith Randall za odpowiedź w języku Python. Zmagałem się z drobiazgami mojego rozwiązania i skończyłem z kopiowaniem twojej logiki. Jeśli ktoś głosuje na to rozwiązanie, ponieważ działa, proszę również oddać głos na rozwiązanie Keitha.
Testy
Prawdopodobnie można by to znacznie zmniejszyć, ale tak naprawdę chcę go użyć do małego projektu pobocznego. Więc zachowałem ją w pewnym stopniu do odczytu i starałem się kontrolować zmienne.
źródło
for each
instrukcja i zachwycające konstrukcje, takie jakd.length||e?d.push(e):0
... Czy jest to zaciemnione wyzwanie kodu czy coś takiego? Możesz napisać to samo z zrozumiałą składnią i lepszymi wynikami.Matematyka
Nie zdefiniowano żadnych zmiennych, wszelkie dane wejściowe są akceptowane, o ile mieszczą się w pamięci.
Jazda testowa:
Na zewnątrz
źródło
Scala:
Kod testowy z testami:
Przeszedł wszystkie testy.
źródło
J,
109105Obsługuje tysiące cyfr bez potu. Żadnych liczb całkowitych nie zaszkodzi!
Przykłady
Jest coraz krótszy.
źródło
Smalltalk, 128
testy:
i dla twojej specjalnej rozrywki ( wyzwanie: dowiedz się, co jest takiego specjalnego w wartości wejściowej ):
źródło