Факторизуйте це! … Погано


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
@Optimizer Це зовсім інше.
randomra

1
Останнє число для 360 повинно бути 3 6 80: 2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange Спасибі, відредаговано.
randomra

Відповіді:


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

Будь-яка кількість ^s може бути видалена за один крок. Тож для 58564 = 2^2 * 11^4цього слід вміти генерувати 2508 = 22 * 114.
randomra

@randomra, ви повинні додати приклад для подібної речі
aditsu киньте, тому що SE - EVIL

@randomra має бути кращим
aditsu кинеться, бо SE - EVIL

Чудово! Додано приклад. Вибачте, що пропустили його.
randomra

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

Піта, 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 кинути, тому що SE - EVIL

[230, 456, 1311, 58564, 322102], що неправильно.
isaacg

@aditsu Виправлена ​​проблема.
isaacg

Оскільки Pyth не суворо задокументований (на основі моїх висновків), важко розрізнити виправлення помилок та нові функції, тому я вирішив не вибирати цей запис як виграшну відповідь.
випадкова

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