По заданному числу определите, является ли оно складным числом.
Складываемое число - это число, такое, что если вы возьмете его в двоичное представление и «сложите» его пополам, то есть возьмете результат умножения XNOR первой половины числа и второй половины на цифры, обратные, вы получите нуль.
Если число имеет нечетное число цифр в двоичном виде, его средняя цифра должна быть 1 и игнорируется при свертывании.
Поскольку это может немного сбивать с толку, я приведу несколько примеров:
178
Двоичное представление 178
10110010
Чтобы сложить это, мы сначала разделим это пополам
1011 0010
Перевернем вторую половину
1011
0100
И мы XNOR две половинки:
0000
Это ноль, так что это складное число.
1644
Двоичное представление 1644
11001101100
Чтобы сложить это, мы сначала разделим это пополам
11001 1 01100
Средний бит равен 1, поэтому мы выбрасываем его.
11001 01100
Перевернем вторую половину
11001
00110
И мы XNOR две половинки:
00000
Это ноль, так что это складное число.
4254
Двоичное представление 4254
1000010011110
Чтобы сложить это, мы сначала разделим это пополам
100001 0 011110
Средний бит равен 0, так что это не число сгиба.
задача
Ваша задача - взять положительное число и вернуть правду, если число сбрасывается, и ложно, если это не так. Это кодовый гольф, поэтому постарайтесь сохранить обратный отсчет байтов.
Тестовые случаи
Вот первые 99 складных чисел:
[1, 2, 6, 10, 12, 22, 28, 38, 42, 52, 56, 78, 90, 108, 120, 142, 150, 170, 178, 204, 212, 232, 240, 286, 310, 346, 370, 412, 436, 472, 496, 542, 558, 598, 614, 666, 682, 722, 738, 796, 812, 852, 868, 920, 936, 976, 992, 1086, 1134, 1206, 1254, 1338, 1386, 1458, 1506, 1596, 1644, 1716, 1764, 1848, 1896, 1968, 2016, 2110, 2142, 2222, 2254, 2358, 2390, 2470, 2502, 2618, 2650, 2730, 2762, 2866, 2898, 2978, 3010, 3132, 3164, 3244, 3276, 3380, 3412, 3492, 3524, 3640, 3672, 3752, 3784, 3888, 3920, 4000, 4032, 4222, 4318, 4462, 4558]
0
, так что нет. (Возможно, стоит иметь третий подобный пример, подобный этому.) То же самое относится и к 18.Ответы:
Желе , 9 байт
Попробуйте онлайн!или проверьте все контрольные примеры .
Как это работает
источник
05AB1E ,
1312 байтКод:
Использует кодировку CP-1252 . Попробуйте онлайн!
Объяснение:
Сначала мы конвертируем число в двоичное, используя
b
. 1644 становится 11001101100 . Мы разделили это на две части2ä
. Например, 11001101100 станет:Если число битов различно, первая часть получит дополнительный бит. Мы
R
переворачиваем последнюю строку и добавляем ноль, используя0¸«
. Причина этого заключается в том, чтобы давать достоверные результаты только тогда, когда средний бит равен 1 ( 1 XOR 0 = 1 и 0 XOR 0 = 0 ). Если среднего бита нет, 05AB1E просто проигнорирует последний бит (добавленный ноль):Последнее, что нам нужно сделать, это сделать XOR поэлементно и взять результат результата. Если одного элемента слишком много, программа просто пропустит последний элемент (
[1, 0, 0] XOR [0, 1] = [1, 1]
). Например:становится:
И продукт этого равен 1 , что является правдой.
источник
s
требуется.bÐg;ô
было так далеко, как я до освежения и увидев тебя прибил это. Отличный ответ, помогая мне учиться!Java 7,
152, 145, 142, 138,134 байта.Зацикливается на нити, как для палиндрома, в поисках нулей. Отслеживает путем многократного умножения, поэтому все, что вам нужно сделать, это проверить, что он не равен нулю в конце.
Без полос прокрутки:
источник
byte[]b=(a+"").getBytes();
короче, чемchar[]b=a.toString(a,2).toCharArray();
и все еще работает (-12 байт).getBytes
что все еще может работать над символом []. Спасибо :)z
как int (0
для ложного, любой другой для правдивого) - сэкономит вам пару байтов.JavaScript (ES6),
615752 байтаРекурсивно вычисляет:
где
N
ранг старшего бита, установленного на входе.Если вход имеет нечетное количество битов, средний бит XOR 'с неопределенным (значение, возвращаемое
pop()
в пустом массиве), что позволяет его неизменным. Таким образом,0
средний бит очищает вывод, а1
средний бит не изменяет результат других операций - что согласуется с определением задачи для складывающегося числа.источник
Python 2, 57 байт
Выходы через код выхода : ошибка для Falsey, и нет ошибки для Truthy.
Преобразует ввод в двоичный файл. Проверяет, являются ли первый и последний символы неравными, сохраняет и повторяет это после удаления этих символов.
Сравнение
s[-1]==s[0]<_
дает ошибку, если первый и последний символ не равны, пытаясь оценить неназначенную переменную с именем_
. Если они равны, цепочка неравенств вместо этого замыкается. Когда мы добираемся до среднего элемента1
,while
цикл завершается в специальном случае как ОК.Я подозреваю, что чисто арифметический подход будет короче с рекурсией, например,
f=lambda n,r=0:...f(n/2,2*r+~n%2)...
чтобы отломать двоичные цифры от конца, перевернутого и перевернутого, и определить, когдаn
иr
равны ли они центру1
. Хотя есть тонкости с ведущими нулями и центром.источник
Python 2,
94 79 7267 байтСохранено 12 байтов благодаря @xnor
Определяет неназванную функцию во второй строке.
Пояснение (с некоторыми добавленными пробелами):
Попробуй это здесь!
источник
s==''or s=='1'
может бытьs in'1'
and
Может быть арифметическим*
. Такжеf
разрешено быть неназванным.Haskell,
898886 байтРаботает, суммируя побитовое представление с обратным и получая произведение. Если это 1 или 2, число является складывающимся числом (1, если есть четные биты, которые складываются, 2, если есть нечетные биты, и один в середине).
источник
Python 2,
100999594 байтЭто кажется немного длинным, но я буду продолжать над этим работать :) Печатает,
1
если число можно сложить,0
противном случае.Попробуй это здесь!
спасибо Wheat Wizard за 1-байтовое сохранение :)
спасибо Роду за 5-байтовое сохранение! :)
источник
b-1
на~b
[1,a[b]>'0'][len(a)%2]
на(a[b]>=`len(a)%2`)
e=len(a)
для измененияb=e/2
`e%2
`, сохраняя 1 байт. И тогда оба питона ответ будут привязаны c:> <> , 37 + 3 = 40 байт
Ожидается, что вход будет присутствовать в стеке при запуске программы, поэтому +3 байта для
-v
флага.Попробуйте онлайн!
источник
Желе , 13 байт
TryItOnline
или соответствующие термины до 4558
Как?
источник
Perl, 46 байт
Включает +1 для
-p
Запустить с номером на STDIN
folding.pl
:Я считаю, это ошибка Perl, что это даже работает. Внутренний
$_
не должен получать обновления позиции совпадения после его изменения. В этой программе позиция матча фактически выходит за пределы$_
источник
perl -pe '$_=sprintf("%b",$_)=~/^(.*)1?(??{reverse$^N=~y%01%10%r})$/'
/Брахилог , 16 байт
Это не совсем работает в Интернете ...
Принимает ввод через входную переменную и выводит через успех или неудачу. Он сильно зависит от языка
z₂
, который существует в языке с 30 апреля, но мы забыли попросить включить его в TIO, поэтому пока он работает только при локальной установке языка. В любом случае это, вероятно, слишком наивный подход.Брахилог (на TIO), 19 байт
Попробуйте онлайн!
lᵛ↖Lz
функционально эквивалентноz₂
(если вы не используете переменную L где-либо еще), но это также на три байта длиннее.источник
Python 2,
76 7169 байт-5 байт благодаря @Dennis (
''
присутствует'1'
, поэтому заменитеin('','1')
наin'1'
)-2 байта благодаря @xnor (используйте умножение
(...)*
вместоand
)Ideone
Рекурсивная функция при первом вызове
n
является числом, поэтому она оценивается как меньшая, чем пустая строка, сif n<''
, и функция вызывается снова, но сn
приведением к двоичной строке; хвост - это либо пустая строка (даже длина в битах), либо средний бит, который возвращает true для пустого или a'1'
; на его пути вниз он проверяет внешние биты для неравенства (эквивалент XOR) и рекурсивны на внутренних битахn[1:-1]
.источник
n in'1'
работает.''
присутствовать'blah'
, но да, это так :)and
Может быть арифметическим*
.Python 2, 63 байта
Отпечатки
True
илиFalse
. Принимает двоичное представлениеs
и многократно удаляет первый и последний символы, если они неравны. Проверяет, является ли то, что осталось, пустой строкой или центральным1
. Это делается путем преобразования''
в'1'
и проверки, равен ли результат'1'
, что также позволяет избежать ошибки индекса в пустой строке.источник
PowerShell v2 +, 143 байта
Два возможных подхода, оба байта одинаковы.
Способ 1:
Принимает ввод
$n
, если это-eq
необходимо1
(особый случай для этого алгоритма), увеличивает его. Установите$o
utput равным1
(т. Е. Предположите правдивость), затем перейдите к средней0
точке входного числа, которое было[convert]
преобразовано в двоичный код. Обратите внимание-!($b%2)
учет нечетных двоичных чисел.На каждой итерации мы сравниваем текущую цифру
$n[$_]
с цифрой одинаковой длины от конца$n[$b-$_]
и умножаем логический результат на$o
(по сути, выполняя-and
все из них). Как только цикл завершен, нам необходимо учесть среднюю двоичную цифру, то есть псевдо-троичную в конце (массив, индексированный через$b%2
). Что1
или0
остается на конвейере, а вывод неявным.Способ 2:
Принимает ввод и выполняет тот же процесс для
[convert]
числа в двоичном формате. Тогда мы находимся вfor
цикле, пока.length
бинарная строка --g
reatert
han2
. Когда мы находимся в цикле, если первая$n[0]
и последняя$n[-1]
цифры-n
OTe
каче, нарежьте эти две цифры прочь$n
и повторно хранить его в$n
. В противном случае выведите0
иexit
. После того, как мы из цикла, либо мы имеем (массив1
,1,0
,0,1
,1,1
, или0,0
), или двоичная строка для двух10
или 311
. Итак, нам нужно проверить эти две возможности. Для первого, мы-join
$n
вместе с+
и оцениваем результат и проверяем, что это1
(это верно для массивов1
,1,0
и0,1
, но$false
для массивов или строк или ). Другая половина проверяет, является ли она полезной (т. Е. Ввод ). Это логическое значение остается в конвейере, а вывод неявным.0,0
и1,1
10
11
-or
$n
-eq
10
2
источник
CJam , 13 байтов
Попробуйте онлайн! или создать список складных чисел до заданного числа.
источник
MATL , 16 байт
Правда это массив со всеми. Проверьте правдивые / ложные критерии здесь .
Попробуйте онлайн! Или проверьте первые 20 тестовых случаев .
объяснение
Давайте использовать вход
1644
в качестве примера.источник
PHP, 101 байт
или с журналом
108 байт с массивом
Истинные значения <10000
источник
Юлия , 66 байт
Мой первый гольф! работает так же, как и решение Python той же длины, незначительные различия из-за языка (хотя я придумал его самостоятельно, хотя ...).
Объяснение:
источник
C
223201189194178 байтАлгоритм грубой силы. Давайте посмотрим, как далеко это может быть в гольфе.
Исправлены ошибки при настройке теста ...
источник
MATL , 13 байт
Правда это массив со всеми. Проверьте правдивые / ложные критерии здесь .
Попробуйте онлайн! Или проверьте первые 20 тестовых случаев .
объяснение
Используя вход
1644
в качестве примера:источник
JavaScript, 71 байт
Определяет анонимную функцию.
Этот метод может быть не самым коротким, но насколько я знаю, он уникален. Он добавляет в двоичное число к себе обратное, обрабатывая их как десятичные, а затем проверяет, является ли результат действительным, используя регулярное выражение.
источник
Сетчатка, 92 байта
Число байтов предполагает кодировку ISO 8859-1.
Попробуйте онлайн
Преобразовать в одинарный. Преобразуйте это в двоичный файл. Разрежьте число пополам и удалите середину,
1
если есть. Обратный первый тайм. Поменяйте его нулями и нулями. Матч, если обе половины равны.источник
Сетчатка,
717060 байтМне, наверное, еще многое предстоит узнать о Retina (например, рекурсивное регулярное выражение?). Пояснение: Шаг 1 преобразует из десятичной в унарную. Шаг 2 преобразует из одинарного в псевдобинарный. Шаг 3 удаляет цифры с обоих концов, если они не совпадают. Шаг четвертый соответствует необязательному последнему центральному 1, если необходимо. Редактировать: 1 байт сохранен благодаря @ mbomb007. Сохранено 10 байт за счет улучшения моего унарного преобразования в двоичное.
источник
.*
или.+
.Python 2,
6159 байтСохранение двух байтов для преобразования сдвигов в умножения
Возвращает
0
для складного номера и все остальное для не складывания. Использует битовый подход.источник
C
6563 байтаДва байта для преобразования сдвигов в умножения
Пробел уже исключен из bytecount, возвращает 0 для фолд-числа и все остальное для не-фолдинга. Использует битовый подход.
источник
к, 77 байт
в качестве объяснения, перевод на
q
источник