Задача:
С учетом целочисленного ввода выясните, является ли это число Циклопом.
Вы можете спросить, что такое число Циклопа? Ну, это число, двоичное представление которого имеет только один 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 имеет значение
0
false, ненулевое значение true)
Правила соревнований:
Предполагается, что входные данные, которые меньше 0, являются ложными и поэтому не требуют оценки.
Если длина двоичного представления числа четная, то число не может быть числом Циклопа.
Основные правила:
Это код-гольф , поэтому самые короткие ответы в байтах выигрывают!
Лазейки по умолчанию запрещены.
К вашему ответу применяются стандартные правила с правилами ввода / вывода по умолчанию .
Это моя первая задача по Программированию Пазлов и Code Golf , поэтому любые отзывы о том, как я должен совершенствоваться, будут высоко оценены!
Ответы:
Japt, 8 байт
Запустите его онлайн
Объяснение:
Идея состоит в том, чтобы разбить двоичную строку в
0
, что даст два элемента, если есть только один0
. Затем мы видим, соответствует ли первый элемент второму, чтобы убедиться, что он является палиндромным. Если двоичная строка содержит несколько0
s, то при редукции будет возвращен массив из нескольких элементов, и это==1
условие не будет выполнено . Если двоичная строка содержит ее0
, но не является палиндромной,äè
она вернется,0
посколькуb
содержит0
совпаденияa
.источник
r¶
также должен работать.¤
= преобразовать в двоичный файл;q0
= разделить на 0 с;äè
Я не совсем уверен ..; и флаг-N
преобразует списки вNaN
, но оставляет0
и1
то же самое. Дляäè
части, которую я вижу,119
это[111,111]
после разделения, котороеäè
меняется на1
; и85
это[1,1,1,1]
после раскола, которыйäè
меняется на[1,1,1]
. Не могли бы вы объяснить, как.ä("è")
работает?NaN
falsey в Japt? (то есть , если вы выполняете , если- то еще с тем , как условие делает , если начать выполняться? «Truthy / falsy выход должен соответствовать спецификации используемого языка для truthy / falsy») Кроме того,2
доходность2
которых я Сомнение falsey (но может быть , если Japt это как 05AB1E).0
правдивого ... однако, если2
возвращается2
как правдивое, то это представление, возможно, потребуется переработать.Python 2 , 30 байт
Попробуйте онлайн!
Обратите внимание, что
2*n^2*n+3
это побитовый xor2*n
и2*n+3
, потому что это приоритет оператора Python.источник
lambda n:(2*n^2*n+3)**2-8*n-9
с возвращаемым значением0
для числа циклопов?TRUE
дляn = -1
>1
.Машинный код x86, 17 байт
Вышеуказанные байты определяют функцию, которая принимает 32-разрядное целочисленное входное значение (в
EDI
регистре для этого примера, следуя общему соглашению о вызовах System V, но вы можете фактически выбрать практически любой входной регистр, который вы хотите, не влияя на размер получаемого результата). код) и возвращает результат (вEAX
регистре), указывающий, является ли входное значение числом Циклопа.Предполагается, что входные данные являются целыми числами без знака, поскольку в правилах вызова указано, что мы можем игнорировать отрицательные значения.
Логика принятия решения заимствована из ответа Нейла : поскольку число Циклопа имеет вид , мы можем использовать серию операций переворота битов для проверки вход.n = ( 2К+ 1 ) ( 2к - 1- 1 )
Примечание: возвращаемое значение - истина / ложь, но семантика обратная, так что функция возвращает ложь для числа Циклопа. Я утверждаю, что это законно, потому что машинный код не имеет «спецификации для правдивости / ложности», что является требованием в вопросе. (См. Ниже альтернативную версию, если вы думаете, что это обман.)
В мнемонике языка ассемблера это:
Попробуйте онлайн!
Как и было обещано, если вы думаете, что обманывать инвертирование семантики истины / фальши даже в машинном коде, где нет реальных стандартов или соглашений, добавьте еще три байта, всего 21 байт :
Первая половина этого кода такая же, как и в оригинале (через
imul
инструкцию). Этоlea
почти то же самое, но вместо добавления константы 2 добавляется только константа 1. Это потому, что следующаяinc
инструкция увеличивает значение вEAX
регистре на 1, чтобы установить флаги. Если установлен флаг «ноль»,setz
инструкция будет установленаAL
на 1; в противном случаеAL
будет установлено значение 0. Это стандартный способ, которым компилятор C будет генерировать машинный код для возврата abool
.Изменение константы, добавленной в
lea
инструкцию, очевидно, не меняет размер кода, иinc
инструкция очень мала (всего 1 байт), ноsetz
инструкция занимает довольно много 3 байта. К сожалению, я не могу придумать более короткий способ написания этого.источник
Регулярное выражение (ECMAScript),
6058576058 байтВход в унарном виде, как длина строки s.N
x
ПРЕДУПРЕЖДЕНИЕ О СПОЙЛЕРЕ : для квадратного корня это регулярное выражение использует вариант обобщенного алгоритма умножения, который неочевиден и может быть полезной головоломкой для самостоятельной разработки. Для получения дополнительной информации см. Объяснение этой формы алгоритма в « Найти число Рокко» .
-2 байта, позволяя возвращаться в поискеZ -1 байта благодаря Grimy , ища от наименьшего к наибольшему, а не наоборот +3 байта, чтобы обработать ноль -2 байта, перемещая захват квадратного корня за пределы предвиденияz
Z
Это работает путем нахождения , идеальной квадратной степени 2, для которой . Это может удовлетворить только наибольшая совершенная квадратичная степень 2, не превышающая , но благодаря оптимизации для гольфа регулярное выражение пробует их все, начиная с наименьшего. Поскольку каждый соответствует числу циклопов, только самый большой из них может привести к совпадению.Z n = 2 ( n - z) + z√+1 n
^(x*)(?!(x(xx)+)\2*$)(x(x*))(?=(?=(\4*)\5+$)\4*$\6)x\1$|^$
Попробуйте онлайн!
источник
^(1*)0\1$
достаточно просто ?JavaScript (Node.js) , 20 байт
Попробуйте онлайн!
Может быть, это правильно, может быть.
Спасибо, Грими, 1 байт сохранен.
JavaScript (Node.js) , 32 байта
Попробуйте онлайн!
JavaScript (Node.js) , 34 байта
Попробуйте онлайн!
источник
.test
нет.match
Perl 6 , 23 байта
Попробуйте онлайн!
Решение на основе регулярных выражений
источник
Japt ,
2519109 байтСпасибо @Shaggy за -1 байт
Попробуйте онлайн!
источник
Mathematica (язык Wolfram),
3231 байт1 байт сохранен благодаря J42161217!
Попробуйте онлайн!
Чистая функция, принимающая целое число в качестве входных данных и возвращающая
True
илиFalse
. Основываясь на том факте (забавно доказать!), Что числоn
является циклопом тогда и только тогда, когдаn
плюс квадратный корень изn/2
плюс2
округляет до нечетной степени 2. (Можно заменитьFloor
однимCeiling
илиRound
до тех пор, пока один также заменяется+2
на+1
.) ВозвращаетTrue
на входе0
.источник
Log2[#+Floor@Sqrt...
√()
вместоSqrt[]
Рубин , 24 байта
Попробуйте онлайн!
источник
Japt, 8 байт
Спасибо Луису Фелипе де Хесусу Муньосу за исправление моего представления!
Попробуйте онлайн!
Старое решение на основе регулярных выражений, 15 байтов
Возвращает 1 для истины, 0 для ложных.
Попробуйте онлайн!
источник
==
оператора!Желе ,
87 байт-1 благодаря Эрику Outgolfer (используйте встроенный isPalindrome
ŒḂ
, вместо⁼Ṛ$
)Монадическая ссылка, принимающая целое число, которое приводит к
1
(truey) или0
(falsey).Попробуйте онлайн!
Как?
источник
Bċ0⁼1ȧŒḂ
также 8 байт),⁼Ṛ$
такая же, как иŒḂ
для -1. Кроме того, вам не нужно обрабатывать отрицательные числа.ṚƑ
его в наше время, так что вы можете вспомнить это так (самые важныеƑ
).Haskell , 32 байта
Попробуйте онлайн!
источник
Регулярное выражение (ECMAScript),
5347 байт-6 байт благодаря как Deadcode, так и Grimy
Попробуйте онлайн!
источник
^((?=(x(x*?))(\3((x+)(?=\6$))+xx$))(?!\2{6})x\4)*$
( Попробуйте онлайн! )Брахилог , 8 байт
Это предикат, который успешно выполняется, если его ввод представляет собой число Циклопа, и завершается неудачей, если его ввод не является числом Циклопа. Успех / неудача - самая фундаментальная концепция правды / фальши в брахилоге.
Попробуйте онлайн! Или найдите все достоверные результаты до 10000 .
объяснение
Это успешно, только если дан номер Циклопа, потому что:
D↔D
произойдет сбой; в дальнейшем мы можем предположить, что это палиндром.×ᵐ≠
получится.×ᵐ≠
получится.×ᵐ≠
успешно, и весь предикат успешно.источник
Рубин ,
2724 байтаПреобразовать в двоичный файл и проверить с помощью регулярного выражения. Возвращает,
0
если true,nil
если false.-3 байта благодаря ГБ .
Попробуйте онлайн!
Еще на два байта есть прямой порт решения Python:
источник
05AB1E , 8 (или 9) байтов
Попробуйте онлайн или проверьте все контрольные примеры .
Возвращает
1
если правдиво;0
или любое положительное целое число, кроме1
как фальси. В 05AB1E только1
правдиво, а все остальное ложно, но я не уверен, является ли это допустимым выводом, или если вывод должен быть двумя непротиворечивыми и уникальными значениями. Если второй, трейлингΘ
может быть добавлен, так что все выходы, кроме1
становятся0
:Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Арифметический подход будет 10 байтов:
Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
1
в truthy и все остальные номера как falsy является приемлемым для этой задачи, так как другие языки (например , C и TI-BASIC) имеют схожие truthy / falsy определения (0 / ненулевые для обоих). Если то, что считается правдивым или ложным, совпадает со спецификациями языка, то это справедливая игра.Excel,
9763 байтаВычисляет 2 числа:
Затем вычтите второе число из первого:
И сравните этот результат с исходным числом
Старый метод
Начните с Log-base-2 из A1 и округлите его до ближайшего четного числа, затем добавьте 1.
Затем создайте строку с таким количеством
"1"
s и замените средний символ на a,"0"
чтобы создать число Циклопа с двоичной длиной, которая всегда нечетна, и равна или меньше 1 двоичной длины A1Затем сравните его с двоичным представлением A1
источник
R ,
3733 байтаПопробуйте онлайн!
В R нет встроенной функции для преобразования в двоичную форму, поэтому я просто использовал одну из формул из OEIS для вычисления списка терминов из последовательности.
n<-0:x
генерирует щедрый список начальных значений.2*4^(n<-0:x^2)-2^n-1)
это формула из OEIS, а затем он проверяет, появляется ли вход в этой последовательности, используя%in%
.-2 байта, не обрабатывая отрицательные входные данные. -2 байта, помня, я могу изменить
<-
на=
.источник
C (gcc), 26 байтов
Попробуйте онлайн!
Порт Нейла ответ . Полагается на определенный порядок реализации операций.
C ++ (лязг), 38 байт
Попробуйте онлайн!
Не может опустить типы в C ++, не может опустить возвращение в Clang, в противном случае идентично.
источник
return
уязвимости неявного и зависящего от платформы неявного эксплойта.C (gcc) ,
29 2827 байтовСохранено 1 байт благодаря @ceilingcat
Порт 21-байтового ответа JS от @tsh .
Попробуйте онлайн!
источник
J ,
2219171514 байт-3 байта благодаря BolceBussiere!
-4 байта благодаря ngn!
-1 байт благодаря Traws!
J , 14 байт
Попробуйте онлайн!
источник
#=1++/
(#=1++/)@(*|.)@#:
1=1#.1-(*|.)@#:
1=1#.(*:|.)@#:
Желе , 9 байт
Попробуйте онлайн!
источник
Атташе , 22 байта
Попробуйте онлайн!
альтернативы
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
источник
Сетчатка 0.8.2 ,
3837 байтПопробуйте онлайн! Ссылка включает в себя тестовые случаи. Изменить: После выяснения, предыдущее решение не обрабатывает ноль правильно. Объяснение:
Преобразовать из десятичной в одинарную.
Конвертировать из унарного в бинарный, используя метод из Retina wiki.
Проверьте наличие одинакового числа
1
s до и после0
пустой строки или (как в приведенном выше преобразовании обрабатывается ноль).источник
Пакет,
3937 байтПояснение: Число Циклопа имеет видn = ( 2К+ 1 ) ( 2к - 1- 1 ) м = 2К- 1 n = ⌊ м2⌋ ( м + 2 ) N
источник
Excel, 101
107байт-6 байт благодаря @Chronocidal.
Выполняет 3 проверки:
0
0
источник
ISODD(LEN(DEC2BIN(A1)))
наISEVEN(LOG(A1,2))
Регулярное выражение (ECMAScript),
65595758 байт+1 байт для правильной обработки 0
Попробуйте онлайн!
Работает, утверждая, что вход имеет вид( 2К- 1 ) ( 2к + 1+ 1 )
источник
VBA,
4136 байтЗапустите в окне «Немедленно» с отключенным явным объявлением. Ввод - это ячейка
A1
активного листа. Выводит True / False в ближайшее окно.Использует ту же логику, что и в моем ответе Excel, чтобы найти число Циклопа с таким же количеством битов (или на 1 бит короче, если есть четное число!), А затем сравнивает его с входным значением.
Сохраняет несколько байтов при вычислении чисел Циклопа, уменьшая их до формы
y = 2x^2 - x - 1
(гдеx = n-1
для n-го числа Циклопа, илиx = 2^Int(Log([A1])/Log(4))
чтобы найти наибольшее число Циклопа с меньшим или равным числом битов) и сохраняя x в переменной(-5 байт благодаря Тейлору Скотту !)
источник
[...]
обозначения как[(Log(A1,4)]
PHP , 74 байта
Попробуйте онлайн!
Совершенно наивный нематематический подход, просто строки.
Или 60 байтов на основе алгоритма @ Chronocidal выше .
Попробуйте онлайн!
источник
Haskell, 82 байта
И порт решения xnor Python:
Haskell, 47 байтов
источник