Некоторые делители натуральных чисел действительно ненавидят друг друга, и им не нравится использовать одну или несколько общих цифр.
Эти целые числа называются номерами враждебных делителей ( HDN )
Примеры
У числа 9566
есть 4
делители: 1, 2, 4783 and 9566
(как видите, нет двух одинаковых цифр ).
Таким образом, 9566 представляет собой Н ostile D ivisor N умбры
Номер НЕ9567
является HDN, потому что его делители ( ) имеют некоторые общие цифры. 1, 3, 9, 1063, 3189, 9567
Вот первые несколько HDN
1,2,3,4,5,6,7,8,9,23,27,29,37,43,47,49,53,59,67,73,79,83,86,87,89,97,223,227,229,233,239,257,263,267,269,277,283,293,307,337...
задача
Приведенный выше список можно продолжить, и ваша задача найти n-й HDN
вход
Целое положительное число n
от 1
до4000
Выход
nth
ГБН
Тестовые случаи
Вот несколько 1-индексированных тестов.
Пожалуйста, укажите, какую систему индексации вы используете в своем ответе, чтобы избежать путаницы.
input -> output
1 1
10 23
101 853
1012 26053
3098 66686
4000 85009
Это код-гольф , поэтому выигрывает самая низкая оценка в байтах.
РЕДАКТИРОВАТЬ
Хорошие новости! Я представил свою последовательность в OEIS и ...
Номера враждебных делителей теперь OEIS A307636
94699599289
квадрат307733
, имеет делители,[1, 307733, 94699599289]
которые показывают, что это HDN. Мне кажется враждебным.49
? Факторы[1, 7, 49]
квалифицируются как враждебные ... Или, ну,4
[1, 2, 4]
1
со списком делителей[1]
. (Может быть, большие HDN более интересны?)49
как наличие делителей[7, 7]
, которые не только разделяют цифры, но и являются одинаковыми цифрами.49
есть факторы[1, 7, 49]
Ответы:
05AB1E ,
1210 байт-2 байта благодаря @Emigna .
1-индексированных
Попробуйте онлайн или проверьте большинство тестовых случаев (последние два тестовых примера опущены, так как они истекли).
Объяснение:
источник
µNNÑ€ÙSDÙQ
на 10.µ
, так что вы избавили меня от проблем. ;)Python 2 , 104 байта
Попробуйте онлайн!
0 индексированные.
источник
JavaScript (ES6), 78 байт
1-индексироваться.
Попробуйте онлайн!
Быстрая версия, 79 байт
Попробуйте онлайн!
Как?
Учитывая целое числоk > 0 , мы строим строку s как объединение всех делителей К .
ПосколькуК всегда является самим делителем, s инициализируется в К (приводится к строке), и первый делитель, который мы пробуем, это d= к - 1 .
Для каждого делителяd из К мы проверяем, можно ли найти любую цифру d в s , превратив d в набор символов в регулярном выражении.
Примеры
"956647832".match(/[1]/)
ложно"9567".match(/[3189]/)
вернокомментарии
Это версия без
eval()
, для удобства чтенияисточник
Желе , 10 байт
Попробуйте онлайн!
-1 байт благодаря ErikTheOutgolfer
Принимает данные из STDIN, что необычно для желе, но обычно там, где
nfind
используется.2-индексированные
источник
nfind
это изменило индексирование LOL⁼Q$
так же, какQƑ
.Perl 6 , 53 байта
Попробуйте онлайн!
1-индексироваться.
/(.).*$0/
сопоставляет любое число с повторяющейся цифрой.grep $_ %% *, 1 .. $_
возвращает список всех делителей числа$_
, проверяемого в данный момент на членство в списке.[~]
объединяет все эти цифры вместе, а затемR!~~
сопоставляет строку справа с шаблоном слева. (~~
это обычный оператор сопоставления,!~~
отрицание этого оператора иR
метаоператор, который меняет аргументы!~~
.)источник
Python 2 (PyPy) ,
117114 байтИспользует 1-индексацию
Попробуйте онлайн!
источник
Wolfram Language 103 байта
Использует 1-индексацию. Я удивлен, что это потребовало так много кода.
источник
(n=t=1;While[t<=#,If[!Or@@IntersectingQ@@@Subsets[IntegerDigits@Divisors@n,{2}],t++];n++];n-1)&
я не планирую публиковать ответ, поэтому я оставлю это здесьPowerShell , 112 байт
Попробуйте онлайн!
Принимает 1-индексированный ввод
$args[0]
, сохраняет его в$a
цикле, пока не попадет0
. На каждой итерации мы обнуляем массив из десяти элементов$z
(используется для хранения нашего количества цифр). Затем мы строим наш список делителей с помощью1..++$n|?{!($n%$_)}
. Для каждого делителя мы приводим его к строке"$_"
,t
приводим oCharArray
иsort
эти цифры с помощью-u
флага nique (потому что нам все равно, если сам делитель имеет повторяющиеся цифры). Затем мы увеличиваем число соответствующих цифр в$z
. Затем мы уменьшаем значение,$a
только если$z
содержит0
s и1
s (т. Е. Мы нашли HDN). Если мы закончили нашfor
цикл, это означает, что мы нашли соответствующее количество HDN, поэтому мы оставляем$n
в конвейере и вывод неявный.источник
$a-=!($z-ge2)
вместо этого$a-=!($z|?{$_-ge2})
Python 3 , 115 байт
1-индексированных
Попробуйте онлайн!
Это использует много рекурсии; даже с увеличенным лимитом рекурсии это невозможно
f(30)
. Я думаю, что это может быть в будущем, и я попытался найти что-то, чтобы заменить(1-x%d)
, но не смог придумать что-либо (-~-x%d
имеет неправильный приоритет). Любые байты, которые можно сбрить, очень ценятся.Как это работает
источник
Brachylog (v2), 14 байт
Попробуйте онлайн!
Подчинение функции; ввод слева, вывод справа. (Ссылка TIO содержит аргумент командной строки для запуска функции, как если бы она была полной программой.)
объяснение
"Это число враждебных делителей?" код решения проблемы :
Это оказалось в основном таким же, как у @ UnrelatedString, хотя я написал это независимо.
«энное решение для принятия задачи » обертка:
Это один из тех случаев, когда оболочка, необходимая для создания n-го вывода, значительно длиннее, чем код, необходимый для проверки каждого вывода по очереди :-)
Я придумал эту обертку независимо от @ UnrelatedString. Это та же самая длина и работает по тому же принципу, но так или иначе заканчивает тем, что было написано довольно по-другому. У него действительно больше возможностей для улучшения, поскольку мы можем добавить ограничения на то, какие значения мы ищем бесплатно, заменив их
A
некоторой переменной ограничения, но ни одна из возможных переменных ограничения не сохраняет байты. (Если бы существовала переменная ограничения «неотрицательное целое число», вы можете заменить ее наA
нее, а затем сохранить байт, сделавℕ
ненужным.)источник
Ява 10,
149139138126125120119 байт-10 байт, используя
.matches
вместо.contains
цифры, вдохновленный ответом @Arnauld на JavaScript .-5 байт благодаря @ValueInk
-1 байт благодаря @ceilingcat
1-индексированных
Попробуйте онлайн.
Объяснение:
источник
i
иs
в своем поиске регулярных выражений, вам не нужно дополнительное преобразование строк, и результат будет таким же.Брахилог , 16 байт
Попробуйте онлайн!
Очень медленно и вдвое дольше, чем если бы это была проблема с решением . 1-индексироваться.
источник
Wolfram Language (Mathematica) , 74 байта
Попробуйте онлайн!
источник
Japt v2.0a0, 17 байт
Попытайся
Порт этого брахилога ответ .
Кредит: 4-байтовая экономия благодаря Шегги, который также предложил, что есть лучшее решение, приводящее к большему количеству байтов :)
Оригинальный ответ 28 байтовый подход:
Попытайся
Порт этого JavaScript ответа .
источник
«
ярлык :) Я полагаю, если Шэгги только улучшил свой счет на несколько байтов, я должен быть (несколько) приличным в этом?Значок , 123 байта
Попробуйте онлайн!
1-индексироваться. Действительно медленно для больших входов.
источник
Perl 6 , 74 байта
0 индексированные. Только первые три случая перечислены на TIO, так как остальные слишком медленны для тестирования.
Попробуйте онлайн!
источник
Рубин ,
110979284 байта-13 байт, используя проверку регулярных выражений JavaScript @ Арнаулда .
-5 байт для замены
times
цикла для уменьшителя и awhile
.-8 байт, отказавшись
combination
от чего-то более похожего на другие ответы.Попробуйте онлайн!
источник
Perl 5
-p
, 66 байтПопробуйте онлайн!
1 проиндексировано
источник
J ,
8759 байт-28 байт благодаря FrownFrog
Попробуйте онлайн!
оригинал
J , 87 байт
Попробуйте онлайн!
Хлоп.
Это ужасно долго для J, но я не вижу хороших способов его обуздать.
объяснение
Это помогает ввести пару вспомогательных глаголов, чтобы увидеть, что происходит:
d
возвращает список всех делителей своего аргументаh
говорит, что такой список враждебен. Он структурирует и дедуплицирует каждое число~.@":"0
, которое возвращает квадратную матрицу, где более короткие числа дополняются пробелами.-.&' '@,/
выравнивает матрицу, удаляет пробелы и, наконец,(-:~.)
сообщает вам , повторяется ли это число или нет.С этими двумя помощниками наш общий, негольфированный глагол становится:
Здесь мы поддерживаем список, глава которого является нашим «текущим кандидатом» (который начинается с 1), а хвост которого - все найденные на данный момент враждебные числа.
Мы увеличиваем заголовок списка
>:@[
на каждой итерации и добавляем «текущего кандидата», только если он враждебенh@d@[ # [
. Мы продолжаем делать это, пока длина нашего списка не достигнет 1 + n:^:(#@] < 1 + [)^:_
.Наконец, когда мы закончим, мы возвращаем последний номер этого списка,
[: {:
который является n-м враждебным номером.источник