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 / prawon
ok
bity. 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%b
powinno być równea
. Tak5 % -3
jest2
i-5 % 3
jest-2
: 5 / 3
jest1
,5 % 3
jest2
, ponieważ 1 * 3 + 2 = 5.-5 / 3
jest-1
,-5 % 3
jest-2
, ponieważ -1 * 3 + -2 = -5.5 / -3
jest-1
,5 % -3
jest2
, ponieważ -1 * -3 + 2 = 5.-5 / -3
jest1
,-5 % -3
jest-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ęb
naa + 5
, następnie ustawia sięa
nab
i liczy się jako jedna operacja. - Przypisania złożone mogą być użyte jako
a += b
środkia = a + b
i 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
return
instrukcjireturn
is z dowolnego punktu są dozwolone.return
Sama nie liczy się jako operacji. - Możesz zadeklarować zmienne bez żadnych kosztów.
- Możesz używać
while
pętli, ale nie możesz używaćif
lubfor
. Operatory użyte w tymwhile
stanie liczą się do twojego wyniku.while
pę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 while
pę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 while
pę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ć.
while
i break
jednak nie if
? if (x) { ... }
jest równoważne z while (x) { ... break; }
.
break
a 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”! :)
if
i for
są niedozwolone? int x=condition; while (x) { ... x=0; }
jest darmowy, tylko więcej kodu. To samo z c-stylu for
.