Napisz program, który sprawdzi, czy liczba całkowita jest potęgą 2.
Przykładowe dane wejściowe:
8
Przykładowe dane wyjściowe:
Yes
Przykładowe dane wejściowe:
10
Przykładowe dane wyjściowe:
No
Zasady:
Nie używać
+
,-
operacje.Użyj jakiegoś strumienia wejściowego, aby uzyskać liczbę. Dane wejściowe nie powinny być początkowo przechowywane w zmiennej.
Najkrótszy kod (w bajtach) wygrywa.
Możesz użyć dowolnej odpowiedzi typu prawda / fałsz (na przykład true
/ false
). Możesz założyć, że liczba wejściowa jest większa niż 0
.
code-golf
restricted-source
decision-problem
integer
gthacoder
źródło
źródło
pred
Funkcyjne, gdy stosuje się do liczby całkowitej N, N - 1. powraca to funkcje, takie jak to, które są cienkie, stroje około zakazanego operatora, zakazano?)
, lub większość języków opartych na języku c ”--
.Odpowiedzi:
GolfScript, 6 znaków, bez dekrecji
Oto rozwiązanie, które nie wykorzystuje tej
x & (x-1)
metody w żadnej formie.x & (x/3)
Zamiast tego używa . ;-) Wypisuje wartość0
false,1
jeśli true.Wyjaśnienie:
~
analizuje ciąg wejściowy, aby przekształcić go w liczbę,.
powiela to (dla następnych&
),3/
dzieli to przez trzy (obcięcie),&
oblicza bitowe ORAZ podzielonej wartości z oryginałem, który będzie wynosił zero wtedy i tylko wtedy, gdy wejście będzie równe zero lub potęgi dwóch (tj. będzie ustawiony najwyżej jeden bit), i!
logicznie to neguje, odwzorowując zero na jedną i wszystkie inne wartości na zero.Uwagi:
Zgodnie z objaśnionymi regułami zero nie jest prawidłowym wejściem , więc ten kod jest OK, nawet jeśli wyprowadza,
1
jeśli wejście jest zerowe.Jeśli operator dekrementacji GolfScript
(
jest dozwolony, wystarczy 5-znakowe rozwiązanie~.(&!
opublikowane przez aditsu . Jednak wydaje się to sprzeczne z duchem zasad , jeśli nie z literą.x & (x/3)
Kilka lat temu wpadłem na tę sztuczkę na liście dyskusyjnej Fun With Perl. (Jestem pewien, że nie jestem pierwszym, który to odkrył, ale samodzielnie go wymyśliłem.) Oto link do oryginalnego postu , w tym dowód, że faktycznie działa.źródło
7/3 = 2 (0010)
, więc7 & 2 = 0111 & 0010 = 0010
który wyraźnie ostatni bit nie jest 1APL (7)
Tak, to 7 bajtów . Załóżmy na chwilę, że używam strony kodowej IBM 907 zamiast Unicode, a następnie każdy znak jest bajtem :)
to znaczy
0 = mod(log(input(),2),1)
źródło
Indeterminate
gdy próbuję tego.GolfScript, 11 (dla 1 (prawda) i 0 (fałsz))
Umieść liczbę na stosie, a następnie uruchom.
GolfScript, 22 (dla Tak / Nie)
Uwielbiam, jak konwersja
1
/0
doYes
/No
zajmuje tyle samo kodu, co samo wyzwanie: DOstrzeżenie: NIEZWYKLE nieefektywne;) Działa dobrze dla liczb do 10000, ale gdy osiągniesz tak wysoki poziom, zaczniesz zauważać niewielkie opóźnienie.
Wyjaśnienie:
.,
: zmienia sięn
wn 0..n
(.
duplikat,,
zakres 0..n){2\?}
: do potęgi 2%
: mapuje „potęgę 2” na „0..n”, więc staje sięn [1 2 4 8 16 ...]
?0>
: sprawdza, czy tablica zawiera liczbę (0 jest większe niż indeks)źródło
.,{2\?}%?0<'YesNo'3/=
:; również myślę, że oszukujesz, prosząc o „Umieść liczbę na stosie”, powinieneś zacząć od~
.Mathematica 28
Dla liczb całkowitych 2, licznikiem logarytmu podstawowego 2 będzie 1 (co oznacza, że log jest ułamkiem jednostkowym).
Tutaj nieznacznie modyfikujemy funkcję, aby wyświetlić przypuszczalne wejście. Używamy
#
zamiastInput[]
i dodajemy,&
aby zdefiniować czystą funkcję. Zwraca tę samą odpowiedź, która zostałaby zwrócona, gdyby użytkownik wprowadził numer w powyższej funkcji.Testowanie kilku liczb jednocześnie.
źródło
Perl 6 (17 znaków)
Ten program pobiera wiersz z
get
funkcji STDIN , oblicza logarytm z podstawą 2 na nim (log(2)
) i sprawdza, czy wynik dzieli przez 1 (%%1
, gdzie%%
jest dzielony przez operatora). Nie tak krótkie jak rozwiązanie GolfScript, ale uważam to za dopuszczalne (GolfScript i tak wygrywa wszystko i tak), ale o wiele szybciej (nawet biorąc pod uwagę, że Perl 6 jest teraz wolny).źródło
+
i-
są zabronione na to wyzwanie, dlatego jeślix & (x - 1)
jest równa0
, tox
jest potęgą 2.x&~(~0*x)
nadal działa. To tylko 2 znaki dłużej.Oktawa (
1523)EDYCJA: Zaktualizowano ze względu na wymagania użytkownika;
Pozwala użytkownikowi wprowadzić wartość i wyprowadza 1 dla wartości true, 0 dla wartości false.
Testowany w Octave, powinien również działać w Matlabie.
źródło
R
1313Na podstawie rozwiązania Perla. Zwraca
FALSE
lubTRUE
.Ten parametr
i
reprezentuje zmienną wejściową.Alternatywna wersja z wejściem użytkownika:
źródło
GolfScript, 5
Wyjścia 1 dla wartości true, 0 dla wartości false. Oparty na pomyśle user3142747:
Uwaga:
(
jest zmniejszeniem, miejmy nadzieję, że nie liczy się jako-
:)Jeśli tak (a komentarze OP sugerują, że może), to zamiast tego zapoznaj się z rozwiązaniem Ilmari Karonen .
W przypadku danych wyjściowych Y / N dołącz
'NY'1/=
na końcu (7 kolejnych bajtów).źródło
Python, 31
źródło
bin(input()).rfind('1')<3
2==
ponieważ uznałem, że powinien on również działać dla liczb niepozytywnych. Nie jest to wyraźnie wymagane przez zasady, więc ...print bin(input()).count('1')<2
w sumie 31 znaków, ale jest zbyt podobny do twojego.C, 48
źródło
*
ma wyższy priorytet niż binarny&
, nie potrzebujesz parenów. A jeśli wartość zwrotu zostanie zaakceptowana (tylko zapytana),exit(x&x*-1)
byłaby znacznie krótsza.-
:x*-1
.-
zabroniony jest tylko operator .Zdecydowałem się zastosować inne podejście, oparte na liczbie ludności lub na bokach sumy liczby (liczby 1-bitów). Chodzi o to, że wszystkie potęgi dwóch mają dokładnie jeden
1
bit, a żadna inna liczba nie. Dodałem wersję JavaScript, ponieważ uważam ją za zabawną, choć na pewno nie wygra żadnej gry w golfa.J,
1415 znaków (wyjścia 0 lub 1)JavaScript, 76 znaków (wyniki prawda lub fałsz)
źródło
Klips ,
987Czyta liczbę ze standardowego wejścia.
Wyjaśnienie:
Na początek,
Z
=0
,W
=2
iO
= 1. Pozwala to na umieszczanieW
iO
obok siebie, natomiast użycie2
i1
byłoby interpretowane jako liczba 21 bez spacji (niepożądany dodatkowy znak). W Clip funkcja modulo (%
) działa na liczbach niecałkowitych, więc aby sprawdzić, czy jakaś wartośćv
jest liczbą całkowitą, sprawdź, czyv
mod 1 = 0. Za pomocą składni Clipa zapisuje się to jako=0%v1
. Jednakże, ponieważ booleany są przechowywane jako1
(lub cokolwiek innego) i0
sprawdzenie, czy coś jest równe,0
to po prostu „nie” to. W tym celu Clip ma!
operatora. W moim kodziev
jestlnx2
.x
jest wejściem ze stdin,n
konwertuje ciąg znaków na liczbę ilab
jest podstawa logb
za
. Dlatego program tłumaczy (bardziej czytelnie) na0 = ((log base 2 of parseInt(readLine)) mod 1)
.Przykłady:
wyjścia
i
wyjścia
Edit 1: zastąpić
0
,1
i2
zZ
,O
iW
.Edycja 2: zastąpiona
=Z
przez!
.Również:
Pyth , 5
Kompresuje wersję Clip jeszcze bardziej, ponieważ Pyth ma Q dla już ocenionego wejścia i funkcję log2 (a) zamiast zwykłego dziennika (a, b).
źródło
JavaScript (37)
Prosty skrypt, który dzieli tylko kilka razy i sprawdza resztę.
źródło
for
pętlą (także 37 znaków)for(i=prompt();i>1;i/=2){}alert(i==1)
Matematyka (21)
Bez danych wejściowych jest nieco krótszy
źródło
⌊#⌋==#&@Log2@Input[]
Log2@Input[]~Mod~1==0
.JavaScript,
4140 znakówJak to działa: bierzesz logarytm z podstawy 2 za pomocą
l(prompt()) / l(2)
, a jeśli ten wynik modulo 1 jest równy zero, to jest to potęga 2.Na przykład: po przyjęciu logarytmu 8 na podstawie
2
dostajesz3
.3 modulo 1
jest równe 0, więc zwraca true.Po przyjęciu logarytmu 7 na podstawie 2 otrzymujesz
2.807354922057604
.2.807354922057604 modulo 1
jest równa0.807354922057604
, więc zwraca false.źródło
Math.log
zrobi to już : „Każda z następujących funkcji obiektów matematycznych stosuje operator abstrakcyjny ToNumber do każdego z argumentów ...”JavaScript, 35
Działa dla bajtów.
Wersja 46 znaków , Działa dla liczb 16-bitowych.
Sztuczka działa w najbardziej dynamicznych językach.
Objaśnienie: Konwertuj liczbę na bazę 2, zinterpretuj ten ciąg jako bazę 10, wykonaj modulo 9, aby uzyskać sumę cyfr, która musi wynosić 1.
źródło
0x2ff
co z bazą 21111111111
?+1
,!alert(!(Number.MAX_VALUE%prompt()))
Perl 5.10+, 13 + 1 = 14 znaków
Używa tej samej metody ze starego wątku FWP, co mój wpis w GolfScript . Drukuje,
1
jeśli wejście jest potęgą dwóch, a pusta linia w przeciwnym razie.Musi być uruchamiany
perl -nE
;n
kosztuje jeden dodatkowy char , w sumie 14 znaków. Alternatywnie, oto 18-znakowa wersja, która nie potrzebujen
:źródło
python 3, 38
python, 32
Jednak kod nie działa w każdej wersji.
Zauważ, że rozwiązanie działa również dla 0 (drukuj False).
źródło
==
się&
?Ruby - 17 znaków (czwarta próba)
Moim obecnym najlepszym jest połączenie odpowiedzi @ steenslag z moją własną. Poniżej znajdują się moje poprzednie próby.
Ruby - 19 znaków (trzecia próba)
Rubin - 22 znaków (druga próba)
Ruby - 24 znaki (pierwsza próba)
źródło
K / Kona (
2417)Zwraca 1, jeśli prawda, i 0, jeśli fałsz. Każda moc 2 ma pojedynczy bit równy 1:
(to wypisuje wszystkie potęgi 2 (od 0 do 9) binarnie)
Podsumowuję więc wszystkie składniki wyrażenia binarnego
x
i sprawdzam, czy jest ono równe 1; jeśli takx=2^n
, to w przeciwnym razie nie.... wiedziałem, że mogę to zmniejszyć
źródło
C # (54 znaki)
źródło
Int32
, a nieToInt32
...int
zamiast oInt32
2 mniej znaków.Rebmu (9 znaków)
Test
Rebmu jest zwężonym dialektem Rebola. Kod jest zasadniczo:
Alternatywny
14 znaków - Rebmu nie ma „mushed” bitowego AND ~
W Rebol:
źródło
GTB , 46 bajtów
źródło
Python, 35
Nie używa nie tylko operacji +/-, ale również operacji matematycznych oprócz konwersji do postaci binarnej.
Inne rzeczy (ciekawe, ale nie dla konkurencji):
Mam również wersję wyrażenia regularnego (61) :
(Podoba mi się ten pomysł, ale funkcja importu i dopasowania powoduje, że jest za długi)
I ładna, ale nudna wersja operacji bitowych (31) :
(tak, jest krótszy, ale używa ~ -x do zmniejszenia, co zawiera - operacja)
źródło
Python 2.7 (
30293937)EDYCJA: Zaktualizowano ze względu na wymagania użytkownika;
Brutalna siła, spróbuj podzielić, aż = 1 (sukces) lub <1 (niepowodzenie)
źródło
not a%2
można zapisać jakoa%2==0
. To prawda, że byłoby to dłużej w wielu językach, ale nie w Pythonie.a%2<1
.2.
usunięciu masz spację , która oszczędziłaby bajt!Python (33)
źródło
int(bin(input()*2)[3:])<1
działa również z powłoki pytona z tylko 25 znakami.Ruby,
33,28, 25źródło
APL (12 dla 0/1, 27 dla tak / nie)
lub, jeśli musimy wyprowadzić tekst:
Wczytaj A. Utwórz wektor 0..A, a następnie wektor 2 0 .2 A. (tak, to bardziej niż to konieczne), a następnie wektorem porównywania każdego z tych (w wyniku tworząc wektor 0 i co najwyżej jeden 1), a następnie xor że (w APL nie ma operatora xor, ale ≠ zastosowane do boolanów będzie działać jak jeden). Mamy teraz 0 lub 1.
Aby uzyskać TAK lub NIE: pomnóż 0 lub 1 przez 3, upuść tę liczbę znaków z „TAK”, a następnie weź pierwsze 3 znaki.
źródło
C, 65 bajtów
źródło
main(k){...
, polegając na niejawnymint
pisaniu. Może to być UB, ale to jest golf golfowy. Oczywiście NIGDY nie używaj czegoś takiego w produkcji.Haskell (
5250)źródło