Определения
Позвольте m
и n
быть положительными целыми числами. Мы говорим , что m
является делителем твист из , n
если существует целых чисел , 1 < a ≤ b
таких , что n = a*b
и m = (a - 1)*(b + 1) + 1
. Если m
может быть получена из n
применяя ноль или более делители завихрения к нему, то m
есть потомок из n
. Обратите внимание, что у каждого числа есть свой потомок.
Например, рассмотрим n = 16
. Мы можем выбрать a = 2
и b = 8
, так как 2*8 = 16
. потом
(a - 1)*(b + 1) + 1 = 1*9 + 1 = 10
который показывает, что 10
это поворот делителя 16
. С помощью a = 2
и b = 5
мы видим, что 7
это поворот делителя 10
. Таким образом, 7
является потомком 16
.
Задание
Учитывая положительное целое число n
, вычислите потомков n
, перечисленных в порядке возрастания, без дубликатов.
правила
Вы не можете использовать встроенные операции, которые вычисляют делители числа.
Принимаются как полные программы, так и функции, и разрешается возвращать тип данных коллекции (например, какой-то набор), если он отсортирован и не содержит дубликатов. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.
Тестовые случаи
1 -> [1]
2 -> [2] (any prime number returns just itself)
4 -> [4]
16 -> [7, 10, 16]
28 -> [7, 10, 16, 25, 28]
51 -> [37, 51]
60 -> [7, 10, 11, 13, 15, 16, 17, 18, 23, 25, 28, 29, 30, 32, 43, 46, 49, 53, 55, 56, 60]
источник
<
для натуральных чисел, для каждого n вы получаете каждое число меньше его, но не самого себя. Я думаю, что это должно быть что-то похожее. Таким образом, я думаю, что только 4 будет его собственным потомком (хотя и не уверен в этом).Ответы:
Python 2,
109988582 байтаС
(a-1)*(b+1)+1 == a*b-(b-a)
иb >= a
потомки всегда меньше или равны исходному числу. Таким образом, мы можем просто начать с начального числа и продолжать генерировать строго меньших потомков, пока не останется ни одного.Условие
(n<x*x)>n%x
проверяет две вещи в одной - туn<x*x
иn%x == 0
.(Спасибо @xnor за удаление 3 байтов из базового варианта)
Pyth, 32 байта
Прямой перевод вышесказанного, за исключением того факта, что Pyth, кажется, задыхается при попытке sum (
s
) в пустом списке.Это определяет функцию
y
которая может быть вызвана добавлениемy<number>
в конце, например, так ( попробуйте онлайн ):CJam,
4745 байтТакже используется тот же метод, с несколькими модификациями. Я хотел попробовать CJam для сравнения, но, к сожалению, я гораздо хуже в CJam, чем в Pyth / Python, так что, вероятно, есть много возможностей для улучшения.
Выше приведен блок (в основном версия безымянных функций CJam), который принимает int и возвращает список. Вы можете проверить это так ( попробуйте онлайн ):
источник
set()
? Разве вы не можете просто вернуть отсортированный список?set()
, чтобы удалить дубликаты :)[n]+sum(...,[])
какsum(...,[n])
?[]
как базовый случай для суммирования списков, поэтому я полностью забыл!Ява,
148146104 байтаГольф версия:
Длинная версия:
Итак, я дебютирую на PPCG с этой программой, которая использует
TreeSet
(которая, к счастью, автоматически сортирует числа) и рекурсию, аналогичную программе Geobits, но другим способом, проверяя кратные числа n, а затем используя их в Следующая функция. Я бы сказал, что это довольно неплохой результат для новичка (особенно с Java, который, кажется, не самый идеальный язык для такого рода вещей, и помощь Geobits).источник
a*b
вn
строку 9.c=n+a-b
внутрьadd()
. Кроме того, вы можете избавиться отc
всего и просто использоватьn+a-b
в обоих местах те же два байта.add
дважды. Постойте ...a
что, как вы знаете, делитn
чисто, то вам не стоит искатьb
, это простоn/a
. В этот момент он начинает становиться все ближе и ближе к моему;)Ява,
157121Вот рекурсивная функция, которая получает потомков каждого потомка
n
. ВозвращаетTreeSet
, который отсортирован по умолчанию.С некоторыми переносами строк:
источник
Октава,
10796Довольно-печати:
источник
end
а неendfor
иendfunction
. Это сэкономит вам 11 байтов.Haskell,
102100 байтИспользование:
p 16
какие выводы[7,10,16]
Функция
d
рекурсивно вычисляет всех потомков, но не проверяет дубликаты, поэтому многие появляются более одного раза, например,d [4]
возвращает бесконечный список4
s. Функцияp
берет первыеn
элементы из этого списка, удаляет дубликаты и сортирует список. Вуаля.источник
CJam - 36
Попробуйте онлайн
Или другой метод:
Я написал их почти 2 дня назад, застрял в 36, расстроился и пошел спать без публикации.
источник