To jest wersja ostatniego wyzwania. Czy ta liczba jest potęgą całkowitą -2? z innym zestawem kryteriów zaprojektowanych w celu podkreślenia interesującej natury problemu i utrudnienia wyzwania. Zastanowiłem się nad tym tutaj .
Wyzwanie, jak wspaniale stwierdził Toby w powiązanym pytaniu, to:
Istnieją sprytne sposoby określania, czy liczba całkowita jest dokładną potęgą 2. To już nie jest interesujący problem, więc ustalmy, czy dana liczba całkowita jest dokładną potęgą -2 . Na przykład:
-2 => yes: (-2)¹ -1 => no 0 => no 1 => yes: (-2)⁰ 2 => no 3 => no 4 => yes: (-2)²
Zasady:
- Liczba całkowita to 64 bity, ze znakiem, uzupełnienie dwóch. To jedyny typ danych, z którym możesz pracować.
- Możesz używać tylko następujących operacji. Każda z nich liczy się jako jedna operacja.
n << k,n >> k: Przesunięcie w lewo / prawonokbity. Bit znaku jest przedłużany przy przesunięciu w prawo.n >>> k: Przesunięcie w prawo, ale nie przedłużaj bitu znakowego. Zera są przesunięte.a & b,a | b,a ^ b: Bitowe AND, OR, XOR.a + b,a - b,a * b: Dodawanie, odejmowanie, mnożenie.~b: Odwrócenie bitowe.-b: Negacja dopełniacza Two.a / b,a % b: Podziel (iloraz liczby całkowitej, zaokrągla w kierunku 0) i modulo.- Modulo liczb ujemnych wykorzystuje reguły określone w C99 :
(a/b) * b + a%bpowinno być równea. Tak5 % -3jest2i-5 % 3jest-2: 5 / 3jest1,5 % 3jest2, ponieważ 1 * 3 + 2 = 5.-5 / 3jest-1,-5 % 3jest-2, ponieważ -1 * 3 + -2 = -5.5 / -3jest-1,5 % -3jest2, ponieważ -1 * -3 + 2 = 5.-5 / -3jest1,-5 % -3jest-2, ponieważ 1 * -3 + -2 = -5.- Zauważ, że
//operator podziału podłogi w Pythonie nie spełnia tutaj właściwości podziału zaokrąglenie do zera, a%operator języka Python również nie spełnia wymagań.
- Modulo liczb ujemnych wykorzystuje reguły określone w C99 :
- Przydziały nie są liczone jako operacja. Podobnie jak w C, przypisania oceniają wartość po lewej stronie po przypisaniu:
a = (b = a + 5)ustawia siębnaa + 5, następnie ustawia sięanabi liczy się jako jedna operacja. - Przypisania złożone mogą być użyte jako
a += bśrodkia = a + bi można je liczyć jako jedną operację.
- Możesz użyć stałych całkowitych, nie liczą się jako nic.
- Dopuszczalne są nawiasy określające kolejność operacji.
- Możesz zadeklarować funkcje. Deklaracje funkcji mogą mieć dowolny dogodny styl, ale należy pamiętać, że 64-bitowe liczby całkowite są jedynym prawidłowym typem danych. Deklaracje funkcji nie liczą się jako operacje, ale wywołanie funkcji liczy się jako jedna. Dla jasności: funkcje mogą zawierać wiele
returninstrukcjireturnis z dowolnego punktu są dozwolone.returnSama nie liczy się jako operacji. - Możesz zadeklarować zmienne bez żadnych kosztów.
- Możesz używać
whilepętli, ale nie możesz używaćiflubfor. Operatory użyte w tymwhilestanie liczą się do twojego wyniku.whilepętle działają, dopóki ich stan nie jest zerowy („prawda” 0 w językach, które mają tę koncepcję, nie jest poprawnym wynikiem). Od wczesnego powrotu jest dozwolone, są dopuszczone do wykorzystaniabreak, jak również - Przepełnienie / niedopełnienie jest dozwolone i nie zostanie wykonane żadne ustalanie wartości. Traktuje się to tak, jakby operacja faktycznie przebiegła poprawnie, a następnie została obcięta do 64 bitów.
Kryteria punktacji / wygranej:
Twój kod musi generować wartość niezerową, jeśli dane wejściowe mają potęgę -2, a w przeciwnym razie zero.
To jest golf atomowy . Twój wynik to całkowita liczba operacji obecnych w kodzie (jak zdefiniowano powyżej), a nie całkowita liczba operacji wykonanych w czasie wykonywania. Następujący kod:
function example (a, b) {
return a + ~b;
}
function ispowerofnegtwo (input) {
y = example(input, 9);
y = example(y, 42);
y = example(y, 98);
return y;
}
Zawiera 5 operacji: dwie w funkcji i trzy wywołania funkcji.
Nie ma znaczenia, w jaki sposób prezentujesz swój wynik, używasz wszystkiego, co jest wygodne w twoim języku, czy to ostatecznie przechowuje wynik w zmiennej, zwraca go z funkcji, czy cokolwiek innego.
Zwycięzcą jest post, który jest w sposób oczywisty poprawny (w razie potrzeby należy przedstawić zwykły lub formalny dowód) i ma najniższą ocenę, jak opisano powyżej.
Bonus Very Hard Mode wyzwanie!
Aby uzyskać szansę na wygranie absolutnie nic oprócz potencjalnej zdolności do zaimponowania ludziom na przyjęciach, prześlij odpowiedź bez użycia whilepętli! Jeśli zostanie dostarczonych wystarczająca ich liczba, mogę nawet rozważyć podzielenie zwycięskich grup na dwie kategorie (z pętlami i bez).
Uwaga: jeśli chcesz podać rozwiązanie w języku, który obsługuje tylko 32-bitowe liczby całkowite, możesz to zrobić, pod warunkiem, że wystarczająco uzasadnisz, że będzie to nadal poprawne dla 64-bitowych liczb całkowitych w wyjaśnieniu.
Ponadto: Niektóre funkcje specyficzne dla języka mogą być dozwolone bez ponoszenia kosztów, jeśli nie omijają zasad, ale są niezbędne do zmuszenia języka do zachowywania się zgodnie z powyższymi zasadami . Na przykład (wymyślony), zezwalam na bezpłatne porównanie z równością 0 w whilepętlach, gdy zostanie zastosowane do warunku jako całości, jako obejście dla języka, który ma „prawdziwe” zera. Wyraźne próby wykorzystania tego rodzaju rzeczy są niedozwolone - np. Koncepcja „prawdy” 0 lub „niezdefiniowanych” wartości nie istnieje w powyższym zestawie reguł, więc nie można na nich polegać.
m ^= s imponujące, i myślę, że byłoby całkowicie OK, aby dokonać zmiany, aby ją jeszcze bardziej ulepszyć.
whilei breakjednak nie if? if (x) { ... }jest równoważne z while (x) { ... break; }.
breaka wczesne zwroty są częścią godną pożałowania) i jest długą historią i lekcją wyciągniętą z zasad dotyczących przyszłych wyzwań. Zawsze dostępna jest wersja „bonusowa”! :)
ifi forsą niedozwolone? int x=condition; while (x) { ... x=0; }jest darmowy, tylko więcej kodu. To samo z c-stylu for.