Liczba Cullen to dowolna liczba zawarta w sekwencji wygenerowanej za pomocą wzoru:
C (n) = (n * 2 ^ n) +1.
Twoje zadanie:
Napisz program lub funkcję, która odbiera dane wejściowe i wyświetla wartość prawda / fałsz na podstawie tego, czy dane wejściowe są liczbą Cullen.
Wkład:
Nieujemna liczba całkowita od 0 do 10 ^ 9 (włącznie).
Wydajność:
Wartość prawda / fałsz wskazująca, czy dane wejściowe są liczbą Cullen.
Przypadki testowe:
Input: Output:
1 ---> truthy
3 ---> truthy
5 ---> falsy
9 ---> truthy
12 ---> falsy
25 ---> truthy
Punktacja:
To jest golf golfowy , więc wygrywa najniższy wynik w bajtach.
code-golf
number
decision-problem
Gryphon - Przywróć Monikę
źródło
źródło
n
wydaje się być oparty na 0.Ḷ
R
Odpowiedzi:
Pyth,
65 bajtówspróbuj online
źródło
Kod maszynowy x86_64 ( System V ABI ),
2827 bajtów-1 bajt dzięki @Cody Gray, dzięki!
Algorytm stałego czasu!
Wyjaśnienie:
Niech y jest liczbą całkowitą i
x=y*2^y + 1
. Mamyy + log2(y) = log2(x-1)
więc dziennikiy=log2(x-1)-log2(y)
. Ponownie podając wartość y, otrzymujemyy=log2(x-1)-log2(log2(x-1)-log2(y))
. Robi to jeszcze raz, otrzymujemy:y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]
.Usuńmy ostatnie warunki (z rzędu
log2(log2(log2(log2(x))))
powinno to być bezpieczne!) I załóżmyx-1≈x
, że otrzymujemy:y≈log2(x)-log2[log2(x)-log2(log2(x))]
Teraz, pozwalając
f(n) = floor(log2(n))
, można zweryfikować ręcznie, żey
można je dokładnie pobrać :,y=f(x)-f[f(x)-f(f(x))]
dla y <26 , a zatem x ⩽ 10 ^ 9 , jak określono w wyzwaniu (1) .Algorytm składa się po prostu z obliczenia y dla x i sprawdzenia, czy x == y * 2 ^ y + 1 . Sztuczka polega na tym, że
f(n)
można ją po prostu zaimplementować jakobsr
instrukcję (odwrócenie skanowania bitów), która zwraca indeks pierwszego 1-bitu w n , iy*2^y
asy << y
.Szczegółowy kod:
(1) W rzeczywistości wydaje się, że ta równość obowiązuje dla wartości y do 50000.
źródło
eax
pozwoli Ci wyeliminowaćmovzbl
oszczędzając 1 bajt. Trzeba by było zrobić XOR przed,cmpl
więc nie będzie to oczywiście blokować flag, ale to jest całkowicie w porządku, ponieważ nic po tym nie zależyeax
. Lub możesz po prostu zdecydować, że metoda zwraca wartość logiczną tylko w 8 niższych bitach, oszczędzając wszystkie 3 bajty!Galaretka ,
76 bajtówWypróbuj online!
Pobiera dane wejściowe jako argument wiersza polecenia. Jeśli podano liczbę Cullen C ( n ), wyprowadza n +1 (co jest prawdą w Jelly, która jest niezerową liczbą całkowitą; zwróć uwagę, że mamy n ≥0, ponieważ wejście jest liczbą całkowitą, a liczby Cullen z ujemną n nigdy nie są liczbami całkowitymi) . Jeśli podano liczbę inną niż Cullen, zwraca 0, co jest falsey w galaretce.
Wyjaśnienie
Zasadniczo utwórz tablicę liczb Cullena minus jeden, a następnie poszukaj danych wejściowych minus jeden. Jeśli dane wejściowe to liczba Cullena, znajdziemy je, w przeciwnym razie nie będziemy. Zauważ, że tablica musi być wystarczająco długa, aby dotrzeć do wejścia, ponieważ C ( n ) jest zawsze większe niż n .
źródło
JavaScript (ES6),
3735 bajtówZaoszczędzono 2 bajty dzięki Neilowi
Próbny
Pokaż fragment kodu
źródło
x<n?f(n,k+1):x==n
działaundefined+1===NaN
ale-~undefined===1
. Możesz przeczytać więcej na ten temat tutaj .Haskell, 28 bajtów
Wypróbuj online!
źródło
Ohm , 8 bajtów
Wypróbuj online!
źródło
PHP , 43 bajty
Wypróbuj online!
źródło
$argn
jest zmienna specjalna? Zmiana na$a
oszczędziłaby 6 bajtów: tio.run$argn
jest dostępny, jeśli uruchamiasz PHP z wiersza poleceń z-R
opcją05AB1E , 7 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
R ,
535146 bajtówFunkcja anonimowa. Sprawdza, czy
x
jest generowany w sekwencji C (n) dla nw [0, x].3 bajty grał w golfa Giuseppe.
Wypróbuj online!
źródło
x%in%...
zamiastany(x==...)
; to zrzuci 4 bajtylapply
po prostu sprawdzanie wektora iscan
użyję zamiast brać argumenty funkcji - otrzymam odpowiedź @giuseppe. Dziękuję za opublikowanie go osobno, dzięki czemu mogę zobaczyć, czego mi brakuje - uczę się więcej, próbując czegoś na własną rękę, chociaż zazwyczaj przegrywam.C, C ++, Java, C #, D: 70 bajtów
Ze względu na podobieństwa między tymi wszystkimi językami ten kod działa dla każdego z nich
źródło
i=30;i--;)if(i<<i==n-1)
zamiasti=0;i<30;++i)if((1<<i)*i+1==n)
Python, 40 bajtów
Wypróbuj online!
źródło
Python 2 , 36 bajtów
Wypróbuj online!
Dane wyjściowe nie ulegają awariom / awariom, jak obecnie zezwala ten meta concensus .
Python 2 , 42 bajty
Wypróbuj online!
Dane wyjściowe za pośrednictwem kodu wyjścia
źródło
R , 26 bajtów
Wypróbuj online!
Nieco inne podejście niż druga odpowiedź R ; odczytuje z,
stdin
a ponieważ gwarantowane jest wejście od 0 do 10 ^ 9, musimy tylko sprawdzićn
od 0 do 26.źródło
scan()
. Dobra robota.APL (Dyalog) , 9 bajtów
Aby objąć przypadek n = 1, wymaga
⎕IO←0
domyślnej wartości w wielu systemach.Wypróbuj online!
⊢
[is] n (argument)∊
członek1
jeden+
plus⍳
z I ntegers 0 ... ( n -1)×
czasy2
dwa*
do potęgi⍳
z I ntegers 0 ... ( n -1)źródło
⎕IO←0
niestandardowych, ponieważ wielu z nich zawsze tak ustawia, bez konieczności każdorazowej specyfikacji.⎕IO←0
.Python 2 , 32 bajty
Wypróbuj online!
Tworzy listę liczb Cullen do
10^9
, a następnie zlicza, ile razy pojawia się na niej dane wejściowe. Dzięki Vincent za wskazanien<<n|1
zamiast(n<<n)+1
oszczędzania 2 bajtów.źródło
n<<n|1
(n<<n
będąc parzystym);)838860801
. Potrzebujeszrange(26)
, ponieważ zakres nie obejmuje.D, 65 bajtów
Jest to port algorytmu @ HatsuPointerKun do D (oryginał był już kodem D, ale dotyczy to sztuczek specyficznych dla D)
W jaki sposób? (D określone triki)
System szablonów D jest krótszy niż C ++ i może wnioskować o typach. Po deklaracji D inicjuje również zmienne do wartości domyślnych.
źródło
Mathematica, 30 bajtów
Czysta funkcja przyjmująca nieujemną liczbę całkowitą jako dane wejściowe i zwracające
True
lubFalse
. Jeśli dane wejściowe sąn
, to(r=Range@#-1)
ustawia zmiennąr
na{0, 1, ..., n-1}
, a następnier2^r+1
oblicza wektorowo pierwszen
liczby Cullen.MemberQ[...,#]
następnie sprawdza, czyn
jest elementem listy.źródło
Mathematica, 32 bajty
źródło
Excel VBA, 45 bajtów
Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z komórki
[A1]
i wysyła dane do bezpośredniego okna VBEMusi być uruchamiany w czystym module lub mieć wartości dla i, j być resetowany do wartości domyślnej 0 między przebiegami
Wejście wyjście
I / O jak widać w bezpośrednim oknie VBE
źródło
Swi-Prolog, 69 bajtów
f(X)
powiedzie się, jeśli może znaleźć wartość I, gdzie X = I * 2 ^ I + 1. Wskazówka zakresu powstrzymuje go przed wyczerpaniem miejsca na stosie, ale wystarcza dla zakresu liczb Cullen do 10 ^ 9 w specyfikacji pytania.na przykład
źródło
cQuents , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
TI-BASIC, 17 bajtów
Wyjaśnienie
źródło
QBIC , 24 bajty
Wyjaśnienie
źródło
k , 19 bajtów
Wypróbuj online. Prawda jest tablicą z liczbą:
,3
lub,0
et cetera. Falsey jest pustą tablicą:()
lub w!0
zależności od tłumacza.źródło
Java (OpenJDK 8) , 56 bajtów
Wypróbuj online!
źródło
Pari / GP , 25 bajtów
Wypróbuj online!
źródło