Факторизація масиву


13

Враховуючи масив додатних цілих чисел, виведіть стабільний масив з різних простих факторів цих цілих чисел. Іншими словами, для кожного цілого числа вхідного порядку для того, щоб отримати його прості коефіцієнти, сортуйте їх і додайте до виводу будь-які прайми, які ще не знаходяться у висновку.

Випробування

[1,2,3,4,5,6,7,8,9,10] -> [2,3,5,7]
[10,9,8,7,6,5,4,3,2,1] -> [2,5,3,7]
[100,99,98,1,2,3,4,5] -> [2,5,3,11,7]
[541,60,19,17,22] -> [541,2,3,5,19,17,11]
[1,1,2,3,5,8,13,21,34,45] -> [2,3,5,13,7,17]
[6,7,6,7,6,7,6,5] -> [2,3,7,5]
[1] -> []
[8] -> [2]
[] -> []

Виведенням може бути масив або список цілих чисел або рядків, обмежений вихід або будь-який інший стандартний спосіб виведення упорядкованого списку чисел.

Це , тому найкоротша відповідь у байтах виграє.



5
Це одне з тих викликів, які, на мою думку, є "занадто простими". Майже кожна відповідь має виглядати як одна з таких: (a) цикл над входом та код коду факторизації Ye Olde Prime із умовним додаванням; (b) ланцюжок з чотирьох вбудованих. Просто для творчості просто мало місця. Можливо, відповіді виявлять мене неправильно, але я сумніваюся в цьому. Тут для гольфу дуже мало, ніж основна факторизація, і це зроблено до смерті.
Лінн

1
@Lynn - це банально для гольфу, але нетривіально для майже всього іншого. Не впевнений, чи є тут підстави для дрібниці: /
Stephen

Чи можете ви сказати мені, які є "чіткі основні фактори" 1?
J42161217

1
@DigitalTrauma Так. Інакше було б просто "вивести набір усіх простих факторів введення"
Стівен

Відповіді:


9

05AB1E , 3 байти

Виводи як список рядків.

f˜Ù

Спробуйте в Інтернеті!

2 придатних , 3 байти

Так, це також працює в 2-х режимах. Також повертає список рядків.

f˜Ù

Спробуйте в Інтернеті!


6
Хах ... f U. Любіть це.
Чарівний восьминіг Урна

@MagicOctopusUrn Спасибі :-)
Містер Xcoder

5

Лушпиння , 3 байти

1 байт збережено завдяки @Zgarb .

uṁp

Спробуйте в Інтернеті!


Пояснення

uṁp Повна програма.

  p Основні фактори кожного.
 function Функція карти за списком та концентрування результату.
u Унікальний. 

3
Σ†може бути .
Згарб

@Zgarb Дякую велике Як ви можете сказати, це моя перша відповідь
Хуск

Приємно бачити нових людей, які використовують хаск. :)
Zgarb

1
@ Zgarb Це здається дуже приємним (особливо, коли це перевершує желе: P)
Містер Xcoder

5

Утиліти Bash + GNU, 37

  • 21 байт збережено завдяки @muru (ух!)
factor|tr \  \\n|awk '!/:/&&!a[$0]++'

Спробуйте в Інтернеті .


1
Я думаю, що це nl|sort|...можна зробити за допомогою awk: awk '!a[$0]++'(роздрукувати, якщо не бачив раніше; тому порядок ніколи не втрачається), економлячи 15 байт. Тоді sedкоманду можна усунути, використовуючи трохи довший awk: factor|awk '!/:/&&!a[$0]++' RS='[ \n]+'(розділити записи на пробіли та нові рядки, пропустити записи :), зберегти ще 4 байти.
муру

1
Я щойно зрозумів, що можу зберегти ще два байти на попередньому коментарі, використовуючи tr: factor|tr \ \\n|awk '!/:/&&!a[$0]++'(це два пробіли після першого зворотного
косого кута

@muru awesome - спасибі! (Я б не засмутився, якби ви опублікували це як власну відповідь, що значно перевершило мою оригінальну)
Digital Trauma

4

MATL , 6 байт

"@Yfvu

Спробуйте в Інтернеті!

Пояснення:

"      % Loop over input
 @     % Push the array element
  Yf   % Prime factors
    v  % Concatenate entire stack vertically (does nothing the first iteration)
     u % Stably get distinct (unique, in MATLAB terminology) elements. Does so every loop but this is code golf, not fastest code.

Цікаві ласощі MATL: загалом, усі функції застосовуються до векторів (масивів) так само легко. Але в цьому випадку кількість факторів є змінною для кожного вводу, і Matlab і MATL розширення зазвичай мають справу лише в квадратних матрицях, тому мені довелося використовувати цикл ".

Крім того, MATL має два основні оператори конкатенації: hі v, горизонтальну та вертикальну конкатенацію. Їх поведінка суттєво відрізняється: vоб'єднує весь стек, навіть якщо він має лише один елемент, як у нашій першій ітерації. hБере рівно два елементи і вийде з ладу, якщо присутній лише один, що робить його непридатним для цієї програми.


4

Брахілог , 6 байт

ḋᵐ↔ᵐcd

Спробуйте в Інтернеті!

Брахілог , 6 байт

ḋᵐoᵐcd

Спробуйте в Інтернеті!


Пояснення

ḋᵐ Карта з простим розкладанням (яке повертає фактори у зворотному порядку).
  ↔ᵐ Перевернути кожен (або oᵐ - замовити кожен).
    c З’єднати (сплюстити).
     d Дублікат.


3

PowerShell , 102 байти

param($x)$a=@();$x|%{$a+=(2..($z=$_)|?{!($z%$_)-and'1'*$_-match'^(?!(..+)\1+$)..'}|sort)};$a|select -u

Спробуйте в Інтернеті!

(Запозичують факторизация ідея з TessellatingHeckler в відповідь над на «Відійди від Мене сатана-Prime!»)

Приймає введення як буквальний масив $x. Створює новий порожній масив $a. Петлі наверху $x. Кожну ітерацію ми обводимо циклом від 2до поточного числа, перевіряючи, чи не є чинником -andце основний, а потім |sortвихід цього і додаємо до нього $a. Коли ми закінчимо $x, ми виводимо, $aале |selectлише -uїхні найменші числа. Це використовує той факт, що унікальний код йде зліва направо, зберігаючи перше явище, яке відповідає опису проблеми. Ці цифри залишаються на конвеєрі, і вихід неявний.


3

CJam, 11 байт

{:mfe__&1-}

Функція, яка приймає масив ints та виводить масив ints.

Тестова версія


Як би я диференціював вихід із кількома символами? Принаймні для мого (онлайн) тестування він виводить рядок, а не масив ints.
Стівен

Як функція, вихідний тип даних - це масив ints. CJam автоматично друкує цей стек, і він друкує масиви без розмежувачів. Я не знаю, чи достатньо це для ваших цілей. Якщо ви хочете деліметрів, додайте S*всередину тісного кронштейна.
geokavel

Я вважаю, що ланг на основі стека може виводитися ToS в будь-якому випадку, тому це добре, мені просто було цікаво. Спасибі.
Стівен




2

Математика, 64 байти

Select[DeleteDuplicates[First/@FactorInteger@#~Flatten~1],#>1&]&

вхід

[{100, 99, 98, 1, 2, 3, 4, 5}]


Select[#&@@@Gather[#&@@@Join@@FactorInteger@#],#>1&]&
matrix89

2

Haskell, 77 байт

import Data.List
x!y|y>x=[]|x`mod`y<1=y:(x`div`y)!y|1<2=x!(y+1)
nub.((!2)=<<)

Пояснення:

  • то x!yоператор повертає список всіх простих факторів x, які більше або дорівнюєy
  • (!2)функція повертає список всіх простих дільників аргументу
  • функція в останньому рядку реалізує необхідну функціональність

Спробуйте в Інтернеті.


2

Брахілог , 6 байт

ḋᵐoᵐcd

Спробуйте в Інтернеті!

Пояснення

ḋᵐ         Map prime decomposition
  oᵐ       Map order
    c      Concatenate
     d     Remove duplicates

Фаїс для [10,9,8,7,6,5,4,3,2,1]. Має бути [2, 5, 3, 7], ні[2, 3, 5, 7]
містер Xcoder

Ви можете це виправити за байтом +1:ḋᵐoᵐcd
Містер Xcoder

@ Mr.Xcoder Спасибі, виправлено. Дуже нечуттєва вимога, проте.
Фаталізувати

Це насправді не чуттєво, оскільки це крихітний, крихітний трохи менш тривіальний. Я також розмістив свою власну відповідь, але я використав перевернуту спочатку замість порядку. Не впевнені, чому прості фактори формуються у зворотному порядку?
Містер Xcoder

@Fatalize well - завдання не полягає в "відсортованому чітких основних чинниках списку", а в "перегляді списку та додаванні різних простих факторів".
Стівен


2

Japt , 6 байт

mk c â

Перевірте це


Пояснення

Неявне введення масиву U. Позначте mнад ним ( ), отримавши фактори ( k) кожного елемента. Вирівняти ( c), отримати унікальні елементи ( â) та неявно вивести.


2

Python 3 , 128 125 116 байт

Це чисте рішення Python. Ніяких пакетів. Завдяки Хальварду за збереження 9 байт.

def f(l):y=[k for i in l for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))];print(sorted({*y},key=y.index))

Спробуйте в Інтернеті!

Python 2 , 133 127 126 байт

def f(l):y=sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]);print sorted(set(y),key=y.index)

Спробуйте в Інтернеті!

Пітон 2 , 142 138 134 байт

l=input();r=[]
for i in sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]):r+=[i]*(i not in r)
print r

Спробуйте в Інтернеті!

Дуже здивований, що відповіді Python ще не було. Робота над гольфом.



@HalvardHummel Спасибі
містер Xcoder

2

Деорст , 16 байт

EDkE]l1FeFPkEQE_

Спробуйте в Інтернеті!

Здійснено за допомогою @cairdcoinheringaahing в кімнаті часів Deorst (зауважте, що рішення різні).


Пояснення

EDkE] l1FeFPkEQE_ Повна програма.

ED Натисніть список дільників кожного елемента.
  k Запобігайте перегрупуванню стеку.
   E] Вирівняйте стек.
     l1Fe Видаліть 1s із стека (тому що птах кинувся та зробив 1 прайм!) - слід видалити в майбутніх мовних випусках.
         FP Зберігайте праймери.
           k Запобігайте перегрупуванню стеку.
            Дублікат EQ
              E_ Виведіть результат.

2

Деорст , 16 байт

EDkE]EQFPkl1FeE_

Спробуйте в Інтернеті!

Зроблено за допомогою @ Mr.Xcoder. Це занадто довго для мови псевдогольфінгу.

Як це працює

EDkE]EQFPkl1FeE_ - Full program, implicit input: [1,2,3,4,5]

ED               - Get divisors. Vectorizes. STACK = [[1], [1,2], [1,3], [1,2,4], [1,5]]
  k              - Turn off sorting for the next command
   E]            - Flatten the stack. STACK = [1, 1, 2, 1, 3, 1, 2, 4, 1, 5]
     EQ          - Deduplicate stack in place. STACK = [1, 2, 3, 4, 5]
       FP        - Filter by primality 1 is considered prime. STACK = [1, 2, 3, 5]
         k       - Turn off sorting for the next command
          l1     - Push 1. STACK = [1, 2, 3, 5, 1]
            Fe   - Filter elements that are equal to the last element. STACK = [2, 3, 5]
              E_ - Output the whole stack

1

Пайк , 4 байти

mPs}

Спробуйте тут!

mP   -   map(factorise, input)
  s  -  sum(^)
   } - uniquify(^)

Ой, я погано тебе ніндзя - Добре, у нас різні підходи :)
Містер Xcoder

: P Одна байтова різниця. Я думаю, що це дозволено, хоча або принаймні за останнім консенсусом, який я прочитав
Синій

Так, повторювані відповіді, навіть байт у байт дозволені
Містер Xcoder


1

МОЙ, 17 байт

⎕Ḋḟ’⊢f(‘53ǵ'ƒf(ū←

Спробуйте в Інтернеті!

Як?

  • оцінений вхід
  • дільники (векторизує / vecifies)
  • сплющити
  • ’⊢f(‘декремент, фільтр, приріст (видаляє 1)
  • 53ǵ'рядок 'P'у кодовій сторінці MY, який є тестуванням первинності. На жаль, 0x35=53це 16-е просте число, і немає команди для натискання 16на стек> _ <.
  • ƒ як функція
  • f( фільтрувати за цим
  • ū уніфікувати
  • вихід

1

C ++, 118 байт

[](auto n){decltype(n)r;for(int m:n)for(int i=1,j;i++<m;){j=m%i;for(int x:r)j|=!(i%x);if(!j)r.push_back(i);}return r;}

Необхідно передати вхід в a std::vector<int>, повертає інший std::vector<int>для виведення.




1

Python 2, 88 119 103 байт

Ось і ми. При правильному сортуванні.

def f(l,s=[]):[s.append(x) for x in sum([list(primefac(i)) for i in l],[]) if x not in s];print s
from primefac import*

Очевидно, я не можу змусити його працювати над TIO, оскільки пакет не підтримується. Це працює на моїй машині, тхо. Ось мої тестові результати:

f([1,2,3,4,5,6,7,8,9,10],[])     #[2, 3, 5, 7]
f([10,9,8,7,6,5,4,3,2,1],[])     #[2, 5, 3, 7]
f([100,99,98,1,2,3,4,5],[])      #[2, 5, 3, 11, 7]
f([541,60,19,17,22],[])          #[541, 2, 3, 5, 19, 17, 11]
f([1,1,2,3,5,8,13,21,34,45],[])  #[2, 3, 5, 13, 7, 17]
f([6,7,6,7,6,7,6,5],[])          #[2, 3, 7, 5]
f([1],[])                        #[]
f([8],[])                        #[2]
f([],[])                         #[]

Я якось не зміг зробити функцію як лямбда-функцію. Щоразу, коли я намагаюся повернути список списку, він повертається [None, None, ...]. Якщо я просто щось переглядаю, може хтось вказав на цю помилку? Дякуємо за відгук!


Редагувати:

Використовуючи алгоритм сортування містера Xcoders, я міг скоротити код на 16 байт. Дякую за цю частину.

from primefac import*
def f(l):a=sum([list(primefac(i))for i in l],[]);print sorted(set(a),key=a.index)

Це здається невірним. Другий тестовий випадок повинен вивести [2, 5, 3, 7]. Порядок виходів має значення.
Мего

sorted(set().union(*map(primefac,l)))
Алекс Холл

Порядок виходів важливий. Перечитайте пояснення чи подивіться інші відповіді - я не знаю, як ще це пояснити.
Стівен

@Stephen. Оновлений розпорядок роботи з правильним висновком. Ми зайняли деякий час, поки я не помітив відмінності в кожному рядку. Фокус під час читання дуже допомагає.
Саймон

@Simon збережіть три байти, позбувшись пробілів після паронів - s.append(x) for-> s.append(x)for, primefac(i)) for-> primefac(i))for, []) if->[])if
Стівен

1

Braingolf , 7 байт

&(p)u=;

Спробуйте в Інтернеті!

О, дивіться, це в основному ланцюжок з 4 вбудованих

Пояснення

&(p)u=;  Implicit input from commandline args
 (.)     Sandbox loop, sandboxes each item in a separate stack and runs the
         code within the loop.
&        Append the entire sandboxed stack when loop ends, rather than only the
         top of stack after each iteration
  p      Prime factors
    u    Unique
     =   Print stack
      ;  Suppress implicit output

Невдачі для [10,9,8,7,6,5,4,3,2,1]. - Порядок має значення: ви повинні повернутися [2, 5, 3, 7]замість [2, 3, 5, 7].
Містер Xcoder

Ви можете це виправити на -1 байт . Так Kяк тут тільки шкодить.
Містер Xcoder

@ Mr.Xcoder о так, так, не зрозумів, що вони повинні бути в порядку виникнення, а не порядку зростання. Виправлено
Skidsdev

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.