Są sprytne sposoby określania, czy liczba jest potęgą 2. To już nie jest interesujący problem, więc ustalmy, czy dana liczba całkowita jest potęgą liczby całkowitej -2 . Na przykład:
-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²
Zasady
Możesz napisać program lub funkcję i użyć dowolnej ze standardowych metod odbierania danych wejściowych i dostarczania danych wyjściowych.
Dane wejściowe są jedną liczbą całkowitą, a wartość wyjściowa musi być zgodna z prawdą, jeśli liczba całkowita jest potęgą całkowitą -2, a w przeciwnym razie wartością falsy. Żadne inne dane wyjściowe (np. Komunikaty ostrzegawcze) są niedozwolone.
Obowiązują zwykłe reguły przepełnienia liczb całkowitych: twoje rozwiązanie musi być w stanie pracować dla dowolnie dużych liczb całkowitych w hipotetycznej (lub być może rzeczywistej) wersji twojego języka, w której wszystkie liczby całkowite są domyślnie nieograniczone, ale jeśli twój program zawiedzie w praktyce z powodu implementacji brak obsługi liczb całkowitych tak dużych, co nie unieważnia rozwiązania.
Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.
Warunki wygranej
To jest konkurs golfowy : odpowiedź, która ma najmniej bajtów (w wybranym przez ciebie kodowaniu), jest zwycięzcą.
źródło
i
takiej liczby całkowitej , że(-2)^i = 2
-0.5
powinny być prawidłowe, ponieważ wynosi 2 ^ (- 1) .i
nie jest naturalneOdpowiedzi:
Mathematica, 22 bajty
Wypróbuj online! (Zamiast tego używa matematyki, gdzie to rozwiązanie również działa).
Przez jakiś czas próbowałem znaleźć rozwiązanie z operatorami bitowymi i chociaż jeden z nich zdecydowanie istnieje, znalazłem coś, co prawdopodobnie jest prostsze:
Max[#,-2#]
mnoży wejście przez -2, jeśli jest ujemne. Mnożenie przez inny współczynnik -2 nie zmienia, czy wartość jest potęgą -2, czy nie. Ale teraz wszystkie nieparzyste potęgi -2 zostały zamienione na parzyste potęgi -2 .Log2@...
i sprawdzić, czy wynikiem jest liczba całkowita (aby sprawdzić, czy jest to potęga 2 ). To już oszczędza dwa bajtyLog[4,...]
(inny sposób patrzenia na parzyste potęgi -2 ).EvenQ
zamiastIntegerQ
.źródło
Log[4,...]
jest on dłuższyLog2@...
iIntegerQ
dłuższy niżEvenQ
.Galaretka , 5 bajtów
Wypróbuj online!
Jak to działa
źródło
Python , 46 bajtów
-2 bajty dzięki @ovs.
Funkcja z użyciem:
Wypróbuj online!
źródło
print g(8)
odbitkiFalse
print g(4)
robi to samo;
zamiast nowej linii ... przepraszam za to. Naprawiono @FelipeNardiBatistaGalaretka , 6 bajtów
Wypróbuj online!
Jest to oparte na tym, jak Jelly przekształca liczbę całkowitą N na dowolną dowolną zasadę B , robiąc to przez konwersję N na tablicę, w której każda liczba całkowita jest cyfrą d ( N ) B , która może mieć wartość 0 ≤ V d < B . Tutaj będziemy cyfry 0 indeksy z prawej strony, więc każda cyfra dodaje V d B d tworząc N . V d < B ⇔ V d B d < BB d = B d +1 , dlatego wszystkie możliweN posiada tylko jedną unikalną reprezentacji jeśli pominiemy prowadzące 0s w ( n ) B .
Tutaj d = wejście, B = -2. N = B d = 1 B d = V d B d ⇔1 = V d ⇔ V d = 1, a ponieważ nie dodajemy żadnych innych wielokrotności mocy B , każde inne V będzie wynosić 0. W tej chwili, tablica powinna być 1 połączona z d 0. Ponieważ Jelly 1-indeksuje od lewej, powinniśmy sprawdzić, czy pierwszy element tablicy ma wartość 1, a wszystkie pozostałe elementy mają wartość 0.
Hmm ... wszystko dobrze, prawda? Nie? Co się dzieje? O tak, mam lepszy pomysł! Najpierw weźmy sumę wszystkich liczb całkowitych w tablicy, traktując ją tak, jakby była tablicą liczb całkowitych, a nie liczbą w bazie -2. Jeśli jest 1, oznacza to, że istnieje tylko jeden 1, a wszystkie inne są całkowitymi 0. Ponieważ nie mogą być zerami, z wyjątkiem przypadku 0 -2(gdzie i tak suma wynosiłaby 0 ≠ 1), 1. liczba całkowita musi być niezerowa. Jedyną niezerową liczbą całkowitą w tablicy jest 1, więc musi być pierwszą. Dlatego jest to jedyny przypadek, w którym suma wszystkich liczb całkowitych w tablicy wynosi 1, ponieważ najmniejsza możliwa suma dodatnich liczb całkowitych wynosi is {1,1} = 2, ponieważ najmniejsza dodatnia liczba całkowita wynosi 1 Każda liczba całkowita w reprezentacji podstawowej jest nieujemna, więc jedynym sposobem, w jaki suma jest 1, ma tylko jeden 1, a wszystkie inne liczby całkowite wynoszą 0. Dlatego możemy po prostu sprawdzić, czy suma wszystkich liczb całkowitych w tablica to 1.
Oto, co robi kod:
źródło
Python 2 ,
353432 bajtyWypróbuj online!
źródło
Python 2 ,
9850 bajtówWypróbuj online!
źródło
Excel,
4036 bajtówZapisane 4 bajty przez CallumDA
Excel z pewnością może to zrobić, ale poprawianie błędów dodaje 11 bajtów
Dane wejściowe są w komórce
A1
. Dane wyjściowe toTRUE
lubFALSE
Gdyby dozwolone było zwrócenie jednego
FALSE
lub#NUM!
błędu dla fałszywych wartości, byłoby to tylko 25 bajtów:źródło
=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
05AB1E , 8 bajtów
Wypróbuj online! lub jako pakiet testowy
Wyjaśnienie
źródło
ÄLY(småO
za 8.Y(sÄLm¢Z
za 8… Nieważne, wszystkie 8.JavaScript (ES6),
37 2824 bajtówZaoszczędź 4 bajty dzięki Arnauldowi.
źródło
C (gcc) ,
3429 bajtówWypróbuj online!
źródło
MATL ,
98 bajtówWypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Jak to działa
Rozważ dane wejściowe
-8
jako przykładźródło
n
, tworzy to tablicę rozmiarówn
jako krok pośredni. Dobra robota, że wydajność nie jest tutaj kryterium!Oktawa , 28 bajtów
Definiuje to anonimową funkcję. Podejście jest podobne do tego w mojej odpowiedzi MATL.
Wypróbuj online!
źródło
PHP, 41 bajtów
PHP, 52 bajty
PHP, 64 bajty
Praca z regexem
źródło
Python 3, 34 bajty
źródło
JavaScript (ES6), 21 bajtów
Funkcja rekurencyjna, która zwraca
0
lubtrue
.Jak to działa
Nie obejmuje to żadnego wyraźnego testu - takiego jak
n
bycie nieparzystym lubabs(n)
bycie mniejszym niż jeden - w celu wczesnego zatrzymania rekurencji, gdy dane wejściowe nie są dokładną siłą -2.Mamy wyjść tylko wtedy, gdy
n
jest dokładnie równy albo1
albo0
.Działa to jednak, ponieważ dowolna liczba zmiennoprzecinkowa IEEE-754 zostanie ostatecznie zaokrąglona,
0
gdy zostanie podzielona przez 2 (lub -2) wystarczającą liczbę razy, z powodu niedomiaru arytmetycznego .Przypadki testowe
Pokaż fragment kodu
źródło
C (gcc) , 33 bajty
Wypróbuj online!
źródło
Java 7, 55 bajtów
Wyjaśnienie:
Kod testowy:
Wypróbuj tutaj.
Wynik:
źródło
boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}
.n=0
w Javie, ponieważ0%-2==0
będzietrue
i0/-2
nadal0
powoduje nieskończoną pętlę, dlatego dodałem tęn==0?0>1
część do mojej metody rekurencyjnej.Haskell,
2423 bajtyDefiniuje funkcję,
f
która zwraca1
dla potęg -2 lub0
innych.Golfowa wersja mojego pierwszego poddania się drugiemu wyzwaniu .
źródło
JavaScript (ES7), 45 bajtów
źródło
**
jest.Perl 6 , 21 bajtów
Spróbuj
Rozszerzony:
Zauważ, że
0.lsb
zwraca,Nil
która generuje ostrzeżenie, gdy jest używana jako liczba, więc//
używany jest zdefiniowany lub operator .(Pomyśl,
//
jak||
z innym skosów)Wywołanie metody bez wywołującego, w którym spodziewany jest termin, jest domyślnie wywoływane
$_
. (.lsb
)Działa również z
.msb
.źródło
Prolog (SWI) , 44 bajty
Tłumacz online
źródło
Python , 24 bajty
Wypróbuj online!
Bitowa sztuczka
k&k-1==0
sprawdza, czyk
jest potęgą 2 (lubk==0
). Sprawdzanie tegok=n*n
jakon*n&n*n-1==0
mówi nam, czyabs(n)
jest potęgą 2.Aby dalej sprawdzić, czy
n
jest potęgą -2, musimy tylko to sprawdzićn%3==1
. Działa to, ponieważ mod 3, wartość -2 jest równa 1, więc jego moc wynosi 1. Natomiast ich negacje to 2 mod 3, i oczywiście 0 daje 0 mod 3.Łączymy czeki
n*n&n*n-1==0
in%3==1
w jedno wyrażenie. Pierwszy można napisać<1
dla==0
, ponieważ nigdy nie jest on negatywny. Jestn%3==1
to równoważne zn%3%2
podaniem 0 lub 1. Możemy więc połączyć je jakon*n&n*n-1<n%3%2
.źródło
R, 22 bajty
Pobiera dane wejściowe ze standardowego wejścia, zwraca
TRUE
lubFALSE
odpowiednio.Nie jestem w 100% pewien, że jest to prawidłowa odpowiedź, ponieważ działa tylko dla liczb całkowitych do limitu rozmiaru R, a jeśli liczby całkowite byłyby nieograniczone, nie działałoby. Jednak zasady stanowią:
W hipotetycznym wersji R, która ma umożliwić nieograniczone całkowitymi, to możemy użyć następującego kodu dla tej samej liczby bajtów:
Oczywiście w prawdziwym R powyższy kod po prostu daje
Error in 0:Inf : result would be too long a vector
.źródło
bc 88 bajtów
Mam to w pliku
neg2.sh
i drukuje1
dla potęgi-2
i0
innychWiem, że to naprawdę długo, ale było fajnie
Test
Wyjaśnienie
Główny korpus ma dwie połówki, obie próbują wyrównać zero do mocy
-2
.źródło
Julia 0,5 , 20 bajtów
Wypróbuj online!
źródło
Fouriera , 53 bajty
Później będę pracował nad golfem, ale jego zarys jest następujący:
Gdzie wyjście jest
0
dla falsey i1
dla prawdy .Wypróbuj online!
źródło
(G*G > X)*X
Casio BASIC , 76 bajtów
Zauważ, że 76 bajtów to, co mówi mój kalkulator.
To moje pierwsze przedsięwzięcie w Casio BASIC ... Nigdy nie zdawałem sobie sprawy, że mogę napisać tak przyzwoite programy na kalkulatorze: D
źródło
Python 2.7, 40 bajtów
Podziękowania dla pana Xcodera za oryginalny kod o długości 43 bajtów. Musiałem opublikować jako osobną odpowiedź, ponieważ nie mam wystarczającej reputacji, aby móc komentować.
źródło
int(input())
co przekroczyłoby limitdef
-jak funkcja. Dodatkowo w Pythonie 3 musisz użyć,print()
który zmarnowałby 1 bajt. Właśnie dlatego wybrałem ten sposób, ponieważ w Pythonie 3 robi się on dłuższy ...Siatkówka , 27 bajtów
Wypróbuj online!
Pobiera dane wejściowe jednoargumentowe, co jest dość standardowe dla Retina. Pierwsze dwa wiersze wykonują częściową konwersję jednoargumentową na binarną na podstawie pierwszych dwóch wierszy kodu z pozycji samouczka (wszelkie obce
1
spowodują, że dopasowanie i tak się nie powiedzie), podczas gdy ostatni wiersz sprawdza moc czterech lub ujemną moc nieparzystą z dwóch.Wypróbuj online!
Tym razem dokonuję częściowej jedności, aby oprzeć cztery konwersje. Moce czterech kończą się tak
^1_*$
, jak podczas gdy ujemne nieparzyste moce dwóch kończą się jako^-11_*$
.Wypróbuj online!
Tym razem dzielę tyle, ile mogę, i sprawdzam,
1
czy-11
na końcu.Wypróbuj online!
Kolejny sposób dzielenia przez cztery. I wciąż irytująco 27 bajtów ...
źródło
Schemat, 60 bajtów
Rozwiązanie rekurencyjne.
źródło