Номер Каллена - это любое число, которое содержится в последовательности, сгенерированной по формуле:
C (n) = (n * 2 ^ n) +1.
Твое задание:
Напишите программу или функцию, которая получает входные данные и выводит истинное / ложное значение в зависимости от того, является ли этот вход числовым значением Каллена.
Входные данные:
Неотрицательное целое число от 0 до 10 ^ 9 (включительно).
Выход:
Истинное / ложное значение, которое указывает, является ли ввод Калленом.
Тестовые случаи:
Input: Output:
1 ---> truthy
3 ---> truthy
5 ---> falsy
9 ---> truthy
12 ---> falsy
25 ---> truthy
Подсчет очков:
Это код-гольф , поэтому выигрывает самая низкая оценка в байтах.
code-golf
number
decision-problem
Грифон - Восстановить Монику
источник
источник
n
кажется, на основе 0.Ḷ
илиR
в нем есть :-)Ответы:
Pyth,
65 байтпопробуйте это онлайн
источник
машинный код x86_64 ( System V ABI ),
2827 байт-1 байт благодаря @Cody Grey, спасибо!
Алгоритм постоянного времени!
Объяснение:
Пусть у целое число и
x=y*2^y + 1
. Взяв бревна у насy + log2(y) = log2(x-1)
, таким образомy=log2(x-1)-log2(y)
. Подставив обратно значение у, мы получимy=log2(x-1)-log2(log2(x-1)-log2(y))
. Делая это еще раз, мы получим:y=log2(x-1)-log2[log2(x-1)-log2(log2(x-1)-log2(log2(x-1)-log2(y)))]
.Давайте удалим последние члены (порядка
log2(log2(log2(log2(x))))
, это должно быть безопасно!) И предположим, чтоx-1≈x
мы получаем:y≈log2(x)-log2[log2(x)-log2(log2(x))]
Теперь, допустим
f(n) = floor(log2(n))
, можно проверить вручную, чтоy
можно точно получить с помощью:,y=f(x)-f[f(x)-f(f(x))]
при y <26 и, таким образом, x ⩽ 10 ^ 9 , как указано в задании (1) .Затем алгоритм просто состоит из вычисления y по заданному x и проверки того, что x == y * 2 ^ y + 1 . Хитрость в том, что это
f(n)
может быть просто реализовано какbsr
инструкция (обратное сканирование битов), которая возвращает индекс первого 1-битного в n , иy*2^y
какy << y
.Детальный код:
(1) Фактически, это равенство, по-видимому, справедливо для значений y до 50000.
источник
eax
позволит вам устранитьmovzbl
, сэкономив 1 байт. Вам нужно будет выполнить XOR до того,cmpl
как он не заглушит флаги, конечно, но это совершенно нормально, потому что от этого ничего не зависитeax
. Или вы можете просто решить, что метод возвращает логическое значение только в младших 8 битах, сохраняя все 3 байта!Желе ,
76 байтПопробуйте онлайн!
Принимает ввод в качестве аргумента командной строки. Если дано число Каллена C ( n ), выводит n +1 (что верно в Jelly, являющееся ненулевым целым числом; обратите внимание, что у нас n ≥ 0, потому что входное значение является целым числом, а числа Каллена с отрицательным n никогда не являются целыми числами) , Если дано число не по Каллену, возвращает 0, что неверно в желе.
объяснение
По сути, сформируйте массив чисел Каллена минус один, а затем найдите в нем вход минус один. Если вводом является число Каллена, мы найдем его, иначе не будем. Обратите внимание, что массив обязательно должен быть достаточно длинным, чтобы добраться до входа, потому что C ( n ) всегда больше, чем n .
источник
JavaScript (ES6),
3735 байтСохранено 2 байта благодаря Нейлу
демонстрация
Показать фрагмент кода
источник
x<n?f(n,k+1):x==n
?undefined+1===NaN
но-~undefined===1
. Вы можете прочитать больше об этом здесь .Haskell, 28 байт
Попробуйте онлайн!
источник
Ом , 8 байт
Попробуйте онлайн!
источник
PHP , 43 байта
Попробуйте онлайн!
источник
$argn
специальная переменная? Изменение этого параметра$a
позволит сэкономить 6 байт: tio.run/##K8go@G9jX5BRwKWSaKtkaGaoZP0/…$argn
доступно, если вы запускаете PHP из командной строки с-R
опцией05AB1E , 7 байтов
Попробуйте онлайн!
Объяснение:
источник
R ,
535146 байтАнонимная функция. Проверяет,
x
генерируется ли последовательность C (n) для n в [0, x].3 байта Гольф Джузеппе.
Попробуйте онлайн!
источник
x%in%...
вместоany(x==...)
; это сбросит вам 4 байтаlapply
просто проверку вектора и используюscan
вместо аргументов функции - я получу ответ @giuseppe. Спасибо за публикацию отдельно, чтобы я мог увидеть, что мне не хватает - я узнаю больше, попробовав что-то самостоятельно, хотя я обычно проигрываю.C, C ++, Java, C #, D: 70 байт
Из-за сходства между всеми этими языками, этот код работает для каждого
источник
i=30;i--;)if(i<<i==n-1)
вместоi=0;i<30;++i)if((1<<i)*i+1==n)
Python, 40 байт
Попробуйте онлайн!
источник
Python 2 , 36 байт
Попробуйте онлайн!
Выходы не сбой / сбой, как в настоящее время разрешено этой мета-консенсус .
Python 2 , 42 байта
Попробуйте онлайн!
Выходы через код выхода
источник
R , 26 байт
Попробуйте онлайн!
Немного другой подход, чем другой ответ R ; читает из
stdin
и поскольку входные данные гарантированно будут между 0 и 10 ^ 9, мы просто должны проверитьn
между 0 и 26.источник
scan()
. Хорошая работа.APL (Дьялог) , 9 байт
Чтобы охватить случай n = 1, требуется,
⎕IO←0
что по умолчанию во многих системах.Попробуйте онлайн!
⊢
[is] n (аргумент)∊
членом1
один+
плюс⍳
в I ntegers 0 ... ( п -1)×
раз2
два*
в силу⍳
в I ntegers 0 ... ( п -1)источник
⎕IO←0
нестандартным, так как многие действительно всегда устанавливают его так, что каждый раз не требуется никакой спецификации.⎕IO←0
.Python 2 , 32 байта
Попробуйте онлайн!
Создает список чисел Каллена до
10^9
, а затем подсчитывает, сколько раз вход в него появляется. Спасибо Винсенту за указаниеn<<n|1
вместо того(n<<n)+1
, чтобы сэкономить 2 байта.источник
n<<n|1
(n<<n
быть четным);)838860801
. Вам нужноrange(26)
, потому что диапазон не является включающим.D, 65 байт
Это порт алгоритма @ HatsuPointerKun для D (оригинал уже представлял собой D-код, но с трюками, специфичными для D)
Как? (D конкретные приемы)
Система шаблонов D короче, чем C ++, и может выводить типы. И D также инициализирует свои переменные по умолчанию при объявлении.
источник
Mathematica, 30 байт
Чистая функция, принимающая неотрицательное целое число в качестве входных данных и возвращающая
True
илиFalse
. Если вводn
, то(r=Range@#-1)
устанавливает переменнуюr
равной{0, 1, ..., n-1}
, а затемr2^r+1
векторно вычисляет первыеn
цифры Cullen.MemberQ[...,#]
затем проверяет,n
является ли элемент списка.источник
Mathematica, 32 байта
источник
Excel VBA, 45 байт
Функция анонимного непосредственного окна VBE, которая принимает данные из ячейки
[A1]
и выводит их в непосредственное окно VBEДолжен быть запущен в чистом модуле или иметь значения для i, j будет сброшено к значению по умолчанию 0 между запусками
Ввод, вывод
Ввод / вывод, как видно из окна VBE
источник
Сви-пролог, 69 байт
f(X)
успешно, если он может найти значение I, где X = I * 2 ^ I + 1. Подсказка диапазона останавливает его исчерпание пространства стека, но этого достаточно для диапазона чисел Каллена до 10 ^ 9 в спецификации вопроса.например
источник
cQuents , 9 байтов
Попробуйте онлайн!
объяснение
источник
TI-BASIC, 17 байтов
объяснение
источник
QBIC , 24 байта
объяснение
источник
К , 19 байт
Попробуйте онлайн. Истина - это массив с числом в нем:
,3
или,0
так далее. Falsey - пустой массив:()
или!0
зависит от вашего интерпретатора.источник
Java (OpenJDK 8) , 56 байт
Попробуйте онлайн!
источник
Пари / ГП , 25 байт
Попробуйте онлайн!
источник