2 фактори факторизації


14

Давши натуральне число, nнапишіть програму або функцію, щоб отримати список усіх можливих множин множин, які можна використовувати для досягнення n. Для того, щоб краще зрозуміти , що вдавав , ви можете піти в http://factornumber.com/?page=16777216 , щоб побачити , коли nце 16777216ми отримуємо наступний список:

   2 × 8388608  
   4 × 4194304  
   8 × 2097152  
  16 × 1048576  
  32 ×  524288  
  64 ×  262144  
 128 ×  131072  
 256 ×   65536  
 512 ×   32768  
1024 ×   16384
2048 ×    8192
4096 ×    4096

Не потрібно сильно друкувати речі, як тут. Вимога полягає в тому, що кожен запис (пара факторів) добре відрізняється один від одного і всередині кожної пари, перший фактор також добре відрізняється від другого. Якщо ви вирішили повернути список / масив, внутрішнім елементом може бути список / масив з двома елементами або деяка структура вашої мови, яка підтримує пару речей, таких як C ++ std::pair.

Не друкуйте множення на 1 запис і не повторюйте записи з першим фактором, зміненим другим, оскільки вони досить марні.

Немає переможця; це буде код для гольфу на мові.


2
Чи можете ви додати менший тестовий випадок, наприклад 30?
caird coinheringaahing

1
@cairdcoinheringaahing Ви можете використовувати factornumber.com для створення більше тестових випадків.
Джонатан Фрех

1
Я нещодавно бачив цей конкурс "за мову". У чому справа? Більшість запитань не отримують більше 1 або 2 відповідно до мови, і ви все одно можете вибрати лише один А як правильний.
федерація.

5
@fedes. Це зазвичай тому, що немає сенсу порівнювати мови (наприклад, Java проти Jelly).
повністюлюдсько

1
@totallyhuman так, я знаю. Більшість моїх відповідей є у Факторі чи навіть у Smalltalk. Жодних шансів проти мов для гольфу. Можливо, може бути якийсь спосіб ранжування мов за багатослівністю та
котлопластикою

Відповіді:


6

Java (OpenJDK 8) , 81 66 65 байт

  • -15 байт завдяки Олів’є Грегоаре.
  • -1 байт: ++j<=i/j-> j++<i/j.
i->{for(int j=1;j++<i/j;)if(i%j<1)System.out.println(j+" "+i/j);}

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


Старий (для довідки)

Java (OpenJDK 8) , 126 байт

i->{java.util.stream.IntStream.range(2,i).filter(d->d<=i/d&&i%d==0).forEach(e->System.out.println(""+e+"x"+i/e));return null;}

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

Подання першого кодогольфа та використання першого лямбда. Майбутнє я, будь ласка, пробач мене за код.


1
Приємний перший запис! Ласкаво просимо до PPCG! Ось воно набрало 66 байт , видаливши все зайве: я не міг переграти ваш алгоритм.
Олів'є Грегоар



5

Python 2 , 51 байт

f=lambda n,k=2:n/k/k*[f]and[(k,n/k)][n%k:]+f(n,k+1)

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


51 байт (спасибі Луїсу Мендо за байт)

lambda n:[(n/k,k)for k in range(1,n)if(k*k<=n)>n%k]

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


51 байт

lambda n:[(n/k,k)for k in range(1,n)if n/k/k>n%k*n]

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


Мені подобається використання [f].
Джонатан Фрех

1
Ви можете зберегти 1 байт у другій версії за допомогоюlambda n:[(n/k,k)for k in range(1,n)if(k*k<=n)>n%k]
Луїс Мендо

MemoryError на всіх підходах за 1512518520
sergiol



3

Perl 6 , 38 байт

{map {$^a,$_/$a},grep $_%%*,2.. .sqrt}

Спробуй це

Розширено:

{   # bare block lambda with implicit parameter 「$_」

  map
    { $^a, $_ / $a },  # map the number with the other factor

    grep
      $_ %% *,         # is the input divisible by *
      2 .. .sqrt       # from 2 to the square root of the input
}

3

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

{~×≜Ċo}ᵘ

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

Пояснення

{~×≜Ċo}ᵘ
{     }ᵘ  List the unique outputs of this predicate.
 ~×       Pick a list of integers whose product is the input.
   ≜      Force concrete values for its elements.
    Ċ     Force its length to be 2.
     o    Sort it and output the result.

Частина не включає в себе 1s в свій вихід, так що для введення Н це дає [N] , замість [1, N] , який потім з допомогою забитий Ċ. Я не зовсім впевнений, навіщо це потрібно ...


1
Це потрібно, тому що в іншому випадку немає пунктів вибору для : списку довжини-2, продукт якого є вхідним записом, є єдиною відповіддю, якщо ви насправді не запитуєте значення списку.
Фаталізувати

2

Japt , 9 байт

â¬Å£[XZo]

Перевірте це в Інтернеті! Повертає масив масивів з деякими нулями в кінці; -Rдля більш чіткого відображення результату додано прапор.


1
Тож я думаю, що `-R` слід вважати за кількість байтів ...
sergiol

3
@sergiol, ні, в цьому випадку це просто для форматування виводу для кращої читабельності.
Shaggy

Саме рішення у мене було, за винятком того, що я фільтрував nullкінці в кінці.
Shaggy

2

Желе , 8 байт

½ḊpP⁼¥Ðf

Монадійне посилання, що приймає число і повертає список списків (пар) чисел.

Спробуйте в Інтернеті! (вимкніть TIO для16777216прикладу, оскільки він створить список з 68,7 мільярдів пар і відфільтрує до тих, хто має правильний продукт!)

Як?

½ḊpP⁼¥Ðf - Link: number, n     e.g. 144
½        - square root of n          12
 Ḋ       - dequeue*                 [2,3,4,5,6,7,8,9,10,11,12]
  p      - Cartesian product**      [[2,1],[2,2],...[2,144],[3,1],...,[3,144],...,[12,144]
      Ðf - filter keep if:
     ¥   -   last two links as a dyad (n is on the right):
   P     -     product
    ⁼    -     equals
         -                          [[2,72],[3,48],[4,36],[6,24],[8,18],[9,16],[12,12]]

* , dequeue, імпліцитно робить діапазон числового вводу до дії, а функція діапазону неявно перекриває його вхід, тому, скажімо, n=24результат ½є 4.898...; діапазон стає [1,2,3,4]; і відмінений результат є[2,3,4]

** Аналогічно до вище, pдекартовий продукт створює діапазони для введення чисел - тут правильним аргументом є, nотже, правильний аргумент стає [1,2,3,...,n]до того, як відбувається власне картанський продукт.


2

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

tüOSze↔Ḋ

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

Пояснення

tüOSze↔Ḋ  Implicit input, say n=30.
       Ḋ  List of divisors: [1,2,3,5,6,10,15,30]
      ↔   Reverse: [30,15,10,6,5,3,2,1]
   Sze    Zip with original: [[1,30],[2,15],[3,10],[5,6],[6,5],[10,3],[15,2],[30,1]]
 üO       Deduplicate by sort: [[1,30],[2,15],[3,10],[5,6]]
t         Drop first pair: [[2,15],[3,10],[5,6]]

2

JavaScript (ES6), 55 байт

n=>eval('for(k=1,a=[];k*++k<n;n%k||a.push([k,n/k]));a')

Демо

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


Це я чи це не вдається 6?
Ніл

@Neil "Ми можемо це виправити". (Дякуємо за повідомлення!)
Арнольд

Як я можу надати номер для тестування?
sergiol


1

Python 2 , 59 байт

lambda N:{(n,N/n,n)[n>N/n:][:2]for n in range(2,N)if N%n<1}

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



@sergiol Так, MemoryError, оскільки Python намагається оцінити range(2,N)і зберігати його як список, проте виділеної пам'яті не вистачає. Можна спробувати замінити rangeна xrange(генератор діапазону Python 2), хоча це перевищує одну хвилину максимальної тривалості виконання TIO. На машині з достатньою кількістю пам'яті та часу ця програма повинна припинити та повернути правильну відповідь.
Джонатан Фрех



1

PHP, 70 bytes

As string (70 bytes):

$i++;while($i++<sqrt($a=$argv[1])){echo !($a%$i)?" {$i}x".($a/$i):'';}

As array dump (71 bytes):

$i++;while($i++<sqrt($a=$argv[1]))!($a%$i)?$b[$i]=$a/$i:'';print_r($b);

(im not sure if i can use return $b; instead of print_r since it no longer outputs the array, otherwise i can save 2 bytes here. )

The array gives the results like:

Array
(
    [2] => 8388608
    [4] => 4194304
    [8] => 2097152
    [16] => 1048576

"If you choose to return a list/array" To me it means you can print or return as you see fit.
fede s.

On second thought, returning should be valid for a function, and printing for a program. You seem to have a snippet/program, not a function, so I'd say in this case you should be printing.
fede s.

1

Jelly, 12 bytes

ÆDµżUḣLHĊ$$Ḋ

Try it online!

How it works

ÆDµżUḣLHĊ$$Ḋ - Main monadic link;
             - Argument: n (integer) e.g. 30
ÆD           - Divisors                   [1, 2, 3, 5, 6, 10, 15, 30]
    U        - Reverse                    [30, 15, 10, 6, 5, 3, 2, 1]
   ż         - Interleave                 [[1, 30], [2, 15], [3, 10], [5, 6], [6, 5], [10, 3], [15, 2], [30, 1]]
         $$  - Last 3 links as a monad
      L      -   Length                   8
       H     -   Halve                    4
        Ċ    -   Ceiling                  4
     ḣ       - Take first elements        [[1, 30], [2, 15], [3, 10], [5, 6]]
           Ḋ - Dequeue                    [[2, 15], [3, 10], [5, 6]]


1

Factor, 58

Well, there has to be some Factor in this question!

[ divisors dup reverse zip dup length 1 + 2 /i head rest ]

It's a quotation. call it with the number on the stack, leaves an assoc (an array of pairs) on the stack.

I'm never sure if all the imports count or not, as they're part of the language. This one uses:

USING: math.prime.factors sequences assocs math ;

(If they count, I should look for a longer solution with shorter imports, which is kind of silly)

As a word:

: 2-factors ( x -- a ) divisors dup reverse zip dup length 1 + 2 /i head rest ;

50 2-factors .
 --> { { 2 25 } { 5 10 } }

1

Ruby, 43 bytes

->n{(2..n**0.5).map{|x|[[x,n/x]][n%x]}-[p]}

Try it online!

How it works:

For every number up to sqrt(n), generate the pair [[x, n/x]], then take the n%xth element of this array. If n%x==0 this is [x, n/x], otherwise it's nil. when done, remove all nil from the list.



0

Husk, 14 12 bytes

tumoOSe`/⁰Ḋ⁰

Try it online!

Explanation

tum(OSe`/⁰)Ḋ⁰  -- input ⁰, eg. 30
           Ḋ⁰  -- divisors [1..⁰]: [1,2,3,5,6,10,15,30]
  m(      )    -- map the following function (example on 10):
     Se        --   create list with 10 and ..
       `/⁰     --   .. flipped division by ⁰ (30/10): [10,3]
    O          --   sort: [3,10]
               -- [[1,30],[2,15],[3,10],[5,6],[5,6],[3,10],[2,15],[1,30]]
 u             -- remove duplicates: [[1,30],[2,15],[3,10],[5,6]]
t              -- tail: [[2,15],[3,10],[5,6]]

0

APL+WIN, 32 bytes

m,[.1]n÷m←(0=m|n)/m←1↓⍳⌊(n←⎕)*.5

Explanation:

(n←⎕) Prompts for screen input

m←(0=m|n)/m←1↓⍳⌊(n←⎕)*.5 Calculates the factors dropping the first

m,[.1]n÷ Identifies the pairs and concatenates into a list.

0

Add++, 18 15 bytes

L,F@pB]dBRBcE#S

Try it online!

How it works

L,   - Create a lambda function
     - Example argument:     30
  F  - Factors;     STACK = [1 2 3 5 6 10 15]
  @  - Reverse;     STACK = [15 10 6 5 3 2 1]
  p  - Pop;         STACK = [15 10 6 5 3 2]
  B] - Wrap;        STACK = [[15 10 6 5 3 2]]
  d  - Duplicate;   STACK = [[15 10 6 5 3 2] [15 10 6 5 3 2]]
  BR - Reverse;     STACK = [[15 10 6 5 3 2] [2 3 5 6 10 15]]
  Bc - Zip;         STACK = [[15 2] [10 3] [6 5] [5 6] [3 10] [2 15]]
  E# - Sort each;   STACK = [[2 15] [3 10] [5 6] [5 6] [3 10] [2 15]]
  S  - Deduplicate; STACK = [[[2 15] [3 10] [5 6]]]



0

Julia 0.6, 41 bytes

~x=[(y,div(x,y))for y=2:x if x%y<1>y^2-x]

Try it online!

Redefines the inbuild unary operator ~ and uses an array comprehension to build the output.

  • div(x,y) is neccessary for integer division. x/y saves 5 bytes but the output is ~4=(2,2.0).
  • Julia allows chaining the comparisons, saving one byte.
  • Looping all the way to x avoids Int(floor(√x)).

0

APL NARS 99 chars

r←f w;i;h
r←⍬⋄i←1⋄→0×⍳0≠⍴⍴w⋄→0×⍳''≡0↑w⋄→0×⍳w≠⌊w⋄→0×⍳w≠+w
A:i+←1⋄→A×⍳∼0=i∣w⋄→0×⍳i>h←w÷i⋄r←r,⊂i h⋄→A

9+46+41+3=99 Test: (where not print nothing, it return something it return ⍬ the list null one has to consider as "no solution")

  f 101    

  f 1 2 3

  f '1'

  f '123'

  f 33 1.23

  f 1.23

  ⎕←⊃f 16777216      
   2 8388608
   4 4194304
   8 2097152
  16 1048576
  32  524288
  64  262144
 128  131072
 256   65536
 512   32768
1024   16384
2048    8192
4096    4096
  f 123
3 41 

0

Pyt, 67 65 bytes

←ĐðĐ0↔/⅟ƖŽĐŁ₂20`ŕ3ȘĐ05Ș↔ŕ↔Đ4Ș⇹3Ș⦋ƥ⇹⁺Ɩ3ȘĐ05Ș↔ŕ↔Đ4Ș⇹3Ș⦋ƤĐ3Ș⁺ƖĐ3Ș<łĉ

I'm pretty sure this can be golfed.

Basically, the algorithm generates a list of all of the divisors of the input (let's call it n), makes the same list, but flipped, interleaves the two (e.g., if n=24, then, at this point, it has [1,24,2,12,3,8,4,6,6,4,8,3,12,2,24,1]), and prints out the elements from index 2 until half the array length, printing each number on a new line, and with an extra new line in between every pair.

Most of the work is done in actually managing the stack.


Saved 2 bytes by using increment function.


0

Perl 5, 50 bytes

sub{map[$_,$_[0]/$_],grep!($_[0]%$_),2..sqrt$_[0]}

Ungolfed:

sub {
    return map  { [$_, $_[0] / $_] }
           grep { !($_[0] % $_) }
           (2 .. sqrt($_[0]));
}

Try it online.

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