Hitung angka MU

19

Dua nomor MU pertama adalah 2 dan 3. Setiap nomor MU lainnya adalah nomor terkecil yang belum muncul yang dapat dinyatakan sebagai produk dari dua nomor MU yang berbeda sebelumnya dalam satu cara.

Inilah 10 yang pertama

2, 3, 6, 12, 18, 24, 48, 54, 96, 162

Tugas

Diberi angka positif, hitung dan hasilkan angka MU ke- n .

Ini adalah kompetisi sehingga Anda harus berusaha membuat kode sumber sekecil mungkin.

OEIS A007335

Wisaya Gandum
sumber
1
Pengindeksan 0 atau pengindeksan 1?
HyperNeutrino
1
@HyperNeutrino Baik-baik saja.
Wheat Wizard
2
Adakah yang tahu mengapa ini disebut nomor MU? (Tebakan liar: Multiplikasi Unik?)

Jawaban:

5

Pyth, 22 21 byte

@u+Gfq2l@GcLTGheGQhB2

Cobalah online. Suite uji.

Diindeks 0.

Penjelasan

@u+Gfq2l@GcLTGheGQhB2Q    Implicitly append Q and read+eval input to it.
                  hB2     Take the list [2, 2 + 1].
 u               Q        Put the list in G and apply this Q times:
               eG           Get last number in G.
              h             Add one.
    f                       Starting from that, find the first T such that:
          cLTG                Divide T by each of the numbers in G.
        @G                    Find the quotients that are also in G.
       l                      Get the number of such quotients.
     q2                       Check that it equals 2.
  +G                        Append that T to G.
@                    Q    Get the Q'th number in G.
PurkkaKoodari
sumber
The @tanda pada baris terakhir adalah sejajar. Saya tidak dapat membuat edit yang disarankan, karena ini adalah perubahan 2 karakter.
user2357112 mendukung Monica
@ user2357112 Diperbaiki.
PurkkaKoodari
4

Haskell, 80 77 byte

l#(a:b)|[x]<-[a|i<-l,j<-l,i<j,i*j==a]=a:(a:l)#b|1<2=l#b
((2:3:[2,3]#[4..])!!)

Cobalah online!

Bagaimana itu bekerja

2:3:             -- start the list with 2 and 3 and append a call to # with
    [2,3]        -- the list so far and
         #[4..]  -- list of candidate elements

l # (a:b)        -- l -> list so far, a -> next candidate element, b -> rest c.el.
  | [x]<-[...]   -- if the list [...] is a singleton list
    =a:(a:l#b) -- the result is a followed by a recursive call with l extended
                    by a and b
  | 1<2=l#b      -- if it's not a singleton list, drop a and retry with b

                 -- the [...] list is
 [ i<-l,j<-l,    -- loop i through l and j through l and whenever   
       i<j,      -- i<j and
       i*j==a]   -- i*j==a
  a|             -- add a to the list              
nimi
sumber
3

Jelly , 22 byte

ŒcP€ḟ⁸ṢŒgLÞḢḢṭ
2,3Ç¡ị@

Tautan monadik, 1-diindeks.

Cobalah online!

Bagaimana?

ŒcP€ḟ⁸ṢŒgLÞḢḢṭ - Link 1, add the next number: list, a  e.g. [2,3,6,12,18,24]
Œc             - unordered pairs                            [[2,3],[2,6],[2,12],[2,18],[2,24],[3,6],[3,12],[3,18],[3,24],[6,12],[6,18],[6,24],[12,18],[12,24],[18,24]]
  P€           - product of €ach                            [6,12,24,36,48,18,36,54,72,72,108,144,216,288,432]
     ⁸         - chain's left argument, a                   [2,3,6,12,18,24]
    ḟ          - filter discard                             [36,48,36,54,72,72,108,144,216,288,432]
      Ṣ        - sort                                       [36,36,48,54,72,72,108,144,216,288,432]
       Œg      - group runs of equal elements               [[36,36],[48],[54],[72,72],[108],[144],[216],[288],[432]]
          Þ    - sort by:
         L     -   length                                   [[48],[54],[108],[144],[216],[288],[432],[36,36],[72,72]]
           Ḣ   - head                                       [48]
            Ḣ  - head                                       48
             ṭ - tack to a                                  [2,3,6,12,18,24,48]

2,3Ç¡ị@ - Link: number, i                              e.g. 7
2,3     - literal [2,3]                                     [2,3]
    ¡   - repeat i times:
   Ç    -   call last link (1) as a monad                   [2,3,6,12,18,24,48,54,96]
     ị@ - index into with swapped @rguments (with i)        48
Jonathan Allan
sumber
3

R , 127 118 111 108 105 100 98 90 byte

8 byte terima kasih kepada Giuseppe.

r=3:2;for(i in 1:scan())r=c(min((g=(r%o%r)[i:-1<i])[colSums(g%o%g==g*g)+g%in%r<3]),r);r[3]

Cobalah online!

Biarawati Bocor
sumber
Saya butuh selamanya untuk menyadari bahwa <memiliki prioritas lebih rendah daripada +jadi saya tidak tahu apa yang +g%in%r<3sedang dilakukan, dan ketika saya melakukan itu, Anda bermain golf di dua bagian yang akan saya sarankan ... +1
Giuseppe
@ Giuseppe Saya baru mulai belajar R hari ini ... senang bertemu seorang pegolf R yang baik.
Leaky Nun
Saya akan mengatakan hal yang sama kepada Anda .............
Giuseppe
Ah, satu hal lagi, Anda bisa menggunakan n=scan()bukannya definisi fungsi untuk membaca dari stdin; itu akan membuat Anda di bawah 100
Giuseppe
Gagal untuk input:0
Rift
2

CJam (32 byte)

4,{_2m*{~>},::*1$-$e`$0=|}qi*-2=

Demo online dengan pengindeksan 0.

Saya tidak yakin ada banyak yang harus dilakukan di luar terjemahan sepele dari spec dengan satu pengecualian: dengan memulai dengan daftar [0 1 2 3](bukannya [2, 3]) saya menyimpan satu byte segera pada inisialisasi dan dua lainnya dengan dapat melakukan 0=|(menambahkan hanya elemen baru karena frekuensinya sudah 1dan sudah ada dalam daftar), tetapi jangan memperkenalkan elemen yang salah karena untuk setiap xdalam daftar 0*xdan 1*xsudah ada dalam daftar.

Peter Taylor
sumber
2

Python 2 , 127 118 byte

n=input()
l=[2,3]
exec't=sorted(x*y for i,x in enumerate(l)for y in l[i+1:]);l+=min(t,key=(l+t).count),;'*n
print l[n]

Cobalah online!

tongkat
sumber
1

Mathematica, 154 byte

modifikasi sederhana dari kode yang ditemukan di tautan oeis

(s={2,3};Do[n=Select[Split@Sort@Flatten@Table[s[[j]]s[[k]],{j,Length@s},{k,j+1,Length@s}],#[[1]]>s[[-1]]&&Length@#==1&][[1,1]];AppendTo[s,n],{#}];s[[#]])&
J42161217
sumber
1

PHP , 130 byte

Diindeks 0

for($r=[2,3];!$r[$argn];$r[]=$l=min($m)/2){$m=[];foreach($r as$x)foreach($r as$y)($p=$x*$y)<=$l|$y==$x?:$m[$p]+=$p;}echo$r[$argn];

Cobalah online!

Diperluas

for($r=[2,3];!$r[$argn]; #set the first to items and loop till search item exists
$r[]=$l=min($m)/2){ # add the half of the minimum of found values to the result array
  $m=[]; # start with empty array
  foreach($r as$x) # loop through result array
    foreach($r as$y) # loop through result array
      ($p=$x*$y)<=$l|$y==$x? # if product is greater as last value and we do multiple two distinct values
        :$m[$p]+=$p; # add 2 times or more the product to array so we drop 36 cause it will be 144  
}
echo$r[$argn]; # Output 

PHP , 159 byte

Diindeks 0

for($r=[2,3];!$r[$argn];$r[]=$l=min(array_diff_key($m,$d))){$d=$m=[];foreach($r as$x)foreach($r as$y)$x<$y?${dm[$m[$p=$x*$y]<1&$p>$l]}[$p]=$p:0;}echo$r[$argn];

Cobalah online!

PHP , 161 byte

Diindeks 0

for($r=[2,3];!$r[$argn];$r[]=$l=min(array_diff($m,$d))){$d=$m=[];foreach($r as$x)foreach($r as$y)$x<$y?${dm[!in_array($p=$x*$y,$m)&$p>$l]}[]=$p:0;}echo$r[$argn];

Cobalah online!

Jörg Hülsermann
sumber
1

Mathematica, 140 byte

(t=1;s={2,3};While[t<#,s=AppendTo[s,Sort[Select[First/@Select[Tally[Times@@@Permutations[s,{2}]],#[[2]]==2&],#>Last@s&]][[1]]];t++];s[[#]])&
J42161217
sumber
1

MATL , 25 byte

3:i:"t&*9B#u2=)yX-X<h]2_)

Cobalah online!

Penjelasan

3:     % Push [1 2 3]. Initial array of MU numbers, to be extended with more numbers
i:     % Input n. Push [1 2 ... n]
"      % Do this n times
  t    %   Duplicate array of MU numbers so far
  &*   %   Matrix of pair-wise products
  9B   %   Push 9 in binary, that is, [1 0 0 1]
  #    %   Specify that next function will produce its first and fourth ouputs
  u    %   Unique: pushes unique entries (first output) and their counts (fourth)
  2=   %   True for counts that equal 2
  )    %   Keep only unique entries with count 2
  y    %   Duplicate (from below) array of MU numbers so far
  X-   %   Set difference
  X<   %   Minimum. This is the new MU number
  h    %   Concatenate vertically horizontally to extend the array
]      % End
2_     % Push 2 negated, that is, -2
)      % Get entry at position -2, that is, third-last. Implicitly display
Luis Mendo
sumber
1

Perl 6 , 96 byte

{(2,3,{first *∉@_,@_.combinations(2).classify({[*]
$_}).grep(*.value==1)».key.sort}...*)[$_]}

Cobalah online!

  • 2, 3, { ... } ... *adalah urutan tak terbatas di mana setiap elemen dimulai dengan yang ketiga dihitung oleh blok kode yang dibatasi oleh tanda kurung. Karena blok kode mengambil argumennya melalui @_array slurpy , ia menerima seluruh urutan saat ini dalam array itu.
  • @_.combinations(2)adalah urutan semua kombinasi 2 elemen dari @_.
  • .classify({ [*] $_ }) mengklasifikasikan setiap 2-tupel berdasarkan produknya, menghasilkan hash di mana produk adalah kuncinya dan nilainya adalah daftar 2-tupel yang memiliki produk tersebut.
  • .grep(*.value == 1) memilih pasangan nilai kunci dari hash di mana nilai (yaitu, daftar pasangan yang memiliki kunci itu sebagai produk) memiliki ukuran 1.
  • ».keyhanya memilih kunci dari setiap pasangan. Ini adalah daftar produk yang muncul hanya dari satu kombinasi faktor dari urutan saat ini.
  • .sort mengurutkan produk secara numerik.
  • first * ∉ @_, ... menemukan yang pertama dari produk-produk yang belum muncul dalam urutan.
Sean
sumber
1

JavaScript (ES6), 119 118 117 byte

Fungsi rekursif yang mengambil indeks berbasis 0.

f=(n,a=[2,m=3])=>a[n]||a.map(c=>a.map(d=>c<d&(d*=c)>m?b[d]=b[d]/0||d:0),b=[])|f(n,a.push(m=b.sort((a,b)=>a-b)[0])&&a)

Bagaimana?

Pada setiap iterasi dari f () , kita menggunakan istilah terakhir m dari urutan dan array awalnya kosong b untuk mengidentifikasi istilah berikutnya. Untuk setiap produk d> m dari dua nomor MU yang berbeda sebelumnya, kami melakukan:

b[d] = b[d] / 0 || d

dan kemudian menjaga nilai minimum b .

Ungkapan di atas dievaluasi sebagai berikut:

b[d]               | b[d] / 0  | b[d] / 0 || d
-------------------+-----------+--------------
undefined          | NaN       | d
already equal to d | +Infinity | +Infinity
+Infinity          | +Infinity | +Infinity

Ini menjamin bahwa produk yang dapat diekspresikan dalam lebih dari satu cara tidak akan pernah dipilih.

Diformat dan dikomentari

f = (n, a = [2, m = 3]) =>           // given: n = input, a[] = MU array, m = last term
  a[n] ||                            // if a[n] is defined, return it
  a.map(c =>                         // else for each value c in a[]:
    a.map(d =>                       //   and for each value d in a[]:
      c < d &                        //     if c is less than d and
      (d *= c) > m ?                 //     d = d * c is greater than m:
        b[d] = b[d] / 0 || d         //       b[d] = either d or +Infinity (see 'How?')
      :                              //     else:
        0                            //       do nothing
    ),                               //   end of inner map()
    b = []                           //   initialization of b[]
  ) |                                // end of outer map()
  f(                                 // do a recursive call:
    n,                               //   - with n
    a.push(                          //   - push in a[]:
      m = b.sort((a, b) => a - b)[0] //     m = minimum value of b[]
    ) && a                           //     and use a[] as the 2nd parameter
  )                                  // end of recursive call

Demo

Arnauld
sumber
0

Haskell , 117 115 113 byte

n x=[a*b|[a,b]<-mapM id[1:x,x]]
d x=minimum[a|a<-n x,2==sum[1|b<-n x,b==a]]:x
l x|x<3=x+1:[2]|1>0=d$l$x-1
(!!0).l

Cobalah online!

Wisaya Gandum
sumber
Baris pertama dapat ditulis sebagai idiom yang berguna untuk produk operator cartesian:n x=(*)<$>x<*>1:x
xnor
0

Python 3 2 , 167 139 136 133 123 121 120 118 byte

a=[2,3];exec'p=[x*y for x in a for y in a if x-y];a+=min(q for q in p if p.count(q)+(q in a)<3),;'*input();print a[-2]

Cobalah online!


Terima kasih kepada @ Mr.Xcoder dan @LeakyNun untuk peningkatan!

Chase Vogeli
sumber
159 byte , hanya dengan menghapus spasi dan tanda kurung yang tidak perlu.
Tn. Xcoder
@ Mr.Xcoder Terima kasih atas perbaikannya. Saya tidak yakin perubahan p.count(q)==1menjadi p.count(q)>0valid, karena kode itulah yang memastikan kondisi tantangan "persis satu arah".
Chase Vogeli
p.count(q)-~(q in a)<=3setara denganp.count(q)+(q in a)<3
Leaky Nun
@ LeakyNun terima kasih!
Chase Vogeli