Наиболее распространенный множественный


28

Не следует путать с наименее распространенным множителем .

Получив список натуральных чисел с более чем одним элементом, верните наиболее распространенное произведение двух элементов в массиве.

Например, ГМА списка [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 Хорошее предложение, добавлено
Джо Кинг

Ответы:


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 кодовых точек и, следовательно, по несколько байт каждый?
Holloway


11

R , 54 50 41 байт

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

Попробуйте онлайн!

В качестве альтернативы для 54 53 44 байтов:

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

Попробуйте онлайн!

В принципе, последняя версия выводит соответствующий результат даже без namesфункции, но сопровождается подсчетом таких наиболее часто встречающихся продуктов, о которых не просят ...

Спасибо CriminallyVulgar за -4 и -1, и Джузеппе за -9 на обоих.


1
На втором этапе вы можете использовать -table () вместо нисходящего = TRUE для -1. Мне действительно нравится хитрость первого. РЕДАКТИРОВАТЬ: Только что понял, что вы также можете применить это к первому за -4, так что есть это. Попробуйте онлайн!
Преступно-

1
combn(scan(),2,prod)работает вместо использованияapply
Джузеппе

8

Желе , 6 байт

ŒcP€Æṃ

Попробуйте онлайн! или проверить набор тестов .

Как это работает

ŒcP € Æṃ - Полная программа / Монадическая ссылка.
Œc - неупорядоченные пары без замены.
  P € - продукт каждого.
    Mode - режим (самый распространенный элемент).

Альтернатива: ZcZPÆṃ

7

Pyth, 12 байт

eo/QN=*M.cQ2

Тестирование

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


7

MATL , 8 7 байт

2XN!pXM

Попробуйте онлайн!

(-1 байт, используя метод из @Mr. Xcoder's Jelly answer .)

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ùP.M 6 байт
Kaldo

@ Калдо Спасибо! Полностью забыл про ù.
Кевин Круйссен

6

Mathematica, 32 байта

-17 байт (и исправление) благодаря JungHwan Мин .

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

Чистая функция. Принимает список номеров в качестве входных данных и возвращает список MCM в качестве выходных данных.


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

@JungHwanMin Да. Я думал, что 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?
ааааа говорит восстановить Монику

5

Perl 6 , 41 38 байт

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

Попробуйте онлайн!


Не могли бы вы объяснить мне (или указать мне документы), что там делают колоны? Я не могу понять это ... Я вижу, что это как-то связано с передачей аргументов, но не более того.
Рамилли

1
@Ramillies Это инфиксный: оператор.
nwellnhof

Ах я вижу. Спасибо.
Рамилли



4

Атташе , 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 Да, это необходимо; [5, 2, 9, 10, 3, 4, 4, 4, 7] -> 16а 20не без этого.
Конор О'Брайен


3

Древесный уголь , 24 байта

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

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

Wθ

Пока входной массив не пустой ...

×⊟θθ

... вытолкнуть последний элемент и умножить оставшуюся часть массива на этот элемент ...

F...⊞υκ

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

⌈Eυ№υλ

Подсчитайте, сколько раз каждый продукт появляется в списке, и возьмите максимум ...

Φυ⁼№υι...

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

I⊟

... затем вытолкните последний элемент и приведите к строке для неявной печати.



3

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

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

Попробуйте онлайн!

Молчаливый фн.

Спасибо 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 нет функции powerset (в отличие от множества других языков игры в гольф - отличный выбор с моей стороны), что означает, что мне пришлось вручную находить powerset. Тем не менее, это дало мне возможность игнорировать любое недопустимое количество факторов, в отличие от других ответов с функцией powerset.

Это должно быть в гольф, учитывая, что я ужасен в 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 #) , 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 MODE.


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.