Найпоширеніша множина


28

Не плутати з найменшим загальним кратним .

Давши список натуральних чисел з більш ніж одним елементом, поверніть найпоширеніший добуток із двох елементів у масиві.

Наприклад, MCM у списку [2,3,4,5,6]є 12, як таблиця продуктів:

    2  3  4  5  6
  ---------------
2 | #  6  8  10 12
3 | #  #  12 15 18
4 | #  #  #  20 24
5 | #  #  #  #  30
6 | #  #  #  #  #

Дякую DJMcMayhem за стіл

Як 12видається найбільше разів (два рази як 2*6і 3*4). Зауважте, що ми не включаємо добуток елемента і себе, тому 2*2або 4*4не відображаємось у цьому списку. Однак однакові елементи все одно будуть множитися, тому таблиця для [2,3,3]вигляду виглядає так:

    2  3  3
  ----------
2 | #  6  6 
3 | #  #  9
3 | #  #  #

Маючи MCM 6.

У разі краватки ви можете повернути будь-який із зав'язаних елементів або список усіх.

  • Це , тому виграє найменший кількість байтів для кожної мови!

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

[2,3,4,5,6] -> 12
[7,2] -> 14
[2,3,3] -> 6
[3,3,3] -> 9
[1,1,1,1,2,2] -> 2
[6,200,10,120] -> 1200
[2,3,4,5,6,7,8,8] -> 24
[5,2,9,10,3,4,4,4,7] -> 20
[9,7,10,9,7,8,5,10,1] -> 63, 70, 90 or [63,70,90]


5
Пропонований тестовий випадок: той, де всі елементи однакові (тобто [3,3,3] -> 9). За всіх ваших поточних тестових випадків відфільтровування будь-яких пар, де елементи однакові (навіть для тестових випадків, таких як такі, [2,3,3]що містять однакові значення), все одно буде зберігати правильні результати тестування, але не вдасться для цього тестового випадку, оскільки жоден після фільтрації не залишиться.
Kevin Cruijssen

@Kevin Хороша пропозиція, додано
Джо Кінг

Відповіді:


11

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

{⊇Ċ×}ᶠọtᵒth

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

Пояснення

{   }ᶠ          Find all:
 ⊇Ċ×              Product of a subset of 2 elements
      ọtᵒ       Order by occurrences
         th     Take the last element and discard the number of occurrences

Я не знаю, як зазвичай працює кодовий гольф, але чи не деякі з цих символів поза стандартними 256 кодовими точками і, отже, кожен байт?
Холлоуей


11

R , 54 50 41 байт

order(-tabulate(combn(scan(),2,prod)))[1]

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

Крім того, для 54 53 44 байт:

names(sort(-table(combn(scan(),2,prod))))[1]

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

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

Завдяки Кримінально Вульгару за -4 та -1 та Джузеппе за -9 на обох.


1
На другому ви можете використовувати -table () замість спадання = TRUE для -1. Мені дуже подобається кмітливість першого. EDIT: Щойно зрозумів, що ви також можете застосувати це до першого для -4, так що це є. Спробуйте в Інтернеті!
Кримінально-

1
combn(scan(),2,prod)працює замість використанняapply
Джузеппе


7

Pyth, 12 байт

eo/QN=*M.cQ2

Тестовий набір

Спочатку ми беремо всі 2 комбінації елементів вводу без заміни ( .cQ2). Потім ми мапимо кожну з цих пар на їх добуток ( *M). Далі перезаписуємо вхідну змінну зі списком продуктів ( =). Далі ми сортуємо список продуктів за кількістю зустрічей у списку продуктів ( o/QN). Нарешті, візьміть заключний елемент відсортованого списку ( e).


7

MATL , 8 7 байт

2XN!pXM

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

(-1 байт, використовуючи метод з відповіді на желе @ @ Mr. Xcoder .)

2XN     % nchoosek - get all combinations of 2 elements from input
!p      % get the product of each combination
XM      % 'mode': get the most common value from that

Старіша відповідь:

8 байт

&*XRXzXM

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

&*    % multiply input by its transpose,
      %  getting all elementwise products
XR    % take the upper-triangular portion of that,
      %  zeroing out repetitions and mainly self-multiplications
Xz    % remove the zeroed out parts
XM    % 'mode' calculation - get the most common value from that

6

05AB1E , 8 6 байт

æ2ùP.M

-2 байти завдяки @Kaldo .

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

æ         # Take the powerset of the input-list
          #  i.e. [2,3,3] → [[],[2],[3],[3],[2,3],[2,3],[3,3],[2,3,3]]
 2ù       # Leave only the inner lists of size 2:
          #  i.e. [[],[2],[3],[3],[2,3],[2,3],[3,3],[2,3,3]] → [[2,3],[2,3],[3,3]]
   P      # Take the product of each remaining pair
          #  i.e. [[2,3],[2,3],[3,3]] → [6,6,9]
    .M    # Only leave the most frequent value(s) in the list
          #  i.e. [6,6,9] → [6]

1
æ2ùPM на 6 байт
Калдо

@Kaldo Дякую! Повністю забув ù.
Кевін Кройсейсен

6

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

-17 байт (і виправлення) завдяки JungHwan Min .

Commonest[1##&@@@#~Subsets~{2}]&

Чиста функція. Бере список списків чисел як вхідний і повертає список МСМ як вихідний.


Насправді, схоже, ми обидва неправильно прочитали питання. Це не вдається для введення {3, 3, 3}. Виправлено:Commonest[1##&@@@#~Subsets~{2}]&
JungHwan Min

@JungHwanMin Huh. Я думав, що Subsetsповтори не вважаються окремими елементами. Здається, це все-таки є, тому дякую!
LegionMammal978

5

MATLAB, 43 байти

I=input('');i=I'*I*1-eye(nnz(I));mode(i(:))

Це теж різновид твістера язика!

Пояснення

I=input('');           % Takes an input like "[2,3,4,5,6]"
i=I'*I                 % Multiplies the input by its own transverse
      *1-eye(nnz(I));  % Multiplies by 1-identity matrix to remove diagonal
mode(i(:))             % Calculates most common value and prints it

1
я не впевнений, що вам потрібно зробити I'*I*1-eyeЧому б не просто I'*I-eye?
aaaaa повідомляє відновити Моніку

5

Perl 6 , 41 38 байт

{key max bag(@_ X*@_)∖@_»²: *{*}:}

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


Скажіть, будь ласка, мені (або вкажіть мене на документи), що там роблять колони? Я не можу повністю розібратися ... Я бачу, що це має щось спільне з передачею аргументів, але більше нічого.
Раміллі

1
@Ramillies Це Інфікси: оператор.
nwellnhof

А, бачу. Дякую.
Раміллі



4

Attache , 59 байт

Last##~SortBy#`&&:`~##{Flat[UpperTriangle&1!Table&_!`*]^^0}

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

Я все ще трохи працюю над гольфом, але я думаю, що це майже оптимально для обраного нами підходу.

Пояснення

Це склад з трьох функцій:

  1. {Flat[UpperTriangle&1!Table&_!`*]^^0}
  2. SortBy#`&&:`~
  3. Last

Перша функція виконує основну частину обчислень:

{Flat[UpperTriangle&1!Table&_!`*]^^0}
{                                   }    anonymous lambda; input: _ (e.g.: [2,3,4,5,6])
                      Table&_!`*         shorthand for Table[`*, _]
                                         this creates a multiplication table using the input
                                         e.g.:
                                           4  6  8 10 12
                                           6  9 12 15 18
                                           8 12 16 20 24
                                          10 15 20 25 30
                                          12 18 24 30 36

      UpperTriangle&1!                   takes the strict upper triangle of this matrix
                                         e.g.:
                                          0 6  8 10 12
                                          0 0 12 15 18
                                          0 0  0 20 24
                                          0 0  0  0 30
                                          0 0  0  0  0
Flat[                           ]^^0     flattens this list and removes all 0s
                                         e.g.: [6, 8, 10, 12, 12, 15, 18, 20, 24, 30]

Другий трохи складний, але робить щось досить просте. По-перше, корисно знати, що f&nце функція, яка при виклику з аргументами ...xповертається f[...x, n]. f&:nподібний, повертається f[n, ...x]. Тепер розберемо це:

( ~SortBy ) # (`& &: `~)

Спочатку f#gстворює виделку. З введенням nвін повертається f[n, g[n]]. Однак у цьому випадку fє функція ~SortBy. ~fповертає аргументи функції. Це означає , що ~f#gеквівалентно f[g[n], n], або тут, SortBy[(`& &: `~)[n], n].

`& &: `~випливає за формою f&:n. Але що таке `&і `~? Вони є "котировками оператора" і повертають функцію, еквівалентну оператору, що котирується. Отже, у цьому випадку `&те саме, що і ${ x & y }. Зважаючи на це, цей вираз еквівалентний наступному для двійкових операторів:

f&:n   <=>   ${ f[n, x] }
       <=>   ${ (`&)[`~, x] }
       <=>   ${ `~ & x }

Це дає функцію `~&x, де xрезультат першої функції. n ~ aпідраховує події nв a. Отже, це повертає функцію, яка рахує входження аргументу в обчислений масив з функції 1.

Повертаючись до SortByцього, цей кожен елемент у масиві залежить від кількості появи в ньому.

Нарешті, Lastбере елемент, який зустрічається найбільше. Зв'язки розбиваються алгоритмом сортування.


Чи потрібна частина UpperTriangle? Чи можете ви просто розрівняти стіл і сортувати?
svavil

@svavil Так, це потрібно; [5, 2, 9, 10, 3, 4, 4, 4, 7] -> 16замість цього 20без нього.
Conor O'Brien


3

Вугілля деревне , 24 байти

WθF×⊟θθ⊞υκI⊟Φυ⁼№υι⌈Eυ№υλ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

Wθ

Хоча вхідний масив не порожній ...

×⊟θθ

... вивести останній елемент і помножити решту масиву на цей елемент ...

F...⊞υκ

... і натисніть результати на попередньо визначений порожній список.

⌈Eυ№υλ

Порахуйте кількість показів кожного продукту у списку та візьміть максимум ...

Φυ⁼№υι...

... потім фільтруйте продукти, кількість яких дорівнює цьому максимуму ...

I⊟

... потім спливають останній елемент і передають на рядок для неявного друку.



3

APL (Dyalog Unicode) , 29 27 19 байт

{⌈/⊢/⊣¨⌸∊⍵}⍳∘≢↓¨⊢×⊂

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

Мовчазний fn.

Завдяки Adám за негласну версію та 2 байти.

Завдяки ngn за 8 байт!

Як:

{⌈/⊢/⊣¨⌸∊⍵}⍳∘≢↓¨⊢×⊂
                ⊢×⊂    Multiply each element with the entire argument, then
           ⍳∘≢↓¨       Remove 1 from the first, two from the next etc. (removes repeated multiplications);
                       The result is then fed into the function:
{       ∊⍵}            Flatten the result;
     ⊣¨⌸               Key; creates a matrix in which each row corresponds to a unique product;
   ⊢/                  Get the rightmost column of the matrix;
 ⌈/                    Get the highest value.

1
Це лише 27 .
Адам


3

CJam , 70 68 байт

q',/S*~_,(:L{LX-,0a\+[{X1++}*](;{_X=\_Y=@*\}fY}fX]~;]_{\_@e=}$\;_,(=

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

Пояснення

q',/S*~                                                                  Turn input string into a valid CJam array
       _,(                                                               Find the length of the array and subtract 1
          :L                                                             Assign the result to L
            {                                 }fX                        Outer for loop
             LX-,0a\+[{X1++}*](;                                         Create an array with all the array indexes bigger than X
                                {          }fY                           Inner for loop
                                 _X=\_Y=@*\                              Create a multiple of array[X] and array[Y] (Guaranteed to be from a unique combination of factors)
                                                 ~;]                     Casts away all stack items except for an array of the multiples
                                                    _{\_@e=}$\;          Sorts array by number of occurrences (largest number of occurences at the end)
                                                               _,(=      Gets the last element of the array

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


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

Це повинно бути гольфуючим, враховуючи, що я жахливий у CJam.


Зміни:

Олена відрізала 2 байти!

Старе: q',/S*~_,1-:L{LX-,0a\+[{X1++}*](;{_X=\_Y=@*\}fY}fX]~;]_{\_@e=}$\;_,1-=
Нове:q',/S*~_,(:L{LX-,0a\+[{X1++}*](;{_X=\_Y=@*\}fY}fX]~;]_{\_@e=}$\;_,(=

Змінюючи 1-s на просто, (ми отримуємо той же ефект, але з меншим числом байтів.




2

MATLAB 39 байт

a=input('');
b=triu(a'*a,1);
mode(b(b~=0))

Перевірте також відповідь Джейкоба Уотсона


1
Маючи другий рядок, b=triu(a'*a,1);зберігається 4 байти.
sundar

@sundar О, хапай, ти маєш рацію :) Мені все-таки було, triuале якось відійшло
ааааа каже, що повернути Моніку

Гарне рішення, я не розумів, що функція верхнього трикутника була такою короткою!
Джейкоб Уотсон

2

SQL Server, 93 байти

SELECT TOP 1a.a*b.a
FROM @ a
JOIN @ b ON a.i<b.i
GROUP BY a.a*b.a
ORDER BY COUNT(a.a*b.a)DESC

Вхідні дані приймаються з таблиці форми

DECLARE @ TABLE (A int, i int identity);

Приклад таблиці таблиці:

INSERT INTO @ VALUES (9), (7), (10), (9), (7), (8), (5), (10), (1);

Пояснення:

Я припускаю, що "список цілих чисел" матиме пов'язаний з ними індекс, який у моєму випадку є стовпцем i. У стовпці aмістяться значення списку.

Я створюю продукти кожної пари, де ліва пара потрапляє до списку раніше, ніж права. Потім я групую по продукту і сортую за найбільш густонаселеною кількістю.

Мені трохи сумно, що мені не вдалося використати жодні пропозиції cte чи розділення, але вони були занадто довгими. SELECT- дуже дороге ключове слово.

Альтернативно, 183 байти

WITH c
AS(SELECT a,ROW_NUMBER()OVER(ORDER BY a)r
FROM @),d AS(SELECT a.a*b.a p,COUNT(a.a*b.a)m
FROM c a
JOIN c b ON a.r<b.r GROUP BY a.a*b.a)SELECT TOP 1p
FROM d
ORDER BY m DESC

Якщо SQL не має окремого стовпчика індексу, ось рішення, де я створюю індекс за допомогою ROW_NUMBERфункції. Мене особисто не цікавить замовлення, але замовлення потрібне, і використання aстовпця є найкоротшим.




2

C # (Visual C # Interactive Compiler) , 95 байт

x=>x.SelectMany(y=>(x=x.Skip(1)).Select(z=>y*z)).GroupBy(y=>y).OrderBy(y=>y.Count()).Last().Key

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

Менше коду для гольфу:

// x is a list of integers
x=>
  // iterate over each integer and
  // return a list per element.
  // flatten the list of lists to 1 list
  x.SelectMany(y=>
    // skip the current value and save
    // newly offset list to x so that it
    // can be incrementally offset
    // again next pass
    (x=x.Skip(1))
      // compute the product
      .Select(z=>y*z))
    // get the unique products
    .GroupBy(y=>y)
    // sort the products by number
    // of occurrences
    .OrderBy(y=>y.Count())
    // pick the product with the
    // greatest number of occurrences
    .Last().Key

1

PHP, 91 байт

while($c=$argv[++$i])for($k=$i;--$k;)$r[$c*$argv[$k]]++;asort($r);echo end(array_flip($r));

приймає дані з аргументів командного рядка; запустіть -nrабо спробуйте в Інтернеті .

Використовуйте PHP 7, щоб уникнути попередження про режим STRICT.


1

J, 29 25 24 23 байт

(0{~.\:1#.=)@(</#&,*/)~

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

як

(~. {.@\: 1 #. =)@(</ #&, */)~
                  (</ #&, */)~  NB. all products, dups removed:
                          */    NB. create the times table
                   </           NB. lower triangular ones matrix
                       &,       NB. flatten each and
                      #         NB. filter based on lower triangle
                 @              NB. pass that result to
(~. {.@\: 1 #. =)               NB. get the most frequent list item:
       \:                       NB. sort down
 ~.                             NB. the uniq elements
          1 #. =                NB. by their count
    {.@                         NB. and take the first element


0

APL (NARS), 53 символи, 106 байт

{0=l←↑⍴⍵:⍵⋄t⊃⍨q⍳⌈/q←{+/t=⍵}¨t←×/¨(∊(⍳l)∘.<⍳l)/,⍵∘.,⍵}

Тест:

  p←{0=l←↑⍴⍵:⍵⋄t⊃⍨q⍳⌈/q←{+/t=⍵}¨t←×/¨(∊(⍳l)∘.<⍳l)/,⍵∘.,⍵}
  p 9
9
  p 1 3
3
  p 2 3 4 5 6
12
  p 7 2
14
  p 2 3 3
6
  p 3 3 3
9
  p 1 1 1 1 2 2
2
  p 6 200 10 120
1200
  p 2 3 4 5 6 7 8 8
24
  p 5 2 9 10 3 4 4 4 7
20
  p 9 7 10 9 7 8 5 10 1
63
  p 3 3
9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.