Если задано целое число N > 1
, выведите все остальные числа, простые разложения которых имеют те же цифры, что и простое разложение N
.
Например, если N = 117
, то вывод должен быть [279, 939, 993, 3313, 3331]
, потому что
117 = 3 × 3 × 13
Таким образом, имеющиеся цифры 1
, 3
, 3
и 3
и мы имеем
279 = 3 × 3 × 31
939 = 3 × 313
993 = 3 × 331
3313 = 3313
3331 = 3331
Это единственные другие возможные числа, потому что другая комбинация этих цифр дает не простые числа, которые не могут быть результатом простой факторизации.
Если N
какие - либо из 117
, 279
, 939
, 993
, 3313
или 3331
, то выход будет содержать пять других чисел: они являются главными факторами приятелями.
Вы не можете использовать начальные нули для получения простых чисел, например, для N = 107
, его единственный собеседник 701
( 017
не рассматривается).
Вход и выход
Входные и выходные друзья должны быть взяты и возвращены в десятичной основе.
N
всегда будет строго больше, чем1
.Вывод может быть отформатирован довольно свободно, если он содержит только синтаксические элементы «список друзей» и «разделители / список».
Порядок вывода не важен.
Вы можете принять ввод через
STDIN
аргумент функции или что-то подобное.Вы можете распечатать вывод
STDOUT
, вернуть его из функции или чего-либо подобного.
Контрольные примеры
Ваша программа должна решить любой из тестов ниже, менее чем за минуту .
N Buddies
2 []
4 []
8 []
15 [53]
16 []
23 [6]
42 [74, 146, 161]
126 [222, 438, 483, 674, 746, 851, 1466, 1631, 1679]
204 [364,548,692,762,782,852,868,1268,1626,2474,2654,2921,2951,3266,3446,3791,4274,4742,5426,5462,6233,6434,6542,7037,8561,14426,14642,15491,15833,22547]
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
Ç€=$
это будет немного быстрееÇ€=Ç
, учитывая временные ограничения.PowerShell v3 +, 450 байт
В заключение!
PowerShell не имеет встроенных средств для проверки простоты, факторизации или перестановок, так что это полностью выполняется вручную. Я работал над кучей трюков по оптимизации, чтобы попытаться уменьшить сложность времени до того, что будет соответствовать ограничениям на испытания, и я рад сообщить, что наконец-то добился успеха -
объяснение
Здесь много чего происходит, поэтому я постараюсь разбить его.
Первая линия принимает входной сигнал
$n
и определяетfunction
,f
. Эта функция использует накопительное пробное деление, чтобы составить список основных факторов. Это довольно быстро для небольших входов, но, очевидно, замедляется, если вход большой. К счастью, все тесты маленькие, поэтому этого достаточно.В следующей строке указываются
f
действующие лица$n
, которые-split
на каждой цифре игнорируют любые пустые результаты (это необходимо из-за того, как PowerShell выполняет сопоставление регулярных выражений и как он перемещает указатель по входным данным и является своего рода раздражающим для целей игры в гольф), а затемsort
результаты в порядке возрастания Мы сохраняем этот массив цифр$x
и используем его в качестве входных данных для|?{...}
фильтра, чтобы вытащить только те, которые сами являются простыми. Эти простые цифры сохраняются$y
для последующего использования.Затем мы разделились
$x
на две составляющие. Первая (т.е. самая маленькая) цифра сохраняется в$a
, а остальные передаются в$b
. Если$x
есть только одна цифра, то$b
будет пустым / пустым. Затем нам нужно выполнить повторное приведение$a
в виде массива, поэтому мы используем оператор запятой, как для быстрого перехода.Далее нам нужно построить все возможные перестановки цифр. Это необходимо, чтобы наши тесты в подразделении позже пропустили несколько цифр и в целом ускорили процесс.
До тех пор, пока остается элемент
$b
, мы удаляем первую цифру$z
и оставляем в ней$b
. Затем нам нужно накапливаться в$a
результате нарезки строк и нарезки кубиками. Мы берем в$a+$y
качестве конкатенации массивов, и для каждого элемента мы создаем новую строку$c
, затем перебираем$c
's'.length
и вставляем$z
в каждую позицию, включая добавление$z$c
и добавление$c$z
, затем добавляяselect
только-u
элементы nique. Это снова связано с массивом$a
и снова сохранено в$a
. Да, это приводит к тому, что происходят глупые вещи, как вы можете получить3333
для ввода117
, который на самом деле не является перестановкой, но это намного короче, чем попытка явно отфильтровать их, гарантирует, что мы получим каждую перестановку, и только очень незначительно медленнее.Итак, теперь
$a
есть массив всех возможных (а затем и некоторых) перестановок цифр фактора. Нам нужно переустанавливать$x
нашу верхнюю границу возможных результатов, вводя|sort
цифры в-des
порядке убывания и-join
возвращая их вместе. Очевидно, что никакое выходное значение не может быть больше этого числа.Мы устанавливаем наш вспомогательный массив
$l
как массив значений, которые мы видели ранее. Затем мы извлекаем каждое значение из$a
(то есть, тех перестановок), которые являются простыми, и вводим цикл, который является самым большим временным поглотителем всей программы ...На каждой итерации мы переходим
0
к нашей верхней границе$x
, увеличивая текущий элемент$j
. Пока$i
значение, которое мы рассматриваем, не кратно предыдущему значению (это0-notin($l|%{$i%$_})
раздел), это потенциальный кандидат на вывод. Если взятьf
актеров$i
,sort
их, и они-eq
UAL$x
, а затем добавить значение к трубопроводу. В конце цикла мы добавляем наш текущий элемент$j
в наш$l
массив для использования в следующий раз, так как мы уже рассмотрели все эти значения.Наконец, мы выбираем
|?{$_-ne$n}
те, которые не являются элементом ввода. Они все остались на конвейере и вывод неявный.Примеры
источник
CJam ,
2623 байтаПопробуйте онлайн
объяснение
Объединение двух чисел всегда дает больший результат, чем их умножение. Таким образом, наибольшее число, которое мы, возможно, должны рассмотреть, является наибольшим числом, которое мы можем сформировать из цифр первичной факторизации ввода, то есть просто всех цифр, отсортированных в порядке убывания. Для заданных чисел эта верхняя граница достаточно мала, чтобы мы могли тщательно проверить каждое число в диапазоне на предмет того, является ли он главным фактором:
источник
05AB1E , 17 байт
Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн!
источник
Пиф, 17
Тестовый пакет .
Использует то же наблюдение, что и из поста Мартина .
Расширение:
источник
JavaScript (ES6),
163158 байтРедактировать : было разъяснено, что простое число, такое как 23, должно возвращать [6] скорее пустой набор результатов. Сэкономили 5 байт, удалив теперь бесполезное правило, которое специально было предотвращено.
Последний контрольный пример прокомментирован так, что этот фрагмент работает достаточно быстро, хотя он также должен завершиться менее чем за одну минуту.
источник
PHP 486 байт
вероятно, может быть короче с алгоритмом, который не так по книге.
(но мне нравится текущий счетчик байтов)
сломать
источник
На самом деле, 27 байтов
При этом используется тот же алгоритм, который использовали Martin , Adnan , FryAmTheEggman и Dennis . Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Ungolfing
источник
Powershell, 147 байт (версия CodeGolf)
Примечание. Скрипт решает последние тестовые задания менее чем за 3 минуты в моей локальной записной книжке. Смотрите решение «производительность» ниже.
Менее гольф тестовый скрипт:
Выход:
Powershell, 215 байт (версия «Performance»)
Примечание: я считаю, что требования к производительности противоречат принципу GodeGolf. Но поскольку существовало правило
Your program should solve any of the test cases below in less than a minute
, я внес два изменения, чтобы удовлетворить этому правилу:-split'(.)'-ne''
вместо краткого кода|% t*y
;Каждое изменение сокращает время оценки вдвое. Пожалуйста, не думайте, что я использовал все функции для улучшения производительности. Только этого было достаточно, чтобы удовлетворить правила.
Менее гольф тестовый скрипт:
Выход:
источник
Japt, 18 байт
Попытайся
источник