Problem:
W wybranym języku napisz najkrótszą funkcję zwracającą podstawę pierwiastka kwadratowego z niepodpisanej 64-bitowej liczby całkowitej.
Przypadki testowe:
Twoja funkcja musi działać poprawnie dla wszystkich danych wejściowych, ale oto kilka, które pomagają zilustrować ten pomysł:
INPUT ⟶ OUTPUT
0 ⟶ 0
1 ⟶ 1
2 ⟶ 1
3 ⟶ 1
4 ⟶ 2
8 ⟶ 2
9 ⟶ 3
15 ⟶ 3
16 ⟶ 4
65535 ⟶ 255
65536 ⟶ 256
18446744073709551615 ⟶ 4294967295
Zasady:
- Możesz nazwać swoją funkcję dowolnie. (Funkcje bezimienne, anonimowe lub lambda są w porządku, o ile można je wywołać).
- Liczba postaci jest najważniejsza w tym wyzwaniu, ale ważne jest również środowisko wykonawcze. Jestem pewien, że możesz iteracyjnie skanować w górę w poszukiwaniu odpowiedzi w czasie O (√n) przy bardzo małej liczbie znaków, ale czas O (log (n)) naprawdę byłby lepszy (to znaczy przy założeniu wartości wejściowej n, nie długość bitowa n).
- Prawdopodobnie będziesz chciał zaimplementować tę funkcję, używając arytmetyki wyłącznie liczb całkowitych i / lub logicznych. Jeśli jednak naprawdę chcesz korzystać z obliczeń zmiennoprzecinkowych, to jest w porządku, o ile nie wywołujesz żadnych funkcji bibliotecznych. Zatem po prostu powiedzenie
return (n>0)?(uint32_t)sqrtl(n):-1;w C jest poza limitem, nawet jeśli dałoby to prawidłowy wynik. Jeśli używasz arytmetyki zmiennoprzecinkowej, można użyć*,/,+,-oraz potęgowanie (np**lub^jeśli jest wbudowany operatora w wybranym języku, ale tylko potęgowanie uprawnień nie mniej niż 1 ). To ograniczenie ma na celu zapobieganie „oszukiwaniu” przez sprawdzaniesqrt()lub wariant lub podnoszenie wartości do ½ potęgi. - Jeśli używasz operacji zmiennoprzecinkowych (patrz # 3), nie jest wymagane, aby typ zwracany był liczbą całkowitą; tylko, że zwracana wartość jest liczbą całkowitą, np. floor (sqrt (n)), i jest w stanie pomieścić dowolną 32-bitową wartość bez znaku.
- Jeśli używasz C / C ++, można zakładać istnienie niepodpisane 64-bitowych i 32-bitowych typów całkowitych, np
uint64_tiuint32_t, jak określono wstdint.h. W przeciwnym razie upewnij się, że Twój typ liczb całkowitych jest w stanie pomieścić dowolną 64-bitową liczbę całkowitą bez znaku. - Jeśli Twój język nie obsługuje 64-bitowych liczb całkowitych (na przykład, Brainfuck najwyraźniej obsługuje tylko 8-bitowe liczby całkowite), zrób to najlepiej i podaj ograniczenie w tytule odpowiedzi. To powiedziawszy, jeśli możesz dowiedzieć się, jak zakodować 64-bitową liczbę całkowitą i poprawnie uzyskać jej pierwiastek kwadratowy za pomocą 8-bitowej prymitywnej arytmetyki, to więcej mocy dla ciebie!
- Baw się i bądź kreatywny!
O(log_2 n) === O(log_4 n). log_4(n) = log_2(n) / log_2(2) = log_2(n) / 2