MU numaralarını hesaplama


19

İlk iki MU numarası 2 ve 3'tür. Diğer tüm MU sayıları, daha önce iki farklı MU numarasının ürünü olarak tek bir şekilde ifade edilebilen henüz görüntülenmemiş en küçük sayıdır.

İşte ilk 10

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

Görev

Pozitif sayı hesapla ve çıkış Verilen n MU-numarası inci.

Bu bir yarışmasıdır, bu nedenle kaynak kodunuzu mümkün olduğunca küçük yapmayı hedeflemelisiniz.

OEIS A007335


1
0-indeksleme veya 1-indeksleme?
HyperNeutrino

1
@HyperNeutrino İkisi de iyi.
Buğday Büyücüsü

2
Bunlara neden MU numaraları denir? (Vahşi tahmin: Benzersiz Çarpma?)

Yanıtlar:


5

Pyth, 22 21 bayt

@u+Gfq2l@GcLTGheGQhB2

Çevrimiçi deneyin. Test odası.

0 endeksli.

açıklama

@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.

@Son satırında işareti hizalanma-. 2 karakterlik bir değişiklik olduğu için önerilen bir düzenleme yapamıyorum.
user2357112 Monica

@ user2357112 Düzeltildi.
PurkkaKoodari

4

Haskell, 80 77 bayt

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..])!!)

Çevrimiçi deneyin!

Nasıl çalışır

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              

3

Jöle , 22 bayt

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

Tek dizinli, 1 dizinli.

Çevrimiçi deneyin!

Nasıl?

Œ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

3

R , 127 118 111 108 105 100 98 90 bayt

Giuseppe sayesinde 8 bayt.

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]

Çevrimiçi deneyin!


Bunun <önceliğe göre daha düşük önceliğe sahip olduğunu farketmek beni sonsuza dek aldı , +bu yüzden +g%in%r<3halkanın ne yaptığını anlayamadım ve bunu yaparken önereceğim iki parçayı golfe attın ... +1
Giuseppe

@Giuseppe Bugün R öğrenmeye başladım ... İyi bir R golfçü ile tanışmak güzel.
Leaky Nun

Ben de sana aynısını söyleyecektim .............
Giuseppe

Ah, bir şey daha n=scan(), stdin'den okumak için bir işlev tanımı yerine kullanabilirsiniz ; seni 100 altına
Giuseppe

Giriş başarısız:0
Rift

2

CJam (32 bayt)

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

0 endeksleme ile çevrimiçi demo .

Bir istisna dışında spec önemsiz bir çeviri ötesinde yapılacak çok şey olduğundan emin değilim: [0 1 2 3](yerine [2, 3]) bir liste ile başlayarak hemen bir bayt hemen başlatarak kaydedebilirsiniz 0=|(sadece ekleyerek yeni eleman sıklık olduğu için 1ve) zaten listede, fakat her herhangi sahte unsurları tanıtmak yok xlistede 0*xve 1*xlistede zaten.



1

Mathematica, 154 bayt

oeis linkinde bulunan kodun basit bir şekilde değiştirilmesi

(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[[#]])&

1

PHP , 130 bayt

0 endeksli

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

Çevrimiçi deneyin!

Expanded

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 bayt

0 endeksli

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

Çevrimiçi deneyin!

PHP , 161 bayt

0 endeksli

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

Çevrimiçi deneyin!


1

Mathematica, 140 bayt

(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[[#]])&

1

MATL , 25 bayt

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

Çevrimiçi deneyin!

açıklama

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

1

Perl 6 , 96 bayt

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

Çevrimiçi deneyin!

  • 2, 3, { ... } ... *üçüncüyle başlayan her elemanın küme ayracı ile sınırlandırılmış kod bloğu tarafından hesaplandığı sonsuz bir dizidir. Kod bloğu bağımsız değişkenlerini slurpy @_dizisi üzerinden aldığından, o dizideki tüm geçerli diziyi alır.
  • @_.combinations(2) tüm 2 element kombinasyonlarının bir dizisidir @_ .
  • .classify({ [*] $_ }) her 2 parçayı ürününe göre sınıflandırır, ürünlerin anahtarlar ve değerlerin bu ürünü içeren 2 parçanın listesi olduğu bir karma üretir.
  • .grep(*.value == 1) değerin (yani, o anahtarı ürün olarak içeren çiftlerin listesi) 1 boyutuna sahip olduğu karma değer çiftlerini seçer.
  • ».keyyalnızca her bir çiftin tuşlarını seçer. Bu, mevcut sekansın sadece bir faktör kombinasyonundan kaynaklanan ürünlerin listesidir.
  • .sort ürünleri sayısal olarak sıralar.
  • first * ∉ @_, ... dizide daha önce görünmeyen ürünlerin ilkini bulur.

1

JavaScript (ES6), 119 118 117 bayt

0 tabanlı bir dizin alan özyinelemeli işlev.

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)

Nasıl?

Her f () yinelemesinde, bir sonraki terimi tanımlamak için dizinin son m terimini ve başlangıçta boş bir dizi b'yi kullanırız. Daha önceki iki farklı MU sayısının d> m'si için şunları yaparız:

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

ve sonra minimum b değerini .

Yukarıdaki ifade aşağıdaki gibi değerlendirilir:

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

Bu, birden fazla şekilde ifade edilebilen ürünlerin asla seçilmeyeceğini garanti eder.

Biçimlendirilmiş ve yorumlanmış

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

gösteri


0

Haskell , 117 115 113 bayt

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

Çevrimiçi deneyin!


İlk satır operatör kartezyen ürünü için yararlı bir deyim olarak yazılabilir:n x=(*)<$>x<*>1:x
xnor

0

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

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]

Çevrimiçi deneyin!


@ Mr.Xcoder ve @LeakyNun'a iyileştirmeler için teşekkürler!


159 bayt , sadece gereksiz boşlukları ve braketleri kaldırarak.
Bay Xcoder

@ Mr.Xcoder Geliştirmeler için teşekkürler. Emin değiştirmiyorum p.count(q)==1için p.count(q)>0bu meydan okuma "tam olarak bir şekilde" koşulunu sağlayan kod, çünkü geçerlidir.
Chase Vogeli

p.count(q)-~(q in a)<=3ile eşdeğerp.count(q)+(q in a)<3
Leaky Nun

@LeakyNun teşekkürler!
Chase Vogeli
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.