Czy ta liczba jest liczbą całkowitą -2?


41

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 : odpowiedź, która ma najmniej bajtów (w wybranym przez ciebie kodowaniu), jest zwycięzcą.


17
@KritixiLithos Nie rozumiem, dlaczego tak powinno być. Nie ma itakiej liczby całkowitej , że(-2)^i = 2
Fatalize

2
Czy wykładniki są dodatnie lub -0.5powinny być prawidłowe, ponieważ wynosi 2 ^ (- 1) .
Pan Xcoder,

1
@ Mr.Xcoder, Ponieważ dane wejściowe są zawsze liczbami całkowitymi , wykładnik ujemny nie będzie wymagany (ani możliwy).
Toby Speight

1
@SIGSEGV może, ale inie jest naturalne
Pan Xcoder

2
@Jason, tyle ile obsługiwane / naturalne w Twoim języku - patrz trzecia zasada. I to jest golf golfowy, ponieważ wymaga obiektywnego kryterium wygranej, aby być tutaj na temat - „przyjemne rozwiązanie” nie ucina go (chociaż podoba mi się odpowiedź Mathematica - to mnie zaskoczyło).
Toby Speight

Odpowiedzi:


26

Mathematica, 22 bajty

EvenQ@Log2@Max[#,-2#]&

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 .
  • Ale nawet potęgi -2 są również parzyste potęgi 2 , więc możemy użyć prostej Log2@...i sprawdzić, czy wynikiem jest liczba całkowita (aby sprawdzić, czy jest to potęga 2 ). To już oszczędza dwa bajty Log[4,...](inny sposób patrzenia na parzyste potęgi -2 ).
  • Dodatkową zaletą jest to, że sprawdzenie, czy wartość jest parzystą liczbą całkowitą, jest krótsze niż samo sprawdzenie, czy jest ona liczbą całkowitą: możemy zaoszczędzić jeszcze trzy bajty, używając EvenQzamiast IntegerQ.

Czy pomaga uznać, że nawet potęgi -2 są potęgami całkowitymi 4? Podoba mi się pomysł pomnożenia przez -2, aby wszystko było pozytywne - choć jestem rozczarowany, że do tej pory nie kręciło mi się trochę.
Toby Speight

5
@TobySpeight Traktowanie ich jako potęgi 2 faktycznie oszczędza 5 bajtów. Na początku użyłem mocy 4, ale Log[4,...]jest on dłuższy Log2@...i IntegerQdłuższy niż EvenQ.
Martin Ender,


12

Python , 46 bajtów

-2 bajty dzięki @ovs.

def g(x):
 while x%-2==0!=x:x/=-2
 return x==1

Funkcja z użyciem:

g(4) # put your number between the brackets

Wypróbuj online!


print g(8)odbitkiFalse
Felipe Nardi Batista

2
@FelipeNardiBatista, prawda?
Pan Xcoder,

2
przepraszam, mój przykład był zły, print g(4)robi to samo
Felipe Nardi Batista

Poczekaj, jest mały błąd, który naprawiam wkrótce
Mr. Xcoder

1
Umieściłem ;zamiast nowej linii ... przepraszam za to. Naprawiono @FelipeNardiBatista
Mr. Xcoder

11

Galaretka , 6 bajtów

b-2S⁼1

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 < BV 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 dV 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:

b-2S⁼1 Main link. Arguments: d
b-2    Convert d to base -2.
   S   Take the sum.
    ⁼1 Check if the sum is equal to 1.

1
Uff, wyjaśnienie to zajęło trochę czasu ...
Erik the Outgolfer

Nienawidzę patrzeć, jak wtedy wyglądałoby wytłumaczenie długiego programu ...
boboquack

1
@ Boboquack Wyjaśniam, dlaczego używam podstawowych rzeczy do konwersji. Nie sądzę, że wyjaśnienie długich programów byłoby tak długie. Post może zawierać do 30000 znaków przeceny, a wyjaśnienia dla dłuższych programów i tak byłyby bardziej zwięzłe. Przeczytałem też znacznie dłuższe wyjaśnienia i nie są one tak nudne.
Erik the Outgolfer



10

Excel, 40 36 bajtów

Zapisane 4 bajty przez CallumDA

Excel z pewnością może to zrobić, ale poprawianie błędów dodaje 11 bajtów

=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1

Dane wejściowe są w komórce A1. Dane wyjściowe to TRUElubFALSE

Gdyby dozwolone było zwrócenie jednego FALSElub #NUM!błędu dla fałszywych wartości, byłoby to tylko 25 bajtów:

=-2^IMREAL(IMLOG2(A1))=A1

Oto niewielka poprawa:=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
CallumDA

1
@CallumDA Dzięki! Próbowałem wymyślić sposób użycia funkcji liczb zespolonych, ale wszystko, co wymyśliłem, było dłuższe.
Inżynier Toast

9

05AB1E , 8 bajtów

Y(IÄÝm¹å

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

Y(         # push -2
  IÄÝ      # push range [0 ... abs(input)]
     m     # element-wise power
      ¹å   # check if input is in the resulting list

Dlaczego głosowanie negatywne?
Kritixi Lithos

@KritixiLithos: Wygląda na to, że ktoś nie ocenił wszystkich języków golfowych.
Emigna

6
Zauważyłem to również. Chociaż nie byłem długo w PPCG, dowiedziałem się, że kreatywne i interesujące rozwiązania w standardowych językach są o wiele bardziej doceniane niż rozwiązania 3-bajtowe w językach golfowych. Są jednak ludzie, którzy (niestety) głosują za bardzo kreatywnymi rozwiązaniami w językach golfowych, po prostu dlatego, że myślą, że wszystko jest wbudowane, i nie rozumieją, jak dobre są algorytmy (choć napisane w golfowych językach). +1 za niewiarygodne rozwiązanie @Emigna
Mr. Xcoder,

ÄLY(småOza 8. Y(sÄLm¢Zza 8… Nieważne, wszystkie 8.
Magiczna ośmiornica Urn

9

JavaScript (ES6), 37 28 24 bajtów

f=x=>!x|x%2?x==1:f(x/-2)

Zaoszczędź 4 bajty dzięki Arnauldowi.

f=x=>!x|x%2?x==1:f(x/-2)

console.log(f(-2));
console.log(f(-1));
console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(3));
console.log(f(4));


Dlaczego widzę błędy (przed wartościami prawda / fałsz) po kliknięciu „Uruchom fragment kodu”?
numbermaniac

@numbermaniac Nie jestem pewien, może używasz przeglądarki, która nie w pełni obsługuje ES6?
Tom

Welp, odświeżony i spróbował ponownie, bez błędów. Nie jestem pewien, co się stało za pierwszym razem.
numbermaniac


8

MATL , 9 8 bajtów

2_y|:q^m

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Jak to działa

Rozważ dane wejściowe -8jako przykład

2_    % Push -2
      % STACK: -2
y     % Implicit input. Duplicate from below
      % STACK: -8, -2, -8
|     % Absolute value
      % STACK: -8, -2, 8
:     % Range
      % STACK: -8, -2, [1 2 3 4 5 6 7 8]
q     % Subtract 1, element-wise
      % STACK: -8, -2, [0 1 2 3 4 5 6 7]
^     % Power, element-wise
      % STACK: -8, [1 -2 4 -8 16 -32 64 -128]
m     % Ismember. Implicit display
      % STACK: 1

Jeśli dobrze rozumiem twoje wyjaśnienie, to podając dane wejściowe n, tworzy to tablicę rozmiarów njako krok pośredni. Dobra robota, że ​​wydajność nie jest tutaj kryterium!
Toby Speight

2
@Toby Oczywiście! To jest golf golfowy, kogo obchodzi wydajność? :-D
Luis Mendo,


6

PHP, 41 bajtów

for(;$argn%-2==0;)$argn/=-2;echo$argn==1;

PHP, 52 bajty

echo($l=log(abs($argn),2))==($i=$l^0)&&$argn>0^$i%2;

PHP, 64 bajty

Praca z regexem

echo preg_match("#^".($argn>0?1:"1+0")."(00)*$#",decbin($argn));

5

Python 3, 34 bajty

lambda n:n==(-2)**~-n.bit_length()

5

JavaScript (ES6), 21 bajtów

Funkcja rekurencyjna, która zwraca 0lub true.

f=n=>n==1||n&&f(n/-2)

Jak to działa

Nie obejmuje to żadnego wyraźnego testu - takiego jak nbycie nieparzystym lub abs(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 njest dokładnie równy albo 1albo 0.

Działa to jednak, ponieważ dowolna liczba zmiennoprzecinkowa IEEE-754 zostanie ostatecznie zaokrąglona, 0gdy zostanie podzielona przez 2 (lub -2) wystarczającą liczbę razy, z powodu niedomiaru arytmetycznego .

Przypadki testowe



4

Java 7, 55 bajtów

boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

Wyjaśnienie:

boolean c(int n){  // Method with integer parameter and boolean return-type
  return n==0 ?    //  If n is zero:
    0>1//false     //   Return false
   : n%-2==0 ?     //  Else-if n mod -2 is zero:
    c(n/-2)        //   Recursive call for the input divided by -2
   :               //  Else:
    n==1;          //   Return if n is one
}                  // End of method

Kod testowy:

Wypróbuj tutaj.

class M{
  static boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

  public static void main(String[] a){
    for(int i = -2; i <= 4; i++){
      System.out.println(i + ": " + c(i));
    }
  }
}

Wynik:

-2: true
-1: false
0: false
1: true
2: false
3: false
4: true

Non-rekurencyjny sposób jest krótszy o 5 bajtów: boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}.
Olivier Grégoire,

@ OlivierGrégoire Niestety nie działa n=0w Javie, ponieważ 0%-2==0będzie truei 0/-2nadal 0powoduje nieskończoną pętlę, dlatego dodałem tę n==0?0>1część do mojej metody rekurencyjnej.
Kevin Cruijssen

Ładnie zauważony!
Olivier Grégoire,

4

Haskell, 24 23 bajty

f 0=0
f 1=1
f n=f(-n/2)

Definiuje funkcję, fktóra zwraca 1dla potęg -2 lub 0innych.

Golfowa wersja mojego pierwszego poddania się drugiemu wyzwaniu .


3

JavaScript (ES7), 45 bajtów

x=>-1**Math.log2(Math.abs(x))*Math.abs(x)==x

Math.abs (x) jest dłuższy niż x> 0? X: -x, 11 bajtów do 8 bajtów. Powinieneś także być w stanie zrobić -2 ** ... zamiast -1 ... aby usunąć drugi Math.abs (x)
fəˈnɛtɪk

Co jest w tym specyficzne dla ES7?
Arjun

@ DobbyTheFree-Elf, **jest.
Qwertiy

3

Perl 6 , 21 bajtów

{$_==(-2)**(.lsb//0)}

Spróbuj

Rozszerzony:

{  # bare block lambda with implicit parameter 「$_」

  $_                  # is the input
  ==                  # equal to
  (-2)**( .lsb // 0 ) # -2 to the power of the least significant bit of the input
}

Zauważ, że 0.lsbzwraca, Nilktó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 .


Podoba mi się ten!
tale852150,


3

Python , 24 bajty

lambda n:n*n&n*n-1<n%3%2

Wypróbuj online!

Bitowa sztuczka k&k-1==0sprawdza, czy kjest potęgą 2 (lub k==0). Sprawdzanie tego k=n*njako n*n&n*n-1==0mówi nam, czy abs(n)jest potęgą 2.

Aby dalej sprawdzić, czy njest 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==0i n%3==1w jedno wyrażenie. Pierwszy można napisać <1dla ==0, ponieważ nigdy nie jest on negatywny. Jest n%3==1to równoważne z n%3%2podaniem 0 lub 1. Możemy więc połączyć je jako n*n&n*n-1<n%3%2.


2

R, 22 bajty

Pobiera dane wejściowe ze standardowego wejścia, zwraca TRUElub FALSEodpowiednio.

scan()%in%(-2)^(0:1e4)

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ą:

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.

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:

scan()%in%(-2)^(0:Inf)

Oczywiście w prawdziwym R powyższy kod po prostu daje Error in 0:Inf : result would be too long a vector.


2

bc 88 bajtów

bc -l <<< "n=$1;q=l(sqrt(n*n));p=4*a(1);((n<1)*c(q/l(2)*p/2)+(n>1)*(s(q/l(4)*p)))^2==0"

Mam to w pliku neg2.shi drukuje 1dla potęgi -2i 0innych

Wiem, że to naprawdę długo, ale było fajnie

Test

$ for i in {-129..257}; do echo -n "$i: "; ./neg2.sh $i; done | grep ': 1'
-128: 1
-32: 1
-8: 1
-2: 1
1: 1
4: 1
16: 1
64: 1
256: 1

Wyjaśnienie

Główny korpus ma dwie połówki, obie próbują wyrównać zero do mocy -2.

q=l(sqrt(n*n))               % ln of the absolute value of the input
p=4*a(1)                     % pi: arctan(1) == pi/4
q/l(2) -> l(sqrt(n*n))/l(2)  % change of base formula -- this gives
                             % the power to which 2 is raised to equal
                             % sqrt(n*n). It will be an integer for 
                             % numbers of interest
n<1                          % 1 if true, 0 if false. for negative
                             % numbers check for powers of 2
n>1                          % for positive numbers, check for powers
                             % of 4
c(q/l(2)*p/2)                % cos(n*pi/2) == 0 for integer n (2^n)
s(q/l(4)*p)                  % sin(n*pi) == 0 for integer n (4^n)
(....)^2==0                  % square the result because numbers are
                             % not exactly zero and compare to 0

Nigdy nie spodziewałem się trygonometrii! Dobra odpowiedź!
Toby Speight


2

Fouriera , 53 bajty

I~X1~N~G0(0-2*G~GX*X~PG*G>P{1}{0~O~N}G{X}{1~O0~N}N)Oo

Później będę pracował nad golfem, ale jego zarys jest następujący:

X = User input
G = N = 1
Loop until N = 0
    G = -2 * G
    P = X*X 
    If G*G > P then
        N = O = 0
    End if
    If G = X then
        O = 1
        N = 0
    End if
End loop
Print O

Gdzie wyjście jest 0dla falsey i 1dla prawdy .

Wypróbuj online!


W opisie algo nie byłoby lepiej nie używać zmiennej P i pisać Jeśli G * G> X * X to ...?
RosLuP

@RosLuP Byłoby lepiej, ale Fourier po prostu traktowałby to jako(G*G > X)*X
Rozpad Bety

2

Casio BASIC , 76 bajtów

Zauważ, że 76 bajtów to, co mówi mój kalkulator.

?→X
0→O
While Abs(X)≥1
X÷-2→X
If X=1
Then 1→O
IfEnd
WhileEnd
O

To moje pierwsze przedsięwzięcie w Casio BASIC ... Nigdy nie zdawałem sobie sprawy, że mogę napisać tak przyzwoite programy na kalkulatorze: D


1

Python 2.7, 40 bajtów

a=input()
while a%-2==0:a/=-2
print a==1

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ć.


Jest to trochę to samo, ponieważ moja wersja odpowiedzi jest uniwersalna, więc działa zarówno w Pythonie 2, jak i 3. Jeśli miałbyś to zrobić w Pythonie 3, powinieneś dodać coś, int(input())co przekroczyłoby limit def-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 ...
Pan Xcoder

1

Siatkówka , 27 bajtów

+`(1+)\1
$1_
^(1|-1_)(__)*$

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 1spowodują, że dopasowanie i tak się nie powiedzie), podczas gdy ostatni wiersz sprawdza moc czterech lub ujemną moc nieparzystą z dwóch.

+`(1+)\1\1\1
$1_
^(-1)?1_*$

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_*$.

+`\b(1111)*$
$#1$*
^(-1)?1$

Wypróbuj online!

Tym razem dzielę tyle, ile mogę, i sprawdzam, 1czy -11na końcu.

+`\b(1+)\1\1\1$
$1
^(-1)?1$

Wypróbuj online!

Kolejny sposób dzielenia przez cztery. I wciąż irytująco 27 ​​bajtów ...


1

Schemat, 60 bajtów

(define(f n)(cond((= 1 n)#t)((<(abs n)1)#f)(#t(f(/ n -2)))))

Rozwiązanie rekurencyjne.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.