Это число Циклопа? "Никто не знает!


66

Задача:

С учетом целочисленного ввода выясните, является ли это число Циклопом.

Вы можете спросить, что такое число Циклопа? Ну, это число, двоичное представление которого имеет только один 0в центре!

Тестовые случаи:

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

Входные данные:

  • Целое число или эквивалентные типы. ( int, long, decimalИ т.д.)

  • Предположим, что если оценка входных данных приводит к целочисленному переполнению или другим нежелательным проблемам, то этот вход не должен оцениваться.

Выход:

  • Истина или ложь.

  • Выходные данные «Правда / ложь» должны соответствовать спецификациям используемого языка для «Правда / ложь». (например, C имеет значение 0false, ненулевое значение true)

Правила соревнований:

  • Предполагается, что входные данные, которые меньше 0, являются ложными и поэтому не требуют оценки.

  • Если длина двоичного представления числа четная, то число не может быть числом Циклопа.

Основные правила:


Это моя первая задача по Программированию Пазлов и Code Golf , поэтому любые отзывы о том, как я должен совершенствоваться, будут высоко оценены!


25
Примечание: Это A129868
TSH

35
+1 за 2800-летнюю позднюю ссылку на поп-культуру в названии
Sanchises

какое максимальное количество тестируется?
Serverfrog

@Serverfrog, так как я не указал ограничение, предположим, что любое положительное целое число может быть проверено.
Тау

Разрешен ли двоичный ввод?
Qwertiy

Ответы:


11

Japt, 8 байт

1¥¢q0 äè

Запустите его онлайн

Объяснение:

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                                         

Идея состоит в том, чтобы разбить двоичную строку в 0, что даст два элемента, если есть только один 0. Затем мы видим, соответствует ли первый элемент второму, чтобы убедиться, что он является палиндромным. Если двоичная строка содержит несколько 0s, то при редукции будет возвращен массив из нескольких элементов, и это ==1условие не будет выполнено . Если двоичная строка содержит ее 0, но не является палиндромной, äèона вернется, 0поскольку bсодержит 0совпадения a.


1
У меня ушло несколько секунд на мозг с кофеином, чтобы увидеть, что здесь происходит! Красиво сделано. также должен работать.
Мохнатый

1
Я не знаю Japt, но если я правильно понимаю, он делает следующее: ¤= преобразовать в двоичный файл; q0= разделить на 0 с; äèЯ не совсем уверен ..; и флаг -Nпреобразует списки в NaN, но оставляет 0и 1то же самое. Для äèчасти, которую я вижу, 119это [111,111]после разделения, которое äèменяется на 1; и 85это [1,1,1,1]после раскола, который äèменяется на [1,1,1]. Не могли бы вы объяснить, как .ä("è")работает?
Кевин Круйссен

2
@KevinCruijssen Я добавил объяснение. Надеюсь, это поможет.
Оливер

1
Является ли NaNfalsey в Japt? (то есть , если вы выполняете , если- то еще с тем , как условие делает , если начать выполняться? «Truthy / falsy выход должен соответствовать спецификации используемого языка для truthy / falsy») Кроме того, 2доходность 2которых я Сомнение falsey (но может быть , если Japt это как 05AB1E).
Джонатан Аллан

1
JS предполагает, что любое целое число, отличное от 0правдивого ... однако, если 2возвращается 2как правдивое, то это представление, возможно, потребуется переработать.
Тау

21

Python 2 , 30 байт

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

Попробуйте онлайн!

Обратите внимание, что 2*n^2*n+3это побитовый xor 2*nи 2*n+3, потому что это приоритет оператора Python.


1
Было бы приемлемо вернуться lambda n:(2*n^2*n+3)**2-8*n-9с возвращаемым значением 0для числа циклопов?
Эрик Думинил

2
Это дает TRUEдляn = -1
user2390246

3
@ user2390246 эта проблема явно не предназначена для негативов - если бы это было так, все принимающие решения должны были бы быть негативами (а то, как python реализует целые числа, означало бы, что ни одно решение не должно приниматься в python)
DreamConspiracy

3
@SolomonUcko отрицательные числа, как правило, хранятся в виде дополнения до двух. Рассмотрим первые целые числа фиксированного размера (например, 32-битные). Среди других свойств TCR требует, чтобы MSB равнялся 1 в отрицательных числах и 0 в положительных. Это немедленно потребовало бы, чтобы все положительные результаты были ложными. В Python у нас есть еще больше проблем. Отрицательные числа неявно имеют бесконечную последовательность из 1 в наиболее значимом направлении. Удачи в попытках найти середину этого
DreamConspiracy

2
@ user2390246 Проблема была с тех пор отредактирована, чтобы разъяснить, что наш код не должен работать для негативов. Это может быть обработано для 2 байтов путем добавления >1.
xnor

18

Машинный код x86, 17 байт

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

Вышеуказанные байты определяют функцию, которая принимает 32-разрядное целочисленное входное значение (в EDIрегистре для этого примера, следуя общему соглашению о вызовах System V, но вы можете фактически выбрать практически любой входной регистр, который вы хотите, не влияя на размер получаемого результата). код) и возвращает результат (в EAXрегистре), указывающий, является ли входное значение числом Циклопа.

Предполагается, что входные данные являются целыми числами без знака, поскольку в правилах вызова указано, что мы можем игнорировать отрицательные значения.

Логика принятия решения заимствована из ответа Нейла : поскольку число Циклопа имеет вид , мы можем использовать серию операций переворота битов для проверки вход.Nзнак равно(2К+1)(2К-1-1)

Примечание: возвращаемое значение - истина / ложь, но семантика обратная, так что функция возвращает ложь для числа Циклопа. Я утверждаю, что это законно, потому что машинный код не имеет «спецификации для правдивости / ложности», что является требованием в вопросе. (См. Ниже альтернативную версию, если вы думаете, что это обман.)

В мнемонике языка ассемблера это:

; 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

Попробуйте онлайн!


Как и было обещано, если вы думаете, что обманывать инвертирование семантики истины / фальши даже в машинном коде, где нет реальных стандартов или соглашений, добавьте еще три байта, всего 21 байт :

; 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

Первая половина этого кода такая же, как и в оригинале (через imulинструкцию). Это leaпочти то же самое, но вместо добавления константы 2 добавляется только константа 1. Это потому, что следующая incинструкция увеличивает значение в EAXрегистре на 1, чтобы установить флаги. Если установлен флаг «ноль», setzинструкция будет установлена ALна 1; в противном случае ALбудет установлено значение 0. Это стандартный способ, которым компилятор C будет генерировать машинный код для возврата a bool.

Изменение константы, добавленной в leaинструкцию, очевидно, не меняет размер кода, и incинструкция очень мала (всего 1 байт), но setzинструкция занимает довольно много 3 байта. К сожалению, я не могу придумать более короткий способ написания этого.


4
Это так быстро, я думаю, что это стоит показать, проверив все числа до большого значения: попробуйте онлайн!
Deadcode

На самом деле это должно быть еще быстрее, @Deadcode. :-) Демонстрация этого с помощью встроенной сборки добавляет некоторые издержки, но мой старый трюк с переходом на строку байтов (см., Например, этот ответ ) перестал работать с компилятором TIO, и написание кода для печати результатов непосредственно в сборке - это слишком много работать, чтобы беспокоиться. Это один из тех необычных случаев, когда оптимизация по размеру не расходится с оптимизацией по скорости. Это почти то же самое, что вы написали бы код в asm, если бы вы стремились к скорости по размеру.
Коди Грей

По общему мнению, недопустимо возвращать флаг состояния в asm-представлении codegolf.stackexchange.com/a/165020/84624 и stackoverflow.com/questions/48381234/… . Если это так, вы могли бы - 3 из вашего второго ответа.
640KB

9

Регулярное выражение (ECMAScript), 60 58 57 60 58 байт

Вход в унарном виде, как длина строки s.Nx

ПРЕДУПРЕЖДЕНИЕ О СПОЙЛЕРЕ : для квадратного корня это регулярное выражение использует вариант обобщенного алгоритма умножения, который неочевиден и может быть полезной головоломкой для самостоятельной разработки. Для получения дополнительной информации см. Объяснение этой формы алгоритма в « Найти число Рокко» .

-2 байта, позволяя возвращаться в поискеZ -1 байта благодаря Grimy , ища от наименьшего к наибольшему, а не наоборот +3 байта, чтобы обработать ноль -2 байта, перемещая захват квадратного корня за пределы предвиденияz
Z

Это работает путем нахождения , идеальной квадратной степени 2, для которой . Это может удовлетворить только наибольшая совершенная квадратичная степень 2, не превышающая , но благодаря оптимизации для гольфа регулярное выражение пробует их все, начиная с наименьшего. Поскольку каждый соответствует числу циклопов, только самый большой из них может привести к совпадению.Zn=2(nz)+z+1N

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

Попробуйте онлайн!

^                 # 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

ОП пояснил, что 0 должно быть правдивым, так что в настоящее время это не решает проблему.
Grimmy

1
Разве это не ^(1*)0\1$достаточно просто ?
Воплощение невежества

4
@EmbodimentofIgnorance Только если вход был в двоичном виде. Это могло бы упростить множество проблем; последовательно использовать унарный ввод, где это применимо, гораздо интереснее.
Deadcode

9

JavaScript (Node.js) , 20 байт

p=>~p==(p^=p+1)*~p/2

Попробуйте онлайн!

Может быть, это правильно, может быть.

Спасибо, Грими, 1 байт сохранен.


JavaScript (Node.js) , 32 байта

f=(p,q)=>p&1?f(p/2,q+q|2):!(p^q)

Попробуйте онлайн!


JavaScript (Node.js) , 34 байта

p=>/^(1*)0\1$/.test(p.toString(2))

Попробуйте онлайн!



Тест, не соответствует
edc65

1
@ edc65 Обнаружили ли вы неудачный тест?
TSH

2
@tsh .testнет.match
только в ASCII

@ Только для ASCII Ничего себе, звучит разумно ... Как ты можешь это прочитать?
TSH



7

Mathematica (язык Wolfram), 32 31 байт

1 байт сохранен благодаря J42161217!

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

Попробуйте онлайн!

Чистая функция, принимающая целое число в качестве входных данных и возвращающая Trueили False. Основываясь на том факте (забавно доказать!), Что число nявляется циклопом тогда и только тогда, когда nплюс квадратный корень из n/2плюс 2округляет до нечетной степени 2. (Можно заменить Floorодним Ceilingили Roundдо тех пор, пока один также заменяется +2на +1.) Возвращает Trueна входе 0.


1
Вы можете сохранить 1 байт, используяLog2[#+Floor@Sqrt...
J42161217

и еще 1, используя √()вместоSqrt[]
attinat

Является ли количество байтов правильным? TIO дает 32 байта для текущей программы.
mbomb007

@ mbomb007 ага, TIO не включил 1-байтовую экономию J42161217. Исправлена.
Грег Мартин

Была ли причина, по которой вы не использовали то, что предложил attinat?
mbomb007


5

Japt, 8 байт

¢ðT ¥¢Êz

Спасибо Луису Фелипе де Хесусу Муньосу за исправление моего представления!

Попробуйте онлайн!

Старое решение на основе регулярных выражений, 15 байтов

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

Возвращает 1 для истины, 0 для ложных.

Попробуйте онлайн!


Хорошо сыграно, я должен когда-нибудь действительно выучить регулярные выражения. :) +1
Quintec

1
@Quintec Regex потрясающий :)
Воплощение невежества

Обновление: найдено более коротким путем :)
Quintec


1
@LuisfelipeDejesusMunoz Спасибо, это действительно хорошее использование ==оператора!
Воплощение невежества

4

Желе ,  8  7 байт

-1 благодаря Эрику Outgolfer (используйте встроенный isPalindrome ŒḂ, вместо ⁼Ṛ$)

B¬ŒḂ⁼SƊ

Монадическая ссылка, принимающая целое число, которое приводит к 1(truey) или 0(falsey).

Попробуйте онлайн!

Как?

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

Похоже, у вас на самом деле была умная идея до меня, но ее хитрость не очевидна ( Bċ0⁼1ȧŒḂтакже 8 байт), ⁼Ṛ$такая же, как и ŒḂдля -1. Кроме того, вам не нужно обрабатывать отрицательные числа.
Эрик Outgolfer

Спасибо, Эрик, встроенный палиндром почему-то ускользнул из моей памяти
Джонатан Аллан

На самом деле, вы также можете использовать ṚƑего в наше время, так что вы можете вспомнить это так (самые важные Ƒ).
Эрик Outgolfer


4

Регулярное выражение (ECMAScript), 53 47 байт

-6 байт благодаря как Deadcode, так и Grimy

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

Попробуйте онлайн!


В ходе полного комментирования и проверки вашего регулярного выражения (еще не совсем законченного) я сократил его до 50 байт: ^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$( Попробуйте онлайн! )
Deadcode

4

Брахилог , 8 байт

ḃD↔Dḍ×ᵐ≠

Это предикат, который успешно выполняется, если его ввод представляет собой число Циклопа, и завершается неудачей, если его ввод не является числом Циклопа. Успех / неудача - самая фундаментальная концепция правды / фальши в брахилоге.

Попробуйте онлайн! Или найдите все достоверные результаты до 10000 .

объяснение

          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

Это успешно, только если дан номер Циклопа, потому что:

  • Если двоичное представление не является палиндромом, D↔Dпроизойдет сбой; в дальнейшем мы можем предположить, что это палиндром.
  • Если имеется более одного нуля, обе половины будут содержать хотя бы один ноль. Таким образом, продукты будут как ноль, так и не ×ᵐ≠получится.
  • Если нет нуля, обе половины будут содержать только единицы. Таким образом, продукты будут как один, так и не ×ᵐ≠получится.
  • Это оставляет случай, когда есть ровно один ноль; поскольку мы уже знаем, что у нас есть палиндром, это должно быть центральным. Он появится в одной половине, в результате чего произведение этой половины будет равно нулю; вторая половина будет содержать все, поэтому его продукт будет один. Тогда мы имеем 1 ≠ 0, ×ᵐ≠успешно, и весь предикат успешно.

3

Рубин , 27 24 байта

Преобразовать в двоичный файл и проверить с помощью регулярного выражения. Возвращает, 0если true, nilесли false.

-3 байта благодаря ГБ .

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

Попробуйте онлайн!

Еще на два байта есть прямой порт решения Python:

->n{(2*n^2*n+3)**2==8*n+9}

@GB Большое спасибо!
Эрик Думинил

3

05AB1E , 8 (или 9) байтов

bD0¢sÂQ*

Попробуйте онлайн или проверьте все контрольные примеры .

Возвращает 1если правдиво; 0или любое положительное целое число, кроме 1как фальси. В 05AB1E только 1правдиво, а все остальное ложно, но я не уверен, является ли это допустимым выводом, или если вывод должен быть двумя непротиворечивыми и уникальными значениями. Если второй, трейлинг Θможет быть добавлен, так что все выходы, кроме 1становятся 0:

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

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)

Арифметический подход будет 10 байтов:

LoD<s·>*Iå

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

a(N)знак равно(2N-1)*(2*2N+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)

Имея 1в truthy и все остальные номера как falsy является приемлемым для этой задачи, так как другие языки (например , C и TI-BASIC) имеют схожие truthy / falsy определения (0 / ненулевые для обоих). Если то, что считается правдивым или ложным, совпадает со спецификациями языка, то это справедливая игра.
Тау

3

Excel, 97 63 байта

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

Вычисляет 2 числа:

Дважды ближайшая сила 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 плюс квадратный корень из ближайшей степени 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

Затем вычтите второе число из первого:

>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

И сравните этот результат с исходным числом

Старый метод

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

Начните с Log-base-2 из A1 и округлите его до ближайшего четного числа, затем добавьте 1.

Затем создайте строку с таким количеством "1"s и замените средний символ на a, "0"чтобы создать число Циклопа с двоичной длиной, которая всегда нечетна, и равна или меньше 1 двоичной длины A1

Затем сравните его с двоичным представлением A1


3

R , 37 33 байта

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

Попробуйте онлайн!

В R нет встроенной функции для преобразования в двоичную форму, поэтому я просто использовал одну из формул из OEIS для вычисления списка терминов из последовательности.

n<-0:xгенерирует щедрый список начальных значений. 2*4^(n<-0:x^2)-2^n-1)это формула из OEIS, а затем он проверяет, появляется ли вход в этой последовательности, используя %in%.

-2 байта, не обрабатывая отрицательные входные данные. -2 байта, помня, я могу изменить <-на =.


3

C (gcc), 26 байтов

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

Попробуйте онлайн!

Порт Нейла ответ . Полагается на определенный порядок реализации операций.

C ++ (лязг), 38 байт

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

Попробуйте онлайн!

Не может опустить типы в C ++, не может опустить возвращение в Clang, в противном случае идентично.


1
Я бы предпочел, чтобы ответы на C ++ отличались от ответов на C с помощью использования returnуязвимости неявного и зависящего от платформы неявного эксплойта.
Deadcode

2
Я также хотел бы, чтобы правила требовали соответствия стандартам, но они этого не делают, поэтому неиспользование этого было бы просто плохим гольфом. C ++ (clang) требует возврата, что составляет 38 байтов.
Grimmy

Тогда вы можете обойти это, имея в своем ответе C (gcc) и C ++ (clang) вместо C (gcc) и C ++ (gcc). Я сейчас сделал это.
Deadcode


3

J , 22 19 17 15 14 байт

-3 байта благодаря BolceBussiere!

-4 байта благодаря ngn!

-1 байт благодаря Traws!

J , 14 байт

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

Попробуйте онлайн!


1
#=1++/­­­­­­­
НГН

1
(#=1++/)@(*|.)@#:
СПП

1
1=1#.1-(*|.)@#:
НГН

1
я не знаю достаточно j, чтобы использовать его, но интересно учиться на
чужом

1
-1 байт1=1#.(*:|.)@#:
тралы


2

Атташе , 22 байта

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

Попробуйте онлайн!

альтернативы

27 байт: {BitXor[2*_,2*_+3]^2=8*_+9}

27 байт: {BitXor@@(2*_+0'3)^2=8*_+9}

27 байт: {Palindromic@_∧1=0~_}@Bin

28 байт: {BitXor[...2*_+0'3]^2=8*_+9}

28 байт: {BitXor[…2*_+0'3]^2=8*_+9}

28 байт: {Same@@Bisect@_∧1=0~_}@Bin

29 байт: {_[#_/2|Floor]=0∧1=0~_}@Bin

30 байтов: Same@Bin@{_+2^Floor[Log2@_/2]}

30 байтов: {_[#_/2|Floor]=0and 1=0~_}@Bin


2

Сетчатка 0.8.2 , 38 37 байт

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

Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Изменить: После выяснения, предыдущее решение не обрабатывает ноль правильно. Объяснение:

.+
$*

Преобразовать из десятичной в одинарную.

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

Конвертировать из унарного в бинарный, используя метод из Retina wiki.

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

Проверьте наличие одинакового числа 1s до и после 0пустой строки или (как в приведенном выше преобразовании обрабатывается ноль).


1

Пакет, 39 37 байт

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

Пояснение: Число Циклопа имеет вид Nзнак равно(2К+1)(2К-1-1)мзнак равно2К-1Nзнак равном2(м+2)N


1

Excel, 101 107 байт

-6 байт благодаря @Chronocidal.

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

Выполняет 3 проверки:

  • Нечетная длина
ISEVEN(LOG(A1,2))
  • Средний символ 0
MID(DEC2BIN(A1),LEN(DEC2BIN(A1))/2+1,1)="0"
  • Есть один 0
LEN(SUBSTITUTE(DEC2BIN(A1),1,))=1

1
Сохранить 6 байтов, изменив ISODD(LEN(DEC2BIN(A1)))наISEVEN(LOG(A1,2))
Chronocidal

1

Регулярное выражение (ECMAScript), 65 59 57 58 байт

+1 байт для правильной обработки 0

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

Попробуйте онлайн!

Работает, утверждая, что вход имеет вид (2К-1)(2К+1+1)


1

VBA, 41 36 байт

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

Запустите в окне «Немедленно» с отключенным явным объявлением. Ввод - это ячейка A1активного листа. Выводит True / False в ближайшее окно.

Использует ту же логику, что и в моем ответе Excel, чтобы найти число Циклопа с таким же количеством битов (или на 1 бит короче, если есть четное число!), А затем сравнивает его с входным значением.

Сохраняет несколько байтов при вычислении чисел Циклопа, уменьшая их до формы y = 2x^2 - x - 1 (где x = n-1для n-го числа Циклопа, или x = 2^Int(Log([A1])/Log(4))чтобы найти наибольшее число Циклопа с меньшим или равным числом битов) и сохраняя x в переменной

(-5 байт благодаря Тейлору Скотту !)


1
Вместо того, чтобы преобразовывать базу журналов, используя деление журналов, вы можете изменить ее напрямую, используя [...]обозначения как[(Log(A1,4)]
Тейлор Скотт

1

PHP , 74 байта

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

Попробуйте онлайн!

Совершенно наивный нематематический подход, просто строки.

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')
}

Или 60 байтов на основе алгоритма @ Chronocidal выше .

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

Попробуйте онлайн!


1

Haskell, 82 байта

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

И порт решения xnor Python:

Haskell, 47 байтов

import Data.Bits
\n->(2*n`xor`(2*n+3))^2==8*n+9
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.