Факторизовать это! …плохо


15

Любопытный ребенок использует программу , которая может факторизовать номер или выражение в следующем виде: p1^e1 * p2^e2 * ... * pn^en. Экспоненты, равные 1опущены, например360 = 2^3 * 3^2 * 5

Ребенок вводит этот вывод в программу как новый ввод, но он не понимает ^знак, поэтому иногда она пропускает один или несколько из тех, которые объединяют соответствующие простую базу и показатель степени. Например(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

Из-за этих ошибок она может получить другую факторизацию, которую она может ввести снова (пропуская 0 или более ^). Она повторяет процесс до тех пор, пока факторизация больше не изменится (возможно, больше нет ^или она скопировала вывод правильно).

Вы должны написать программу или функцию, которая с помощью целого числа n( n>1) выводит все возможные числа в порядке возрастания, чья факторизация может быть той, с которой ребенок (включая n) закончил . Например, для ввода 16возможные окончательные факторизации(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

Входные данные:

  • входное значение на одно целое больше 1
  • не будет дано никакого ввода, которое генерирует выходной номер больше чем 2^31-1
  • не будет дано никакого ввода, которое генерирует больше чем 1000выходные числа

Выходные данные:

  • список целых чисел в удобной для вашего языка форме

Примеры:

Вход => Выход

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

Это код-гольф, поэтому выигрывает самая короткая программа.


Разве у нас уже нет факторизации?
Оптимизатор

5
@ Оптимизатор Это совсем другое.
Рандомра

1
Последнее число для 360 должно быть 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange Спасибо, отредактировал.
Рандомра

Ответы:


5

CJam - 66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

Попробуйте это на http://cjam.aditsu.net/

Объяснение:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*) Спасибо Мартин


код cjam от бога
cjam

Любое количество ^может быть удалено за один шаг. Так что 58564 = 2^2 * 11^4это должно быть в состоянии генерировать 2508 = 22 * 114.
рандома

@randomra Вы должны добавить пример для такого рода вещей
aditsu

@randomra должно быть лучше сейчас
aditsu

Большой! Добавил пример. Извините, что пропустил это.
Рандомра

4

Руби, 219

Чтобы начать это:

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

Создает функцию, возвращающую массив чисел.

https://ideone.com/iOMGny

Используйте это так:

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

Так весело писать все это на мобильном телефоне ...


3

Perl, 193 байта

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

Новые строки просто добавлены для удобства чтения.

Цикл for разлагает следующее число ( $x) на хэш ( %f) простых чисел и степеней. Рекурсивная функция ( R) использует этот хеш для генерации всех чисел, которые могут быть получены путем удаления ^знаков. Эти числа добавляются в очередь ( @q), и процесс повторяется внешним циклом while. Каждый номер в очереди также хранится в уникальном отсортированном массиве ( @r) для печати.


3

Pyth, 46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

Попробуй это здесь.

Исправлена ​​множественная ^ошибка. Например:

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

Обратите внимание, что этот код опирается на несколько исправлений для официального компилятора, которые были выдвинуты после того, как был задан вопрос. Тем не менее, он не использует никаких новых языковых функций.


Что вы получаете за 58564?
aditsu

[230, 456, 1311, 58564, 322102], что неверно.
Исаак

@aditsu Исправлена ​​проблема.
Исаак

Поскольку Pyth строго не задокументирован (основываясь на моих выводах), трудно различить исправления ошибок и новые функции, поэтому я решил не выбирать эту запись в качестве победного ответа.
рандома

@randomra Я понимаю ваше решение не принимать этот ответ. Тем не менее, я просто хотел бы упомянуть, что это за исправление: использование Reduce ( u) внутри другого Reduce было невозможно. Я изменил 2 на 3 в соответствующем месте, так что для уменьшения потребуется 3 входа вместо 2. Вот и все.
Исаак
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.