Multiple Most Common


28

Jangan bingung dengan Least Common Multiple .

Diberikan daftar bilangan bulat positif dengan lebih dari satu elemen, kembalikan produk paling umum dari dua elemen dalam array.

Misalnya, MCM daftar [2,3,4,5,6]adalah 12, seperti tabel produk adalah:

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

Terima kasih DJMcMayhem untuk tabelnya

Seperti yang 12muncul paling sering (dua kali lipat 2*6dan 3*4). Perhatikan bahwa kami tidak termasuk produk elemen dan itu sendiri, jadi 2*2atau 4*4tidak muncul dalam daftar ini. Namun, elemen identik masih akan dikalikan, sehingga tabel untuk [2,3,3]terlihat seperti:

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

Dengan keberadaan MCM 6.

Jika terjadi dasi, Anda dapat mengembalikan salah satu elemen yang diikat, atau daftar semuanya.

  • Ini adalah , sehingga jumlah byte terpendek untuk setiap bahasa akan menang!

Uji kasus:

[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
Test case yang disarankan: dimana semua elemennya sama (yaitu [3,3,3] -> 9). Dengan semua kasus pengujian Anda saat ini menyaring pasangan mana pun yang elemennya sama (bahkan untuk kasus uji seperti [2,3,3]mengandung nilai yang sama) masih akan menahan hasil tes yang benar, tetapi akan gagal untuk kasus pengujian ini karena tidak ada yang akan tetap setelah penyaringan.
Kevin Cruijssen

@Kevin Saran bagus, ditambahkan
Jo King

Jawaban:



11

R , 54 50 41 byte

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

Cobalah online!

Atau, untuk 54 53 44 byte:

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

Cobalah online!

Pada prinsipnya, versi terakhir menampilkan hasil yang relevan bahkan tanpa namesfungsi, tetapi diikuti oleh jumlah produk yang paling sering, yang tidak diminta untuk ...

Terima kasih kepada CriminallyVulgar untuk -4 dan -1, dan Giuseppe untuk -9 pada keduanya.


1
Pada tanggal 2 Anda dapat menggunakan -tabel () alih-alih turun = BENAR untuk -1. Saya sangat suka kepintaran yang pertama. EDIT: Baru sadar Anda juga bisa menerapkannya pada yang pertama untuk -4, jadi begitulah. Cobalah online!
CriminallyVulgar

1
combn(scan(),2,prod)bekerja alih-alih menggunakanapply
Giuseppe

8

Jelly , 6 byte

ŒcP€Æṃ

Cobalah online! atau Lihat test suite .

Bagaimana itu bekerja

ŒcP € Æṃ - Program lengkap / Tautan monadik.
Œc - Pasangan tidak teratur tanpa penggantian.
  P € - Produk masing-masing.
    Æṃ - Mode (elemen paling umum).

Alternatif: ŒcZPÆṃ

7

Pyth, 12 byte

eo/QN=*M.cQ2

Suite uji

Pertama, kami mengambil semua kombinasi elemen 2 dari input tanpa penggantian ( .cQ2). Lalu, kami memetakan masing-masing pasangan ini ke produk mereka ( *M). Selanjutnya, kami menimpa variabel input dengan daftar produk ( =). Selanjutnya, kami mengurutkan daftar produk berdasarkan jumlah kemunculan dalam daftar produk ( o/QN). Akhirnya, ambil elemen terakhir dari daftar yang disortir ( e).


7

MATL , 8 7 byte

2XN!pXM

Cobalah online!

(-1 byte dengan menggunakan metode dari @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

Jawaban yang lebih lama:

8 byte

&*XRXzXM

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

æ2ùP.M

-2 byte terima kasih kepada @Kaldo .

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

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

@Kaldo Terima kasih! Benar-benar lupa ù.
Kevin Cruijssen

6

Mathematica, 32 byte

-17 byte (dan perbaikan) terima kasih kepada JungHwan Min .

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

Fungsi murni. Mengambil daftar angka sebagai input dan mengembalikan daftar MCM sebagai output.


Sebenarnya sepertinya kita berdua salah membaca pertanyaan. Ini gagal untuk input {3, 3, 3}. Tetap:Commonest[1##&@@@#~Subsets~{2}]&
JungHwan Min

@JungHwanMin Huh. Saya pikir itu Subsetstidak menghitung pengulangan sebagai elemen terpisah. Sepertinya memang begitu, jadi terima kasih!
LegionMammal978

5

MATLAB, 43 byte

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

Ini juga semacam twister lidah!

Penjelasan

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
saya tidak yakin Anda perlu melakukan I'*I*1-eyeMengapa tidak adil I'*I-eye?
aaaaa kata mengembalikan Monica

5

Perl 6 , 41 38 byte

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

Cobalah online!


Bisakah Anda jelaskan kepada saya (atau arahkan saya ke dokumen) apa yang dilakukan titik dua di sana? Saya tidak bisa keluar ... Saya bisa melihat bahwa itu ada hubungannya dengan berlalunya argumen tetapi tidak lebih.
Ramillies

1
@Ramillies Itu operator infiks: .
nwellnhof

Ah, begitu. Terima kasih.
Ramillies



4

Attache , 59 byte

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

Cobalah online!

Masih berusaha sedikit menurunkan golf ini, tapi saya pikir ini mendekati optimal untuk pendekatan yang saya pilih.

Penjelasan

Ini adalah komposisi dari tiga fungsi:

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

Fungsi pertama melakukan sebagian besar perhitungan:

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

Yang kedua agak rumit tetapi melakukan sesuatu yang agak sederhana. Pertama, berguna untuk mengetahui bahwa itu f&nadalah fungsi yang, ketika dipanggil dengan argumen ...x, kembali f[...x, n]. f&:nserupa, kembali f[n, ...x]. Sekarang, mari kita uraikan ini:

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

Pertama, f#gbuat garpu. Dengan input n, ia kembali f[n, g[n]]. Namun, dalam hal ini, fadalah fungsinya ~SortBy. ~fmembalikkan argumen fungsi. Ini berarti ~f#gsetara dengan f[g[n], n], atau di sini SortBy[(`& &: `~)[n], n],.

`& &: `~ikuti formulir f&:n. Tetapi apakah itu `&dan `~? Mereka adalah "kutipan operator", dan mengembalikan fungsi yang setara dengan operator yang dikutip. Jadi, dalam hal ini, `&adalah hal yang sama dengan ${ x & y }. Dengan mengingat hal itu, ungkapan ini setara dengan yang berikut untuk operator biner:

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

Ini menghasilkan fungsi `~&x, di mana xhasil dari fungsi pertama. n ~ amenghitung kejadian ndi a. Jadi, ini mengembalikan fungsi yang menghitung kemunculan argumen dalam array yang dihitung dari fungsi 1.

Kembali ke SortBy, ini setiap elemen dalam array dengan berapa kali muncul di dalamnya.

Akhirnya, Lastambil elemen yang paling banyak terjadi. Ikatan rusak oleh algoritma penyortiran.


Apakah bagian UpperTriangle diperlukan? Bisakah Anda meratakan meja dan mengurutkannya?
svavil

@svavil Ya, itu diperlukan; [5, 2, 9, 10, 3, 4, 4, 4, 7] -> 16bukannya 20tanpa itu.
Conor O'Brien


3

Arang , 24 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

Wθ

Sementara larik input tidak kosong ...

×⊟θθ

... pop elemen terakhir dan gandakan sisa array dengan elemen itu ...

F...⊞υκ

... dan dorong hasilnya ke daftar kosong yang telah ditentukan.

⌈Eυ№υλ

Hitung berapa kali setiap produk muncul dalam daftar dan ambil ...

Φυ⁼№υι...

... lalu filter untuk produk yang jumlahnya sama dengan maksimum ...

I⊟

... lalu pop elemen terakhir dan masukkan ke string untuk hasil cetak implisit.


3

Sekam , 7 byte

Ṡ►#mΠṖ2

Cobalah online!

Penjelasan

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

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

Cobalah online!

Tacit fn.

Terima kasih Adám untuk versi diam-diam dan 2 byte.

Terima kasih ngn untuk 8 byte!

Bagaimana:

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


3

CJam , 70 68 byte

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

Cobalah online!

Penjelasan

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

Anda perlu menggulir ke kanan untuk melihat penjelasan karena kodenya cukup panjang, serta penjelasannya.


Ini adalah mimpi buruk mutlak untuk ditulis. CJam tidak memiliki fungsi powerset (tidak seperti satu ton bahasa golf lainnya - pilihan bagus di pihak saya), yang berarti bahwa saya harus secara manual menemukan powerset. Namun, ini memberi saya kesempatan untuk mengabaikan sejumlah faktor yang tidak valid, tidak seperti jawaban lain dengan fungsi powerset.

Ini harus golf, mengingat saya buruk di CJam.


Perubahan:

Helen memotong 2 byte!

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

Dengan mengubah 1-s secara sederhana (kita mendapatkan efek yang sama tetapi dengan jumlah byte yang lebih rendah.



2

Haskell , 96 94 byte

-2 byte terima kasih kepada nimi (menggunakan sortOn(0<$)bukan length)!

import Data.List
f a|b<-zip[0..]a=last.last.sortOn(0<$).group$sort[x*y|(i,x)<-b,(j,y)<-b,i/=j]

Cobalah online!



2

SQL Server, 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

Input diasumsikan berasal dari tabel formulir

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

Populasi tabel contoh:

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

Penjelasan:

Saya berasumsi "daftar bilangan bulat" akan memiliki indeks yang terkait dengannya, yang dalam kasus saya adalah kolom i. Kolom aberisi nilai-nilai daftar.

Saya membuat produk dari setiap pasangan, di mana pasangan kiri masuk dalam daftar lebih awal dari pasangan yang tepat. Saya kemudian mengelompokkan produk, dan mengurutkan berdasarkan jumlah yang paling padat.

Saya sedikit sedih karena saya tidak bisa menggunakan klausa cte atau partisi, tetapi terlalu panjang. SELECTadalah kata kunci yang sangat mahal.

Alternatif, 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

Jika SQL tidak dapat memiliki kolom indeks terpisah, berikut ini adalah solusi tempat saya membuat indeks menggunakan ROW_NUMBERfungsi. Saya pribadi tidak peduli dengan pesanan, tetapi pesanan diperlukan dan menggunakan akolom adalah yang terpendek.



2

Burlesque - 8 byte

Jcp)pdn!

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

Cobalah online di sini.

(dan ya, Burlesque juga memiliki perintah untuk "elemen paling tidak umum")


2

C # (Visual C # Interactive Compiler) , 95 byte

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

Cobalah online!

Lebih sedikit kode golf:

// 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));

mengambil input dari argumen baris perintah; jalankan dengan -nratau coba online .

Gunakan PHP 7 untuk menghindari peringatan STRICT MODE.


1

J, 29 25 24 23 byte

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

Cobalah online!

bagaimana

(~. {.@\: 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 karakter, 106 byte

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

Uji:

  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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.