Czy to liczba Cyklopów? "Nikt nie wie!

66

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ą 0w ś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, decimalEtc.)

  • 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ść 0false, 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 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!

Tau
źródło
25
Uwaga: To jest A129868
tsh
35
+1 za odniesienie do późnej popkultury z 2800 lat w tytule
Sanchises
jaka jest maksymalna liczba, która jest testowana?
Serverfrog
@Serverfrog, ponieważ nie określiłem limitu, załóż, że można przetestować każdą dodatnią liczbę całkowitą.
Tau
Czy wejście binarne jest dozwolone?
Qwertiy

Odpowiedzi:

11

Japt, 8 bajtów

1¥¢q0 äè

Uruchom to online

Wyjaśnienie:

1¥¢q0 äè   
                                                              119
  ¢          // Convert the input into a binary string        "1110111"
   q0        // Split the string on "0"                       ["111","111"]
      ä      // Reduce each item by:                            a     b
       è     //   Seeing how many times a is found in b       [1]
 1¥          // == 1; See if the result equals 1              True                                         

Chodzi o podzielenie ciągu binarnego na 0, co dałoby dwa elementy, jeśli jest tylko jeden 0. Następnie sprawdzamy, czy pierwszy element pasuje do drugiego, aby upewnić się, że jest palindromiczny. Jeśli ciąg binarny zawiera wiele 0s, wówczas redukcja zwróci tablicę wielopunktową, co nie spełni ==1warunku. Jeśli ciąg binarny zawiera jeden 0, ale nie jest palindromiczny, äèzwróci, 0ponieważ bzawiera 0dopasowania a.

Oliver
źródło
1
Kilka sekund zajęło mi mózg z kofeiną, żeby zobaczyć, co się tutaj dzieje! Ładnie wykonane. powinien również działać.
Kudłaty
1
Nie znam Japt, ale jeśli dobrze rozumiem, wykonuje następujące czynności: ¤= konwersja na binarną; q0= podział na 0; äèNie jestem do końca pewien ..; a flaga -Nkonwertuje listy na NaN, ale pozostawia 0i 1to samo. Dla äèczęści, którą widzę, 119to jest [111,111]po podziale, który äèzmienia się na 1; i 85jest [1,1,1,1]po podziale, który äèzmienia się na [1,1,1]. Czy możesz wyjaśnić, jak .ä("è")działa?
Kevin Cruijssen
2
@KevinCruijssen Dodałem wyjaśnienie. Mam nadzieję że to pomogło.
Oliver,
1
Czy NaNFalsey 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”). 2Daje również wyniki, 2które wątpię w falsey (ale może tak być, jeśli Japt jest jak 05AB1E).
Jonathan Allan
1
JS zakłada, że ​​jakakolwiek liczba całkowita inna niż 0uważana jest za prawdziwą ... jednak, jeśli 2zwraca wartość 2prawdy, może to wymagać przerobienia.
Tau
21

Python 2 , 30 bajtów

lambda n:(2*n^2*n+3)**2==8*n+9

Wypróbuj online!

Zauważ, że 2*n^2*n+3jest to bitowa xor 2*ni 2*n+3, ponieważ jest to pierwszeństwo operatora Pythona.

xnor
źródło
1
Czy zwrot byłby dopuszczalny lambda n:(2*n^2*n+3)**2-8*n-9z wartością zwracaną 0dla liczb cyklopów?
Eric Duminil
2
Daje to TRUEdon = -1
user2390246
3
@ user2390246 ten problem wyraźnie nie jest przeznaczony dla negatywów - gdyby tak było, wszystkie zaakceptowane rozwiązania musiałyby być negatywami (a sposób, w jaki Python implementuje liczby całkowite, oznaczałby, że żadne rozwiązania nie powinny akceptować w pythonie)
DreamConspiracy
3
Liczby ujemne @SolomonUcko są zwykle przechowywane w postaci dwójkowej. Rozważ pierwsze liczby całkowite o stałym rozmiarze (na przykład 32-bitowe). Wśród innych właściwości TCR wymaga, aby MSB wynosił 1 w liczbach ujemnych i 0 w dodatnich. To natychmiast wymagałoby, aby wszystkie pozytywne wyniki były fałszywe. W Pythonie mamy jednak jeszcze większy problem. Liczby ujemne domyślnie mają nieskończoną sekwencję 1s w najbardziej znaczącym kierunku. Powodzenia w znalezieniu środka
DreamConspiracy
2
@ user2390246 Problem został edytowany od tego czasu, aby wyjaśnić, że nasz kod nie musi działać w przypadku negatywów. Można to załączyć dla 2 bajtów, dodając >1.
xnor
18

Kod maszynowy x86, 17 bajtów

8D 47 01 31 F8 89 C2 F7 D2 0F AF C2 8D 44 78 02 C3

Powyższe bajty definiują funkcję, która akceptuje 32-bitową wartość całkowitą wejściową (w EDIrejestrze 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 (w EAXrejestrze) 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)(2k11) , 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:

; EDI = input value
; EAX = output value (0 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 02        lea    eax, [eax + edi*2 + 2]  ; EAX  = (EAX + (EDI * 2) + 2)
C3                 ret                            ; return, with EAX == 0 for Cyclops number

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 :

; EDI = input value
; AL  = output value (1 == Cyclops number)
8D 47 01           lea    eax, [edi + 1]          ; \ EAX = ((EDI + 1) ^ EDI)
31 F8              xor    eax, edi                ; /
89 C2              mov    edx, eax                ; \ EDX = ~EAX
F7 D2              not    edx                     ; /
0F AF C2           imul   eax, edx                ; EAX *= EDX
8D 44 78 01        lea    eax, [eax + edi*2 + 1]  ; EAX  = (EAX + (EDI * 2) + 1)
40                 inc    eax                     ; EAX += 1
0F 94 C0           setz   al                      ; AL = ((EAX == 0) ? 1 : 0)
C3                 ret                            ; return, with AL == 1 for Cyclops number

Pierwsza połowa tego kodu jest taka sama jak oryginał (w dół imulinstrukcji). leaJest prawie taka sama, ale zamiast dodawania stałej 2, to tylko dodaje stałą 1. To dlatego, że następujące incwskazówki zwiększa wartość w EAXrejestrze przez 1, aby ustawić flagi. Jeśli ustawiona jest flaga „zero”, setzinstrukcja zostanie ustawiona ALna 1; w przeciwnym razie ALzostanie ustawiony na 0. Jest to standardowy sposób, w jaki kompilator C generuje kod maszynowy, aby zwrócić a bool.

Zmiana stałej dodanej w leainstrukcji oczywiście nie zmienia rozmiaru kodu, a incinstrukcja jest bardzo mała (tylko 1 bajt), ale setzinstrukcja ma dość duże 3 bajty. Niestety nie mogę wymyślić krótszego sposobu napisania tego.

Cody Gray
źródło
4
To jest tak szybkie, myślę, że zasługuje na pochwalenie się testowaniem wszystkich liczb o dużej wartości: Wypróbuj online!
Deadcode
Powinno być nawet szybsze, @Deadcode. :-) Zademonstrowanie go za pomocą wbudowanego zestawu dodaje trochę narzutu, ale moja stara sztuczka polegająca na przeskakiwaniu do ciągu bajtów (patrz np. Ta odpowiedź ) przestała działać z kompilatorem TIO, a pisanie kodu do drukowania wyników bezpośrednio w zestawie jest zbyt duże pracować, aby zawracać sobie głowę. Jest to jednak jeden z tych niezwykłych przypadków, w których optymalizacja pod kątem wielkości nie stoi w sprzeczności z optymalizacją pod kątem prędkości. Jest to sposób, w jaki pisałbyś kod w asm, gdybyś dążył do szybkości przekraczającej rozmiar.
Cody Gray
W drodze konsensusu, to nie do przyjęcia, aby powrócić flagę stanu w składania ASM codegolf.stackexchange.com/a/165020/84624 i stackoverflow.com/questions/48381234/... . Jeśli tak, możesz - 3 z drugiej odpowiedzi.
640 KB
9

Regex (ECMAScript), 60 58 57 60 58 bajtów

nx

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 .

z
z

zn=2(nz)+z+1n

^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$

Wypróbuj online!

^                 # N = tail
(x*)              # tail = Z, with the smallest value that satisfies the following
                  # assertions (which is no different from the largest value that
                  # would satisfy them, since no more than one value can do so);
                  # \1 = N - Z

(?!(x(xx)+)\2*$)  # Assert Z is a power of 2

# Assert Z is a perfect square, and take its square root
(x(x*))           # \4 = square root of Z; \5 = \4 - 1; tail = N - \1 - \4
(?=(\4*)\5+$)     # iff \4*\4 == Z, then the first match here must result in \6==0
(?=\4*$\6)        # test for divisibility by \4 and for \6==0 simultaneously

# Assert that N == \1*2 + \4 + 1. If this fails, then due to a golf optimization,
# the regex engine will backtrack into the capturing of \4, and try all smaller
# values to see if they are the square root of Z; all of these smaller values will
# fail, because the \4*\4==Z multiplication test only matches for one unique value
# of \4.
x\1$

|^$               # Match N==0, because the above algorithm does not
Deadcode
źródło
OP wyjaśnił, że 0 powinno być zgodne z prawdą, więc obecnie nie rozwiązuje to problemu.
Grimy
1
Czy to nie jest proste ^(1*)0\1$?
Wcielenie nieznajomości
4
@EmbodimentofIgnorance Tylko jeśli dane wejściowe były w formacie binarnym. Trywializowałoby to wiele wyzwań; konsekwentne stosowanie jednoargumentowego wprowadzania tam, gdzie ma to zastosowanie, jest znacznie bardziej interesujące.
Deadcode
7

Perl 6 , 23 bajtów

{.base(2)~~/^(1*)0$0$/}

Wypróbuj online!

Rozwiązanie oparte na regeksie

Jo King
źródło
7

Mathematica (język Wolfram), 32 31 bajtów

1 bajt zapisany dzięki J42161217!

OddQ@Log2[#+Floor@Sqrt[#/2]+2]&

Wypróbuj online!

Czysta funkcja przyjmuje liczbę całkowitą jako dane wejściowe i zwraca Truelub False. Opierając się na fakcie (zabawa udowodnić!), Że liczba njest Cyclops wtedy i tylko wtedy nplus pierwiastek kwadratowy n/2plus 2zaokrągla w dół do nieparzystej potęgi 2. (Można zastąpić Floorprzez jedną Ceilinglub Roundtak długo, jak jeden zastępuje również +2przez +1). Zwraca Truena wejściu 0.

Greg Martin
źródło
1
możesz zapisać 1 bajt, używającLog2[#+Floor@Sqrt...
J42161217
i 1 więcej za pomocą √()zamiastSqrt[]
attinat
Czy liczba bajtów jest poprawna? TIO daje 32 bajty dla bieżącego programu.
mbomb007
@ mbomb007 aha, TIO nie zawierało 1-bajtowych oszczędności J42161217. Naprawiony.
Greg Martin
Czy był powód, dla którego nie wykorzystałeś sugerowanego attinat?
mbomb007
6

Ruby , 24 bajty

->x{x+x+2==(1+x^=x+1)*x}

Wypróbuj online!

GB
źródło
Miły. Może istnieć krótsza wersja z różnymi zadaniami i pierwszeństwem, ale nie mogłem jej znaleźć.
Eric Duminil
5

Japt, 8 bajtów

¢ðT ¥¢Êz

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

¤f/^(1*)0\1$/ l

Zwraca 1 dla wartości true, 0 dla wartości false.

Wypróbuj online!

Wcielenie ignorancji
źródło
Dobrze zagrane, powinienem kiedyś naprawdę nauczyć się wyrażeń regularnych. :) +1
Quintec
1
@Quintec Regex jest niesamowity :)
of Ignorance
Aktualizacja: znaleziono krótszą drogę :)
Quintec
1
8 bajtów
Luis felipe De jesus Munoz
1
@LuisfelipeDejesusMunoz Dzięki, to naprawdę miłe użytkowanie ==operatora!
Wcielenie nieznajomości
4

Galaretka ,  8  7 bajtów

-1 dzięki Eryka Outgolfer (stosowanie isPalindrome wbudowany, ŒḂzamiast ⁼Ṛ$)

B¬ŒḂ⁼SƊ

Monadyczny link akceptujący liczbę całkowitą, która daje 1(prawda) lub 0(falsey).

Wypróbuj online!

W jaki sposób?

B¬ŒḂ⁼SƊ - Link: integer             e.g. 1    9          13         119
B       - to base 2                      [1]  [1,0,0,1]  [1,1,0,1]  [1,1,1,0,1,1,1]
 ¬      - logical NOT (vectorises)       [0]  [0,1,1,0]  [0,0,1,0]  [0,0,0,1,0,0,0]
      Ɗ - last three links as a monad:
  ŒḂ    -   is a palindrome?             1    1          0          1
     S  -   sum                          0    2          1          1
    ⁼   -   equal?                       0    0          0          1
Jonathan Allan
źródło
Wygląda na to, że miałeś przede mną sprytny pomysł, ale jego spryt nie jest oczywisty ( Bċ0⁼1ȧŒḂma również 8 bajtów), ⁼Ṛ$jest taki sam jak ŒḂdla -1. Ponadto nie musisz obsługiwać liczb ujemnych.
Erik the Outgolfer
Dzięki Erik, wbudowany palindrom wymknął mi się z jakiegoś powodu!
Jonathan Allan
W rzeczywistości możesz też używać go ṚƑna swoim miejscu, więc możesz chcieć o tym pamiętać (najważniejsze Ƒ).
Erik the Outgolfer
4

Regex (ECMAScript), 53 47 bajtów

-6 bajtów dzięki Deadcode i Grimy

^((?=(x*?)(\2((x+)x(?=\5$))+x$))(?!\2{6})\3x)*$

Wypróbuj online!

H.PWiz
źródło
W trakcie pełnego komentowania i potwierdzania wyrażenia regularnego (jeszcze nie do końca skończonego) sprowadziłem go do 50 bajtów: ^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$( Wypróbuj online! )
Deadcode
4

Brachylog , 8 bajtów

ḃD↔Dḍ×ᵐ≠

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

          Input is an integer
ḃ         Get its binary representation, a list of 1's and 0's
 D        Call that list D
  ↔       When reversed...
   D      It's the same value D
    ḍ     Dichotomize: break the list into two halves
          One of these halves should be all 1's; the other should contain the 0
     ×ᵐ   Get the product of each half
       ≠  Verify that the two products are not equal

Udaje się to tylko po podaniu numeru Cyklopa, ponieważ:

  • Jeśli reprezentacja binarna nie jest palindromem, D↔Dzawiedzie; poniżej możemy założyć, że jest to palindrom.
  • Jeśli jest więcej niż jedno zero, obie połowy będą zawierać co najmniej jedno zero. Zatem oba produkty będą równe zero i ×ᵐ≠zawiodą.
  • Jeśli nie ma zera, obie połowy będą zawierać tylko jedne. Tak więc oba produkty będą jednym i ×ᵐ≠zawiodą.
  • To pozostawia przypadek, w którym jest dokładnie jedno zero; skoro już wiemy, że mamy palindrom, musi to być najważniejszy element. Pojawi się za pół, powodując, że iloczyn tej połowy będzie wynosił zero; druga połowa będzie zawierać wszystkie, więc jej produktem będzie jeden. Następnie mamy 1 ≠ 0, ×ᵐ≠sukces i cały predykat się udaje.
DLosc
źródło
3

Ruby , 27 24 bajtów

Konwertuj na binarny i sprawdzaj za pomocą wyrażenia regularnego. Zwraca 0jeśli prawda, niljeśli fałsz.

-3 bajty dzięki GB .

->n{"%b"%n=~/^(1*)0\1$/}

Wypróbuj online!

Dla dwóch bajtów więcej istnieje bezpośredni port rozwiązania Python:

->n{(2*n^2*n+3)**2==8*n+9}
Eric Duminil
źródło
@GB Dziękuję bardzo!
Eric Duminil
3

05AB1E , 8 (lub 9) bajtów

bD0¢sÂQ*

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Zwraca 1jeśli prawda; 0lub jakakolwiek dodatnia liczba całkowita inna niż 1falsey. Tylko w 05AB1E 1jest 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ż 1stały się 0:

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

b     # Convert the (implicit) input-integer to a binary-string
 D    # Duplicate it
  0¢  # Count the amount of 0s
 s    # Swap to get the binary again
  ÂQ  # Check if it's a palindrome
 *    # Multiply both (and output implicitly)

  Θ   # Optionally: check if this is truthy (==1),
      # resulting in truthy (1) or falsey (0)

Podejście arytmetyczne byłoby 10 bajtów:

LoD<s·>*Iå

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

a(n)=(2n1)(22n+1)

L        # Create a list in the range [1, (implicit) input-integer]
 o       # For each integer in the list, take 2 to the power this integer
  D<     # Create a copy, and decrease each value by 1
  s·     # Get the copied list again, and double each value
    >    # Then increase each value by 1
  *      # Multiply the numbers at the same indices in both lists
     Iå  # Check if the input-integer is in this list
         # (and output the result implicitly)
Kevin Cruijssen
źródło
Posiadanie 1ró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.
Tau
3

Excel, 97 63 bajtów

=A1=2*4^(ROUND(LOG(A1,4),0))-2^(ROUND(LOG(A1,4),0))-1

Oblicza 2 liczby:

Dwukrotnie najbliższa Moc 4
>Num|Binary|2*Power4|Binary
> 1| 1| 2* 1= 2| 10
> 2| 10| 2* 4= 8| 1000
> 4| 100| 2* 4= 8| 1000
> 20| 10100| 2*16=32|100000

 

1 Plus pierwiastek kwadratowy z najbliższej potęgi 4
>Num|Binary|1+√Power4|Binary
> 1| 1|1+ √1= 2| 10
> 2| 10|1+ √4= 3| 11
> 4| 100|1+ √4= 3| 11
> 20| 10100|1+ √16= 5| 101

Następnie odejmij drugą liczbę od pierwszej:

>Num|Binary|2*Power4|Binary|1+√Power4|Binary|a-b|Binary
> 1| 1| 2* 1= 2| 10|1+ √1= 2| 10| 0| 0
> 2| 10| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 4| 100| 2* 4= 8| 1000|1+ √4= 3| 11| 5| 101
> 20| 10100| 2*16=32|100000|1+ √16= 5| 101| 27| 11011

I porównaj ten wynik z oryginalnym numerem

Stara metoda

=DEC2BIN(A1)=REPLACE(REPT("1",1+2*INT(IFERROR(LOG(A1,2),0)/2)),1+IFERROR(LOG(A1,2),0)/2,1,"0")

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ść A1

Następnie porównaj go z reprezentacją binarną A1

Chronocidal
źródło
3

R , 37 33 bajtów

(x=scan())%in%(2*4^(n=0:x)-2^n-1)

Wypró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:xgeneruje 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 =.

użytkownik2390246
źródło
3

C (gcc), 26 bajtów

f(n){n=~n==(n^=-~n)*~n/2;}

Wypróbuj online!

Odpowiedź Porta Neila . Opiera się na zdefiniowanym przez implementację porządku operacji.

C ++ (clang), 38 bajtów

int f(int n){return~n==(n^=-~n)*~n/2;}

Wypróbuj online!

Nie można pominąć typów w C ++, nie można pominąć zwrotu w clang, w przeciwnym razie identyczne.

Umorusany
źródło
1
Wolałbym, aby odpowiedzi C ++ były odróżniane od odpowiedzi C przy użyciu returnzamiast wrażliwego i zależnego od platformy wykorzystania ukrytej wartości zwracanej akumulatora.
Deadcode
2
Chciałbym również, aby zasady wymagały zgodności ze standardami, ale nie są, więc nie skorzystanie z tego byłoby po prostu złym golfem. C ++ (clang) wymaga zwrotu, co daje 38 bajtów.
Grimy
Następnie możesz obejść ten problem, mając w odpowiedzi C (gcc) i C ++ (clang) zamiast C (gcc) i C ++ (gcc). Teraz to zrobiłem.
Deadcode
3

J , 22 19 17 15 14 bajtów

-3 bajty dzięki BolceBussiere!

-4 bajty dzięki ngn!

-1 bajt dzięki Traws!

J , 14 bajtów

1=1#.(*:|.)@#:

Wypróbuj online!

Galen Iwanow
źródło
1
#=1++/­­­­­­­
ngn
1
(#=1++/)@(*|.)@#:
ngn
1
1=1#.1-(*|.)@#:
ngn
1
nie wiem wystarczająco dużo, aby go użyć, ale fajnie jest uczyć się na kodach innych ludzi, próbując je skrócić
ngn
1
-1 bajt1=1#.(*:|.)@#:
Traws
2

Attache , 22 bajty

{Flip@_=_∧1=0~_}@Bin

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

Conor O'Brien
źródło
2

Retina 0.8.2 , 38 37 bajtów

.+
$*
+`^(1+)\1
$+0
10
1
^((1+)0\2)?$

Wypró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.

+`^(1+)\1
$+0
10
1

Konwertuj z unarskiego na binarny, używając metody z wiki Retina.

^((1+)0\2)?$

Sprawdź tę samą liczbę 1s przed i po 0, lub pusty ciąg znaków (w taki sposób powyższa konwersja obsługuje zero).

Neil
źródło
1

Partia, 39 37 bajtów

@cmd/cset/a"m=%1^-~%1,!(m/2*(m+2)-%1)

n=(2k+1)(2k11)m=2k1n=m2(m+2)n

Neil
źródło
1

Excel, 101 107 bajtów

-6 bajtów dzięki @Chronocidal.

=AND(ISEVEN(LOG(A1,2)),MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0",LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1)

Wykonuje 3 kontrole:

  • Dziwna długość
ISEVEN(LOG(A1,2))
  • Środkowa postać to 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • Jest singiel 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1
Wernisch
źródło
1
Zaoszczędź 6 bajtów, zmieniając ISODD(LEN(DEC2BIN(A1)))naISEVEN(LOG(A1,2))
Chronocidal
1

Regex (ECMAScript), 65 59 57 58 bajtów

+1 bajt, aby poprawnie obsłużyć 0

^((((x*)xx)\3)x)?(?=(\1*)\2*(?=\4$)((x*)(?=\7$)x)*$)\1*$\5

Wypróbuj online!

(2k1)(2k+1+1)

Umorusany
źródło
1

VBA, 41 36 bajtów

x=2^Int([Log(A1,4)]):?[A1]=2*x^2-x-1

Uruchom w oknie Natychmiastowe, z wyłączoną Jawną deklaracją. Dane wejściowe to komórka A1aktywnego 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(gdzie x = n-1dla n- tej liczby Cyklopów lub x = 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 !)

Chronocidal
źródło
1
Zamiast konwertować podstawę dziennika za pomocą podziału dziennika, możesz go zmienić bezpośrednio, używając [...]notacji jako[(Log(A1,4)]
Taylor Scott
1

PHP , 74 bajty

function($x){return($c=strlen($a=decbin($x)))&1&&trim($a,1)===$a[$c/2|0];}

Wypróbuj online!

Całkowicie naiwne niematematyczne podejście, tylko sznurki.

function cyclops( $x ) {
    $b = decbin( $x );     // convert to binary string (non-zero left padded)
    $l = strlen( $b );     // length of binary string
    $t = trim( $b, 1 );    // remove all 1's on either side
    $m = $b[ $l / 2 |0 ];  // get the middle "bit" of the binary string
    return 
        $l & 1 &&          // is binary string an odd length?
        $t === $m;         // is the middle char of the binary string the same as
                           // the string with left and right 1's removed? (can only be '0')
}

Lub 60 bajtów na podstawie powyższego algorytmu @ Chronocidal .

function($x){return decbin($x)==str_pad(0,log($x,2)|1,1,2);}

Wypróbuj online!

640 KB
źródło
1

Haskell, 82 bajty

import Text.Printf
(`all`[(==)<*>reverse,("0"==).filter(<'1')]).flip($).printf"%b"

I port rozwiązania xnor's Python:

Haskell, 47 bajtów

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
Joseph Sible
źródło