Najczęstszy wielokrotność


28

Nie mylić z najmniejszą wielokrotnością .

Biorąc pod uwagę listę dodatnich liczb całkowitych z więcej niż jednym elementem, zwróć najpopularniejszy iloczyn dwóch elementów w tablicy.

Na przykład MCM listy [2,3,4,5,6]jest 12, ponieważ tabela produktów to:

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

Dzięki DJMcMayhem za stół

Jak 12pojawia się najczęściej (dwa razy jako 2*6i 3*4). Należy pamiętać, że nie jesteśmy w tym produkt elementu i sobie, tak 2*2lub 4*4nie nie pojawiają się na tej liście. Jednak identyczne elementy będą nadal mnożone, więc tabela [2,3,3]wygląda następująco:

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

Z MCM jest 6.

W przypadku remisu możesz zwrócić dowolny z powiązanych elementów lub listę wszystkich z nich.

  • To jest , więc wygrywa najkrótsza bajt dla każdego języka!

Przypadki testowe:

[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
Sugerowany przypadek testowy: taki, w którym wszystkie elementy są takie same (tj [3,3,3] -> 9.). Wszystkie obecne przypadki testowe odfiltrowują wszystkie pary, w których elementy są takie same (nawet w przypadku przypadków testowych, takich jak [2,3,3]zawierające te same wartości) nadal będą przechowywać poprawne wyniki testu, ale zawiodą dla tego przypadku testowego, ponieważ żadne nie pozostanie po filtrowaniu.
Kevin Cruijssen

@Kevin Dobra sugestia, dodano
Jo King

Odpowiedzi:


11

Brachylog , 11 bajtów

{⊇Ċ×}ᶠọtᵒth

Wypróbuj online!

Wyjaśnienie

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

Nie wiem, jak zwykle działa golf golfowy, ale czy niektóre z tych znaków nie znajdują się poza standardowymi 256 punktami kodowymi, a zatem wiele bajtów każdy?
Holloway,


11

R , 54 50 41 bajtów

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

Wypróbuj online!

Alternatywnie, dla 54 53 44 bajtów:

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

Wypróbuj online!

Zasadniczo ta ostatnia wersja generuje odpowiedni wynik nawet bez namesfunkcji, ale następuje liczba takich najczęstszych produktów, o które nie prosi się ...

Podziękowania dla CriminallyVulgar za -4 i -1 oraz Giuseppe za -9 w obu przypadkach.


1
Z drugiej strony możesz użyć opcji -table () zamiast malejąco = PRAWDA dla -1. Naprawdę podoba mi się spryt tego pierwszego. EDYCJA: Właśnie zdałem sobie sprawę, że możesz również zastosować to do pierwszego dla -4, więc jest to. Wypróbuj online!
CriminallyVulgar

1
combn(scan(),2,prod)działa zamiast używaćapply
Giuseppe


7

Pyth, 12 bajtów

eo/QN=*M.cQ2

Zestaw testowy

Najpierw bierzemy wszystkie 2-elementowe kombinacje danych wejściowych bez replace ( .cQ2). Następnie mapujemy każdą z tych par do ich produktu ( *M). Następnie nadpisujemy zmienną wejściową listą produktów ( =). Następnie sortujemy listę produktów według liczby wystąpień na liście produktów ( o/QN). Na koniec weź ostatni element posortowanej listy ( e).


7

MATL , 8 7 bajtów

2XN!pXM

Wypróbuj online!

(-1 bajt przy użyciu metody z @Mr. Odpowiedź galaretki Xcodera .)

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

Starsza odpowiedź:

8 bajtów

&*XRXzXM

Wypróbuj online!

&*    % 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 bajtów

æ2ùP.M

-2 bajty dzięki @Kaldo .

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

æ         # 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 przez 6 bajtów
Kaldo

@Kaldo Thanks! Zupełnie zapomniałem o ù.
Kevin Cruijssen

6

Mathematica, 32 bajty

-17 bajtów (i poprawka) dzięki JungHwan Min .

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

Czysta funkcja. Pobiera listę liczb jako dane wejściowe i zwraca listę MCM jako dane wyjściowe.


Wygląda na to, że oboje źle odczytaliśmy pytanie. Nie można wprowadzić danych wejściowych {3, 3, 3}. Naprawiono:Commonest[1##&@@@#~Subsets~{2}]&
JungHwan Min

@JungHwanMin Huh. Myślałem, że Subsetsnie liczy się powtórzeń jako osobnych elementów. Wygląda na to, że tak, więc dziękuję!
LegionMammal978,

5

MATLAB, 43 bajty

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

To także coś w rodzaju twistera języka!

Wyjaśnienie

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
nie jestem pewien, czy musisz to zrobić I'*I*1-eyeDlaczego nie tylko I'*I-eye?
aaaaa mówi o przywróceniu Moniki




4

Attache , 59 bajtów

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

Wypróbuj online!

Nadal pracuję nad tym trochę, ale myślę, że jest to prawie optymalne dla wybranego przeze mnie podejścia.

Wyjaśnienie

Jest to kompozycja trzech funkcji:

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

Pierwsza funkcja wykonuje większość obliczeń:

{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]

Drugi jest nieco skomplikowany, ale robi coś raczej prostego. Po pierwsze, warto wiedzieć, że f&njest to funkcja, która po wywołaniu z argumentami ...xzwraca f[...x, n]. f&:njest podobny, powraca f[n, ...x]. Teraz rozłóżmy to:

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

Najpierw f#gtworzy widelec. Z wejściem nzwraca f[n, g[n]]. Jednak w tym przypadku fjest funkcja ~SortBy. ~fodwraca argumenty funkcji. Oznacza to, że ~f#gjest równoważne f[g[n], n]lub tutaj SortBy[(`& &: `~)[n], n].

`& &: `~postępuje zgodnie z formularzem f&:n. Ale czym są `&i `~? Są to „cudzysłowy operatora” i zwracają funkcję równoważną operatorowi cytowanemu. Tak więc w tym przypadku `&jest to samo, co ${ x & y }. Mając to na uwadze, wyrażenie to jest równoważne z następującym dla operatorów binarnych:

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

Daje to funkcję `~&x, gdzie xjest wynikiem pierwszej funkcji. n ~ azlicza wystąpienia nw a. Zwraca więc funkcję, która zlicza wystąpienie argumentu w obliczonej tablicy z funkcji 1.

Wracając do SortBy, ten każdy element w tablicy według liczby razy w nim pojawia się.

Wreszcie Lastbierze element, który występuje najczęściej. Więzy są zrywane przez algorytm sortowania.


Czy wymagana jest część UpperTriangle? Czy możesz po prostu spłaszczyć stół i posortować?
svavil

@svavil Tak, jest to wymagane; [5, 2, 9, 10, 3, 4, 4, 4, 7] -> 16zamiast 20tego.
Conor O'Brien


3

Węgiel drzewny , 24 bajty

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

Wθ

Podczas gdy tablica wejściowa nie jest pusta ...

×⊟θθ

... pop ostatni element i pomnóż resztę tablicy przez ten element ...

F...⊞υκ

... i wrzuć wyniki do wstępnie zdefiniowanej pustej listy.

⌈Eυ№υλ

Policz, ile razy każdy produkt pojawia się na liście i weź maksymalnie ...

Φυ⁼№υι...

... następnie filtruj produkty, których liczba jest równa temu maksimum ...

I⊟

... następnie pop ostatni element i rzut na ciąg w celu niejawnego wydruku.


3

Łuska , 7 bajtów

Ṡ►#mΠṖ2

Wypróbuj online!

Wyjaśnienie

Ṡ►#mΠṖ2  -- example input [3,3,3]
     Ṗ2  -- subsequences of length 2: [[3,3],[3,3],[3,3]]
   mΠ    -- map product: [9,9,9]
Ṡ        -- apply 
  #      -- | count occurences in list
 ►       -- to maxOn that list: [9]

3

APL (Dyalog Unicode) , 29 27 19 bajtów

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

Wypróbuj online!

Tacit fn.

Dzięki Adám za cichą wersję i 2 bajty.

Dzięki ngn za 8 bajtów!

W jaki sposób:

{⌈/⊢/⊣¨⌸∊⍵}⍳∘≢↓¨⊢×⊂
                ⊢×⊂    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
To tylko 27 .
Adám,


3

CJam , 70 68 bajtów

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

Wypróbuj online!

Wyjaśnienie

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

Musisz przewinąć w prawo, aby zobaczyć wyjaśnienia, ponieważ kod jest dość długi, a także wyjaśnienia.


To był absolutny koszmar do napisania. CJam nie ma funkcji powerset (w przeciwieństwie do mnóstwa innych języków golfowych - świetny wybór z mojej strony), co oznacza, że ​​musiałem ręcznie znaleźć powerset. Dało mi to jednak możliwość zignorowania niepoprawnej liczby czynników, w przeciwieństwie do innych odpowiedzi z funkcją powerset.

To powinno być możliwe do gry w golfa, biorąc pod uwagę, że jestem okropny w CJam.


Zmiany:

Helen odciąła 2 bajty!

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

Zmieniając 1-s na po prostu (uzyskujemy ten sam efekt, ale z mniejszą liczbą bajtów.





2

SQL Server, 93 bajty

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

Zakłada się, że dane wejściowe pochodzą z tabeli formularza

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

Przykładowa populacja tabeli:

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

Wyjaśnienie:

Zakładam, że z „listą liczb całkowitych” będzie powiązany indeks, którym w moim przypadku jest kolumna i. Kolumna azawiera wartości listy.

Tworzę produkty każdej pary, w których lewa para pojawia się na liście wcześniej niż prawa para. Następnie grupuję produkt i sortuję według najbardziej zaludnionej liczby.

Trochę mi smutno, że nie skorzystałem z żadnych klauzul cte ani partycjonowania, ale były one po prostu za długie. SELECTjest bardzo drogim słowem kluczowym.

Alternatywnie, 183 bajty

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

Jeśli SQL nie otrzyma oddzielnej kolumny indeksu, oto rozwiązanie, w którym tworzę indeks za pomocą ROW_NUMBERfunkcji. Osobiście nie dbam o zamówienie, ale zamówienie jest wymagane, a użycie akolumny jest najkrótsze.



2

Burleska - 8 bajtów

Jcp)pdn!

J        duplicate
 cp      cross product
   )pd   map . product
      n! most common element

Wypróbuj online tutaj.

(i tak, Burleska ma również polecenie „najmniej wspólnego elementu”)


2

C # (interaktywny kompilator Visual C #) , 95 bajtów

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

Wypróbuj online!

Kod mniej golfowy:

// 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 bajtów

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

pobiera dane wejściowe z argumentów wiersza poleceń; uruchom -nrlub wypróbuj online .

Użyj PHP 7, aby uniknąć ostrzeżenia TRYB WYSOKIEGO.


1

J, 29 25 24 23 bajtów

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

Wypróbuj online!

w jaki sposób

(~. {.@\: 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 znaki, 106 bajtów

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

Test:

  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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.