Zadanie:
Biorąc pod uwagę liczbę całkowitą, dowiedz się, czy jest to liczba Cyklopa.
Jaki jest numer Cyklopa, możesz zapytać? Jest to liczba, której reprezentacja binarna ma tylko jedną 0
w środku!
Przypadki testowe:
Input | Output | Binary | Explanation
--------------------------------------
0 | truthy | 0 | only one zero at "center"
1 | falsy | 1 | contains no zeroes
5 | truthy | 101 | only one zero at center
9 | falsy | 1001 | contains two zeroes (even though both are at the center)
10 | falsy | 1010 | contains two zeroes
27 | truthy | 11011 | only one zero at center
85 | falsy | 1010101 | contains three zeroes
101 | falsy | 1100101 | contains three zeroes
111 | falsy | 1101111 | only one zero, not at center
119 | truthy | 1110111 | only one zero at center
Wejście:
Typy całkowite lub równoważne. (
int
,long
,decimal
Etc.)Załóżmy, że jeśli ocena danych wejściowych powoduje przepełnienie liczb całkowitych lub inne niepożądane problemy, to danych wejściowych nie trzeba oceniać.
Wynik:
Prawda czy fałsz.
Wynik „prawda / fałsz” musi spełniać specyfikacje używanego języka dla „prawda / fałsz”. (np. C ma wartość
0
false, niezerową jak true)
Zasady Wyzwania:
Przyjmuje się, że dane wejściowe mniejsze niż 0 są fałszem i dlatego nie muszą być oceniane.
Jeśli długość binarnej reprezentacji liczby jest parzysta, to liczba nie może być liczbą Cyklopa.
Główne zasady:
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach!
Domyślne luki są zabronione.
Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy .
To moje pierwsze wyzwanie w zakresie programowania i gry w golfa Code , więc wszelkie uwagi na temat tego, jak powinienem poprawić, byłyby mile widziane!
Odpowiedzi:
Japt, 8 bajtów
Uruchom to online
Wyjaśnienie:
Chodzi o podzielenie ciągu binarnego na
0
, co dałoby dwa elementy, jeśli jest tylko jeden0
. Następnie sprawdzamy, czy pierwszy element pasuje do drugiego, aby upewnić się, że jest palindromiczny. Jeśli ciąg binarny zawiera wiele0
s, wówczas redukcja zwróci tablicę wielopunktową, co nie spełni==1
warunku. Jeśli ciąg binarny zawiera jeden0
, ale nie jest palindromiczny,äè
zwróci,0
ponieważb
zawiera0
dopasowaniaa
.źródło
r¶
powinien również działać.¤
= konwersja na binarną;q0
= podział na 0;äè
Nie jestem do końca pewien ..; a flaga-N
konwertuje listy naNaN
, ale pozostawia0
i1
to samo. Dlaäè
części, którą widzę,119
to jest[111,111]
po podziale, któryäè
zmienia się na1
; i85
jest[1,1,1,1]
po podziale, któryäè
zmienia się na[1,1,1]
. Czy możesz wyjaśnić, jak.ä("è")
działa?NaN
Falsey jest w Japt? (tzn. jeśli wykonasz z tym if-else jako warunek, czy zostanie wykonane wykonanie if? „Prawda / fałsz musi być zgodny ze specyfikacją używanego języka dla prawdy / fałsz”).2
Daje również wyniki,2
które wątpię w falsey (ale może tak być, jeśli Japt jest jak 05AB1E).0
uważana jest za prawdziwą ... jednak, jeśli2
zwraca wartość2
prawdy, może to wymagać przerobienia.Python 2 , 30 bajtów
Wypróbuj online!
Zauważ, że
2*n^2*n+3
jest to bitowa xor2*n
i2*n+3
, ponieważ jest to pierwszeństwo operatora Pythona.źródło
lambda n:(2*n^2*n+3)**2-8*n-9
z wartością zwracaną0
dla liczb cyklopów?TRUE
don = -1
>1
.Kod maszynowy x86, 17 bajtów
Powyższe bajty definiują funkcję, która akceptuje 32-bitową wartość całkowitą wejściową (w
EDI
rejestrze dla tego przykładu, zgodnie ze wspólną konwencją wywoływania Systemu V, ale w rzeczywistości można wybrać prawie dowolny rejestr wejściowy, który chcesz, bez wpływu na wielkość wynikowego kod) i zwraca wynik (wEAX
rejestrze) wskazujący, czy wartością wejściową jest liczba Cyklopa.Zakłada się, że dane wejściowe są liczbą całkowitą bez znaku, ponieważ reguły wyzwania stanowią, że możemy zignorować wartości ujemne.
Logika decyzyjna zapożyczona jest z odpowiedzi Neila : ponieważ liczba Cyklopów ma postaćn = ( 2k+ 1 ) ( 2k - 1- 1 ) , możemy użyć szeregu operacji kruszenia bitów w celu sprawdzenia danych wejściowych.
Uwaga: Zwracana wartość to prawda / fałsz, ale semantyka jest odwrócona, tak że funkcja zwróci fałsz dla liczby Cyklopa. Twierdzę, że jest to zgodne z prawem, ponieważ kod maszynowy nie ma „specyfikacji prawdy / fałszu”, co jest wymogiem w pytaniu. (Zobacz poniżej alternatywną wersję, jeśli uważasz, że to oszustwo).
W mnemonice języka asemblera jest to:
Wypróbuj online!
Zgodnie z obietnicą, jeśli uważasz, że oszustwo odwraca semantykę prawdy / fałszu nawet w kodzie maszynowym, w którym nie ma prawdziwych standardów lub konwencji, dodaj trzy kolejne bajty, w sumie 21 bajtów :
Pierwsza połowa tego kodu jest taka sama jak oryginał (w dół
imul
instrukcji).lea
Jest prawie taka sama, ale zamiast dodawania stałej 2, to tylko dodaje stałą 1. To dlatego, że następująceinc
wskazówki zwiększa wartość wEAX
rejestrze przez 1, aby ustawić flagi. Jeśli ustawiona jest flaga „zero”,setz
instrukcja zostanie ustawionaAL
na 1; w przeciwnym razieAL
zostanie ustawiony na 0. Jest to standardowy sposób, w jaki kompilator C generuje kod maszynowy, aby zwrócić abool
.Zmiana stałej dodanej w
lea
instrukcji oczywiście nie zmienia rozmiaru kodu, ainc
instrukcja jest bardzo mała (tylko 1 bajt), alesetz
instrukcja ma dość duże 3 bajty. Niestety nie mogę wymyślić krótszego sposobu napisania tego.źródło
Regex (ECMAScript),
6058576058 bajtówx
OSTRZEŻENIE SPOILERA : W przypadku pierwiastka kwadratowego, wyrażenie regularne używa wariantu uogólnionego algorytmu mnożenia, co nie jest oczywiste i może być satysfakcjonującą łamigłówką do samodzielnego opracowania. Aby uzyskać więcej informacji, zobacz wyjaśnienie tej formy algorytmu w Znajdź liczbę Rocco .
^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$
Wypróbuj online!
źródło
^(1*)0\1$
?JavaScript (Node.js) , 20 bajtów
Wypróbuj online!
Może to prawda.
Dzięki Grimy, zapisano 1 bajt.
JavaScript (Node.js) , 32 bajty
Wypróbuj online!
JavaScript (Node.js) , 34 bajty
Wypróbuj online!
źródło
.test
not.match
Perl 6 , 23 bajtów
Wypróbuj online!
Rozwiązanie oparte na regeksie
źródło
Japt ,
2519109 bajtówDzięki @Shaggy za -1 bajt
Wypróbuj online!
źródło
Mathematica (język Wolfram),
3231 bajtów1 bajt zapisany dzięki J42161217!
Wypróbuj online!
Czysta funkcja przyjmuje liczbę całkowitą jako dane wejściowe i zwraca
True
lubFalse
. Opierając się na fakcie (zabawa udowodnić!), Że liczban
jest Cyclops wtedy i tylko wtedyn
plus pierwiastek kwadratowyn/2
plus2
zaokrągla w dół do nieparzystej potęgi 2. (Można zastąpićFloor
przez jednąCeiling
lubRound
tak długo, jak jeden zastępuje również+2
przez+1
). ZwracaTrue
na wejściu0
.źródło
Log2[#+Floor@Sqrt...
√()
zamiastSqrt[]
Ruby , 24 bajty
Wypróbuj online!
źródło
Japt, 8 bajtów
Dzięki Luisowi Felipe de Jesus Munozowi za naprawienie mojego poddania się!
Wypróbuj online!
Stare rozwiązanie oparte na wyrażeniach regularnych, 15 bajtów
Zwraca 1 dla wartości true, 0 dla wartości false.
Wypróbuj online!
źródło
==
operatora!Galaretka ,
87 bajtów-1 dzięki Eryka Outgolfer (stosowanie isPalindrome wbudowany,
ŒḂ
zamiast⁼Ṛ$
)Monadyczny link akceptujący liczbę całkowitą, która daje
1
(prawda) lub0
(falsey).Wypróbuj online!
W jaki sposób?
źródło
Bċ0⁼1ȧŒḂ
ma również 8 bajtów),⁼Ṛ$
jest taki sam jakŒḂ
dla -1. Ponadto nie musisz obsługiwać liczb ujemnych.ṚƑ
na swoim miejscu, więc możesz chcieć o tym pamiętać (najważniejszeƑ
).Haskell , 32 bajty
Wypróbuj online!
źródło
Regex (ECMAScript),
5347 bajtów-6 bajtów dzięki Deadcode i Grimy
Wypróbuj online!
źródło
^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$
( Wypróbuj online! )Brachylog , 8 bajtów
Jest to predykat, który się powiedzie, jeśli jego dane wejściowe są liczbą Cyklopów i nie powiedzie się, jeśli jego dane wejściowe nie będą liczbą Cyklopów. Sukces / porażka jest najbardziej podstawową koncepcją typu prawda / falsey w Brachylog.
Wypróbuj online! Lub znajdź wszystkie prawdziwe dane wyjściowe do 10000 .
Wyjaśnienie
Udaje się to tylko po podaniu numeru Cyklopa, ponieważ:
D↔D
zawiedzie; poniżej możemy założyć, że jest to palindrom.×ᵐ≠
zawiodą.×ᵐ≠
zawiodą.×ᵐ≠
sukces i cały predykat się udaje.źródło
Ruby ,
2724 bajtówKonwertuj na binarny i sprawdzaj za pomocą wyrażenia regularnego. Zwraca
0
jeśli prawda,nil
jeśli fałsz.-3 bajty dzięki GB .
Wypróbuj online!
Dla dwóch bajtów więcej istnieje bezpośredni port rozwiązania Python:
źródło
05AB1E , 8 (lub 9) bajtów
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Zwraca
1
jeśli prawda;0
lub jakakolwiek dodatnia liczba całkowita inna niż1
falsey. Tylko w 05AB1E1
jest prawdą, a wszystko inne jest falsey, ale nie jestem pewien, czy jest to dozwolone wyjście, czy też wyjście powinno mieć dwie spójne i unikalne wartości. Jeśli drugi,Θ
można dodać końcowe, aby wszystkie wyjścia inne niż1
stały się0
:Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Podejście arytmetyczne byłoby 10 bajtów:
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
1
równie prawdziwej i wszystkich innych liczb jak fałsz jest dopuszczalne dla tego wyzwania, ponieważ inne języki (np. C i TI-BASIC) mają podobne definicje prawdziwości / fałszowania (0 / niezerowe dla obu). Dopóki to, co uważa się za prawdę lub fałsz, pasuje do specyfikacji języka, jest to uczciwa gra.Excel,
9763 bajtówOblicza 2 liczby:
Następnie odejmij drugą liczbę od pierwszej:
I porównaj ten wynik z oryginalnym numerem
Stara metoda
Zacznij od Log-base-2 z A1 i zaokrągl go w dół do najbliższej liczby parzystej, a następnie dodaj 1.
Następnie utwórz ciąg o takiej liczbie
"1"
s i zamień środkowy znak na,"0"
aby utworzyć liczbę Cyklopów o długości binarnej, która jest zawsze nieparzysta i taka sama lub mniejsza o 1 binarną długość A1Następnie porównaj go z reprezentacją binarną A1
źródło
R ,
3733 bajtówWypróbuj online!
R nie ma wbudowanego do konwersji na binarny, więc po prostu użyłem jednej z formuł z OEIS, aby obliczyć listę terminów z sekwencji.
n<-0:x
generuje hojną listę wartości początkowych.2*4^(n<-0:x^2)-2^n-1)
jest formułą z OEIS, a następnie sprawdza, czy dane wejściowe pojawiają się w tej sekwencji za pomocą%in%
.-2 bajty bez konieczności obsługi negatywnych danych wejściowych. -2 bajty, pamiętając, że mogę zmienić
<-
na=
.źródło
C (gcc), 26 bajtów
Wypróbuj online!
Odpowiedź Porta Neila . Opiera się na zdefiniowanym przez implementację porządku operacji.
C ++ (clang), 38 bajtów
Wypróbuj online!
Nie można pominąć typów w C ++, nie można pominąć zwrotu w clang, w przeciwnym razie identyczne.
źródło
return
zamiast wrażliwego i zależnego od platformy wykorzystania ukrytej wartości zwracanej akumulatora.C (gcc) ,
29 2827 bajtówZapisano 1 bajt dzięki @ceilingcat
Port 21-bajtowej odpowiedzi JS autorstwa @tsh .
Wypróbuj online!
źródło
J ,
2219171514 bajtów-3 bajty dzięki BolceBussiere!
-4 bajty dzięki ngn!
-1 bajt dzięki Traws!
J , 14 bajtów
Wypróbuj online!
źródło
#=1++/
(#=1++/)@(*|.)@#:
1=1#.1-(*|.)@#:
1=1#.(*:|.)@#:
Galaretka , 9 bajtów
Wypróbuj online!
źródło
Attache , 22 bajty
Wypróbuj online!
Alternatywy
27 bajtów:
{BitXor[2*_,2*_+3]^2=8*_+9}
27 bajtów:
{BitXor@@(2*_+0'3)^2=8*_+9}
27 bajtów:
{Palindromic@_∧1=0~_}@Bin
28 bajtów:
{BitXor[...2*_+0'3]^2=8*_+9}
28 bajtów:
{BitXor[…2*_+0'3]^2=8*_+9}
28 bajtów:
{Same@@Bisect@_∧1=0~_}@Bin
29 bajtów:
{_[#_/2|Floor]=0∧1=0~_}@Bin
30 bajtów:
Same@Bin@{_+2^Floor[Log2@_/2]}
30 bajtów:
{_[#_/2|Floor]=0and 1=0~_}@Bin
źródło
Retina 0.8.2 ,
3837 bajtówWypróbuj online! Link zawiera przypadki testowe. Edycja: po wyjaśnieniu poprzednie rozwiązanie nie obsługiwało zera poprawnie. Wyjaśnienie:
Konwertuj z dziesiętnego na jednoargumentowy.
Konwertuj z unarskiego na binarny, używając metody z wiki Retina.
Sprawdź tę samą liczbę
1
s przed i po0
, lub pusty ciąg znaków (w taki sposób powyższa konwersja obsługuje zero).źródło
Partia,
3937 bajtówźródło
Excel, 101
107bajtów-6 bajtów dzięki @Chronocidal.
Wykonuje 3 kontrole:
0
0
źródło
ISODD(LEN(DEC2BIN(A1)))
naISEVEN(LOG(A1,2))
Regex (ECMAScript),
65595758 bajtów+1 bajt, aby poprawnie obsłużyć 0
Wypróbuj online!
źródło
VBA,
4136 bajtówUruchom w oknie Natychmiastowe, z wyłączoną Jawną deklaracją. Dane wejściowe to komórka
A1
aktywnego arkusza. Wyświetla wartość True / False w bezpośrednim oknie.Używa tej samej logiki co moja odpowiedź Excela, aby znaleźć liczbę Cyklopów o tej samej liczbie bitów (lub 1 bit krótszą, jeśli liczba parzysta jest!), A następnie porównuje ją z danymi wejściowymi.
Zapisuje niektóre bajty podczas obliczania liczb Cyklopów, redukując je do postaci
y = 2x^2 - x - 1
(gdziex = n-1
dla n- tej liczby Cyklopów lubx = 2^Int(Log([A1])/Log(4))
znajdując największą liczbę Cyklopów z mniejszą lub równą liczbą bitów) i przechowując x w zmiennej(-5 bajtów dzięki Taylor Scott !)
źródło
[...]
notacji jako[(Log(A1,4)]
PHP , 74 bajty
Wypróbuj online!
Całkowicie naiwne niematematyczne podejście, tylko sznurki.
Lub 60 bajtów na podstawie powyższego algorytmu @ Chronocidal .
Wypróbuj online!
źródło
Haskell, 82 bajty
I port rozwiązania xnor's Python:
Haskell, 47 bajtów
źródło