Мы уже определили число складывания здесь .
Но теперь мы собираемся определить супер складной номер. Число Super Folding - это число, которое, если его сложить достаточно раз, в конечном итоге достигнет единицы, меньшей степени двойки. Метод складывания немного отличается от вопроса с номером сложения.
Алгоритм сворачивания выглядит следующим образом:
Взять двоичное представление
например, 5882
1011011111010
Разлил его на три раздела. Первая половина, последняя половина и средняя цифра (если она имеет нечетное количество цифр)
101101 1 111010
Если средняя цифра равна нулю, это число нельзя сложить
Обратный второй тайм и накладывается на первый тайм
010111 101101
Добавьте цифры на месте
111212
- Если в результате есть любые 2, в результате число не может быть сложено, иначе новое число является результатом алгоритма складывания.
Число - это число Super Folding, если его можно сложить в непрерывную цепочку единиц. (Все складные номера также являются супер складными номерами)
Ваша задача - написать код, который принимает число и выводит истинное значение, если число является числом Super Folding, и ложно в противном случае. Вы будете оцениваться по размеру вашей программы.
Примеры
+5200
Преобразовать в двоичный файл:
1010001010000
Разделить пополам:
101000 1 010000
Середина одна, поэтому мы продолжаем накладывать половинки:
000010
101000
Добавил их:
101010
Нет двойки, поэтому мы продолжим разделение пополам:
101 010
Fold:
010
101
111
Результат 111
(7 в десятичной системе счисления), так что это число Super Folding Number.
Тестовые случаи
Первые 100 супер складных номеров:
[1, 2, 3, 6, 7, 8, 10, 12, 15, 20, 22, 28, 31, 34, 38, 42, 48, 52, 56, 63, 74, 78, 90, 104, 108, 120, 127, 128, 130, 132, 142, 150, 160, 170, 178, 192, 204, 212, 232, 240, 255, 272, 274, 276, 286, 310, 336, 346, 370, 400, 412, 436, 472, 496, 511, 516, 518, 524, 542, 558, 580, 598, 614, 640, 642, 648, 666, 682, 704, 722, 738, 772, 796, 812, 852, 868, 896, 920, 936, 976, 992, 1023, 1060, 1062, 1068, 1086, 1134, 1188, 1206, 1254, 1312, 1314, 1320, 1338, 1386, 1440, 1458, 1506, 1572, 1596]
3
пробраться в тестовые случаи? Я не вижу, как его можно сложить, так как он распадается1 1
, сразу давая2
. Или вы говорите, что сбросить ноль также имеет значение?Ответы:
Вот мой первый выстрел в коде гольф:
Python 3, 167 байт
167 байт, если для отступа используются табуляции или одиночные пробелы
Изменить: Благодаря всеобщей помощи ниже, приведенный выше код был уменьшен с исходного размера 232 байта!
источник
:
s и вернув0
и1
вместоTrue
иFalse
.Java 7, 202 байта
Потребовалось немного усилий, чтобы сделать старую функцию складывания рекурсивной, но она здесь. Честно говоря, это безобразно, как грех. Я должен взглянуть утром, чтобы увидеть, смогу ли я играть в гольф дальше, так как я едва могу стоять, чтобы посмотреть на это прямо сейчас.
С переносами строк:
источник
CJam ,
4744 байтаПопробуйте онлайн! или сгенерировать список супер сворачиваемых чисел до заданного числа.
Попытки игры в гольф можно увидеть здесь .
Код разбивается на следующие фазы:
РЕДАКТИРОВАТЬ: Эта версия более или менее использует подход закона де Моргана к предыдущей версии.
* Проблема с запуском на синглетонах состоит в том, что мы застряли с пустой строкой после среза.
** Если двоичное число супер сворачивается, его зеркальное отображение (с ведущими нулями, если необходимо) равно. Это экономит байт за взятие правой половины.
источник
JavaScript, 149 байт
Определяет рекурсивную функцию.
Объяснение:
источник
m=l>>1
,/2/.test(n)
,n.slice(l-m)
(Или ломтик перевернутое строку). Я думаю, что если вы переключите случаи неудачи и успеха, вы можете использовать/0/.test(n)?f(...):1
.JavaScript (ES6),
113109108 байтОтформатировано и прокомментировано
демонстрация
источник
Perl,
7170 байтВключает +1 для
-p
Дайте номер на STDIN
superfolding.pl
:источник
Python 2, 151 байт
ideone
Двухрекурсивная функция, которая принимает целое число
n
и возвращает0
или1
.Переменная
r
поддерживается, чтобы позволить как результат свертывания, так и узнать, есть ли у нас в настоящее время: целое число (только первое); иметь новую двоичную строку, чтобы попытаться свернуть (внешний); или складываются (внутри).На первом проходе
n
есть и целое число, которое есть<''
в Python 2, поэтому рекурсия начинается с приведения к двоичной строке.Следующее выполнение имеет,
r=''
и поэтому выполняется тест{'1'}==set(n)
для проверки непрерывной строки1
s (RHS не может быть,{n}
поскольку нам, возможно, понадобится передать эту точку позже,r=''
и пустым,n
когда это будет словарь, который не равен{'1'}
, множество).Если это не выполняется, критерии внутреннего хвоста проверяются (даже если в этом нет необходимости): if
n in'1'
оценивает значение True, когдаn
является пустой строкой или одиночной1
, после чего начинается новая внешняя рекурсия, помещаемаяr
затем свернутую двоичную строку вn
и''
вr
. Литерал2
добавляется к результату этого вызова функции, чтобы не допустить перехода к следующей части (справа от логическогоor
), которая будет исправлена позже.Если это неверное значение (все ненулевые целые числа являются истинными в Python), критерии внешней рекурсии проверяются на:
n!=0
исключая случай со средним,0
а внешние два символа проверяются, они не суммируются2
путем конкатенации строк'11'!=n[0]+n[-1]
; если они оба сохраняют значение true, внешние биты отбрасываются сn
помощьюn[1:-1]
, а затем1
добавляется a ,r
если существует один снаружи, иначе a0
is, используя тот факт, что'1'>'0'
в Python сmax(n[0],n[-1])
.Наконец добавление
2
в каждой внутренней рекурсии корректируется с помощью%2
.источник
PHP, 113 байт
выходит с ошибкой (кодом
1
), если аргумент не является супер-складным, код0
другой. Беги с-r
.Ввод
0
вернет истину (код0
).сломать
источник
PHP, 197 байт
расширенный
Истинные значения <10000
источник