Bội số phổ biến nhất


28

Không nên nhầm lẫn với Least Common bội .

Đưa ra một danh sách các số nguyên dương có nhiều hơn một phần tử, trả về sản phẩm phổ biến nhất của hai phần tử trong mảng.

Ví dụ: MCM của danh sách [2,3,4,5,6]12, như một bảng sản phẩm là:

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

Cảm ơn DJMcMayhem cho bảng

Như 12xuất hiện nhiều lần nhất (hai lần như 2*63*4). Lưu ý rằng chúng tôi không bao gồm sản phẩm của một yếu tố và chính nó, vì vậy 2*2hoặc 4*4không xuất hiện trong danh sách này. Tuy nhiên, các phần tử giống hệt nhau vẫn sẽ được nhân lên, do đó, bảng cho [2,3,3]hình như:

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

Với MCM được 6.

Trong trường hợp hòa, bạn có thể trả về bất kỳ yếu tố nào, hoặc danh sách tất cả chúng.

  • Đây là , vì vậy số byte ngắn nhất cho mỗi ngôn ngữ sẽ thắng!

Các trường hợp thử nghiệm:

[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
Trường hợp thử nghiệm được đề xuất: một trong đó tất cả các yếu tố đều giống nhau (nghĩa là [3,3,3] -> 9). Với tất cả các trường hợp thử nghiệm hiện tại của bạn, việc lọc ra bất kỳ cặp nào có các phần tử giống nhau (ngay cả đối với các trường hợp thử nghiệm như [2,3,3]chứa cùng một giá trị) sẽ vẫn giữ kết quả thử nghiệm chính xác, nhưng sẽ thất bại đối với trường hợp thử nghiệm này vì không tồn tại sau khi lọc.
Kevin Cruijssen

@Kevin Đề xuất tốt, đã thêm
Jo King

Câu trả lời:


11

Brachylog , 11 byte

{⊇Ċ×}ᶠọtᵒth

Hãy thử trực tuyến!

Giải trình

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

Tôi không biết làm thế nào mã golf thường hoạt động nhưng không phải là một trong số các ký tự này ngoài 256 điểm mã tiêu chuẩn và do đó nhiều byte mỗi?
Holloway


11

R , 54 50 41 byte

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

Hãy thử trực tuyến!

Ngoài ra, với 54 53 44 byte:

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

Hãy thử trực tuyến!

Về nguyên tắc, phiên bản sau xuất ra kết quả có liên quan ngay cả khi không có nameschức năng, nhưng theo sau là số lượng các sản phẩm thường xuyên nhất, không được yêu cầu ...

Cảm ơn CriminallyVulgar cho -4 và -1 và Giuseppe cho -9 trên cả hai.


1
Vào lần thứ hai, bạn có thể sử dụng -table () thay vì giảm dần = TRUE cho -1. Tôi thực sự thích sự thông minh của người đầu tiên mặc dù. EDIT: Chỉ cần nhận ra rằng bạn cũng có thể áp dụng điều đó cho lần đầu tiên cho -4, vì vậy có điều đó. Hãy thử trực tuyến!
CriminallyVulgar

1
combn(scan(),2,prod)hoạt động thay vì sử dụngapply
Giuseppe


7

Bình thường, 12 byte

eo/QN=*M.cQ2

Bộ kiểm tra

Đầu tiên, chúng tôi lấy tất cả 2 kết hợp phần tử của đầu vào mà không thay thế ( .cQ2). Sau đó, chúng tôi ánh xạ từng cặp này vào sản phẩm của họ ( *M). Tiếp theo, chúng tôi ghi đè biến đầu vào bằng danh sách các sản phẩm ( =). Tiếp theo, chúng tôi sắp xếp danh sách các sản phẩm theo số lần xuất hiện trong danh sách các sản phẩm ( o/QN). Cuối cùng, lấy phần tử cuối cùng của danh sách đã sắp xếp ( e).


7

MATL , 8 7 byte

2XN!pXM

Hãy thử trực tuyến!

(-1 byte bằng cách sử dụng phương thức từ câu trả lời Jelly của @Mr. Xcoder's .)

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

Câu trả lời cũ hơn:

8 byte

&*XRXzXM

Hãy thử trực tuyến!

&*    % 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 byte

æ2ùP.M

-2 byte nhờ @Kaldo .

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

æ         # 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 cho 6 byte
Kaldo

@Kaldo Cảm ơn! Hoàn toàn quên mất ù.
Kevin Cruijssen

6

Toán học, 32 byte

-17 byte (và bản sửa lỗi) nhờ JungHwan Min .

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

Chức năng thuần túy. Lấy danh sách các số làm đầu vào và trả về danh sách các MCM làm đầu ra.


Thật ra có vẻ như cả hai chúng tôi đều đọc sai câu hỏi. Điều này không thành công cho đầu vào {3, 3, 3}. Đã sửa:Commonest[1##&@@@#~Subsets~{2}]&
JungHwan Min

@JungHwanMin Huh. Tôi nghĩ rằng Subsetskhông tính lặp lại như là các yếu tố riêng biệt. Có vẻ như nó làm, mặc dù, vì vậy cảm ơn!
LegionMammal978

5

MATLAB, 43 byte

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

Nó cũng là một loại twister lưỡi!

Giải trình

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
tôi không chắc bạn cần phải làm gì I'*I*1-eyeTại sao không I'*I-eye?
aaaaa nói phục hồi Monica

5

Perl 6 , 41 38 byte

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

Hãy thử trực tuyến!


Bạn có thể vui lòng giải thích cho tôi (hoặc chỉ cho tôi các tài liệu) các dấu hai chấm đang làm gì ở đó không? Tôi hoàn toàn không thể làm được ... Tôi có thể thấy rằng nó có liên quan đến tranh luận nhưng không có gì hơn.
Ramillies

1
@Ramillies Đó là toán tử infix: .
nwellnhof

Ah tôi thấy. Cảm ơn bạn.
Ramillies



4

Tùy viên , 59 byte

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

Hãy thử trực tuyến!

Vẫn đang nghiên cứu về việc đánh gôn này một chút, nhưng tôi nghĩ rằng điều này gần tối ưu cho cách tiếp cận tôi đã chọn.

Giải trình

Đây là một thành phần của ba chức năng:

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

Hàm đầu tiên thực hiện phần lớn tính toán:

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

Thứ hai là một chút phức tạp nhưng làm một cái gì đó khá đơn giản. Đầu tiên, rất hữu ích khi biết đó f&nlà một hàm mà khi được gọi bằng các đối số ...xsẽ trả về f[...x, n]. f&:nlà tương tự, trở về f[n, ...x]. Bây giờ, hãy phân tách cái này:

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

Đầu tiên, f#gtạo một ngã ba. Với đầu vào n, nó trả về f[n, g[n]]. Tuy nhiên, trong trường hợp này, flà chức năng ~SortBy. ~fđảo ngược các đối số của hàm. Điều này có nghĩa ~f#glà tương đương với f[g[n], n], hoặc ở đây , SortBy[(`& &: `~)[n], n].

`& &: `~theo mẫu f&:n. Nhưng những gì đang `&`~? Chúng là "dấu ngoặc kép toán tử" và trả về một hàm tương đương với toán tử được trích dẫn. Vì vậy, trong trường hợp này, `&cũng giống như${ x & y } . Với ý nghĩ đó, biểu thức này tương đương với biểu thức sau cho các toán tử nhị phân:

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

Điều này mang lại chức năng `~&x, nơi xlà kết quả từ chức năng đầu tiên. n ~ ađếm số lần xuất hiện củan trong a. Vì vậy, điều này trả về một hàm tính các lần xuất hiện của đối số trong mảng được tính từ hàm 1.

Sẽ trở lại SortBy , điều này mỗi phần tử trong mảng bằng số lần nó xuất hiện trong nó.

Cuối cùng, Lastlấy phần tử xảy ra nhiều nhất. Ties bị phá vỡ bởi các thuật toán sắp xếp.


Là phần UpperTrigin cần thiết? Bạn có thể chỉ cần làm phẳng bảng và sắp xếp?
Svavil

@svavil Có, nó là bắt buộc; [5, 2, 9, 10, 3, 4, 4, 4, 7] -> 16thay vì 20không có nó
Conor O'Brien

4

JavaScript (ES6), 72 70 byte

a=>a.map(m=o=(y,Y)=>a.map(x=>Y--<0?m=(o[x*=y]=-~o[x])<m?m:o[r=x]:0))|r

Hãy thử trực tuyến!


@tsh Vấn đề là đường chéo chính, trong đó bội số không nên được tính ở tất cả. Vì vậy, nó không thành công cho trường hợp thử nghiệm áp chót có ba16 trên đường chéo chính, đưa điểm số của nó đủ cao để được trả lại thay vì dự kiến 20.
Arnauld

3

Than , 24 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

Wθ

Trong khi mảng đầu vào không trống ...

×⊟θθ

... bật phần tử cuối cùng và nhân phần còn lại của mảng với phần tử đó ...

F...⊞υκ

... và đẩy kết quả vào danh sách trống được xác định trước.

⌈Eυ№υλ

Đếm số lần mỗi sản phẩm xuất hiện trong danh sách và lấy tối đa ...

Φυ⁼№υι...

... sau đó lọc các sản phẩm có số lượng bằng tối đa ...

I⊟

... Sau đó bật phần tử cuối cùng và chuyển thành chuỗi để in ngầm.


3

Husk , 7 byte

Ṡ►#mΠṖ2

Hãy thử trực tuyến!

Giải trình

Ṡ►#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 byte

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

Hãy thử trực tuyến!

Tít fn.

Cảm ơn Adám cho phiên bản ngầm và 2 byte.

Cảm ơn ngn cho 8 byte!

Làm sao:

{⌈/⊢/⊣¨⌸∊⍵}⍳∘≢↓¨⊢×⊂
                ⊢×⊂    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
Đây chỉ là 27 .
Adám


3

CJam , 70 68 byte

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

Hãy thử trực tuyến!

Giải trình

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

Bạn sẽ cần phải cuộn sang phải để xem các giải thích vì mã này khá dài, cũng như các giải thích.


Đây là một cơn ác mộng tuyệt đối để viết. CJam không có chức năng powerset (không giống như một tấn ngôn ngữ chơi gôn khác - phần lớn là sự lựa chọn của tôi), điều đó có nghĩa là tôi phải tự tìm bộ điều khiển. Tuy nhiên, điều này đã cho tôi cơ hội bỏ qua bất kỳ yếu tố không hợp lệ nào, không giống như các câu trả lời khác có chức năng powerset.

Điều này có thể chơi được, vì tôi rất tệ ở CJam.


Thay đổi:

Helen cắt đi 2 byte!

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

Bằng cách thay đổi 1-s thành đơn giản, (chúng ta có được hiệu ứng tương tự nhưng với số byte thấp hơn.





2

Máy chủ SQL, 93 byte

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

Đầu vào được cho là đến từ một bảng có dạng

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

Ví dụ về dân số bảng:

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

Giải trình:

Tôi giả sử một "danh sách các số nguyên" sẽ có một chỉ mục được liên kết với chúng, trong trường hợp của tôi là cột i. Cột achứa các giá trị của danh sách.

Tôi tạo ra các sản phẩm của mỗi cặp, trong đó cặp bên trái xuất hiện trong danh sách sớm hơn cặp bên phải. Sau đó, tôi nhóm trên sản phẩm và sắp xếp theo số lượng đông dân nhất.

Tôi hơi buồn khi tôi không sử dụng bất kỳ mệnh đề cte hoặc phân vùng nào, nhưng chúng quá dài. SELECTlà một từ khóa rất đắt tiền.

Thay thế, 183 byte

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

Nếu SQL không có cột chỉ mục riêng, thì đây là giải pháp tôi tạo chỉ mục bằng ROW_NUMBERhàm. Cá nhân tôi không quan tâm đến đơn hàng, nhưng đơn hàng là bắt buộc và sử dụng acột là ngắn nhất.




2

C # (Trình biên dịch tương tác Visual C #) , 95 byte

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

Hãy thử trực tuyến!

Mã golf ít hơn:

// 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 byte

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

lấy đầu vào từ các đối số dòng lệnh; chạy với -nrhoặc thử trực tuyến .

Sử dụng PHP 7 để tránh cảnh báo MODIC STRICT.


1

J, 29 25 24 23 byte

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

Hãy thử trực tuyến!

làm sao

(~. {.@\: 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 ký tự, 106 byte

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

Kiểm tra:

  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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.