Calcular os números MU


19

Os dois primeiros números de MU são 2 e 3. Todos os outros números de MU são o menor número ainda não exibido que pode ser expresso como o produto de dois números de MU distintos anteriores, exatamente de uma maneira.

Aqui estão os 10 primeiros

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

Tarefa

Dado um número positivo e calcule saída do n th MU-número.

Como é uma competição de , você deve tentar tornar seu código-fonte o menor possível.

OEIS A007335


11
Indexação 0 ou indexação 1?
21417 HyperNeutrino

11
@HyperNeutrino Ou está tudo bem.
Assistente de trigo

2
Alguma idéia de por que eles são chamados de números MU? (Adivinhação: Multiplicação Exclusiva?)

Respostas:


5

Pitão, 22 21 bytes

@u+Gfq2l@GcLTGheGQhB2

Experimente online. Suíte de teste.

Indexado a 0.

Explicação

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

O @sinal na última linha está desalinhado. Não consigo fazer uma edição sugerida, pois é uma alteração de dois caracteres.
User2357112 suporta Monica

@ user2357112 Corrigido.
PurkkaKoodari

4

Haskell, 80 77 bytes

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

Experimente online!

Como funciona

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

Geléia , 22 bytes

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

Um link monádico, indexado em 1.

Experimente online!

Quão?

Œ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 bytes

8 bytes graças a 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]

Experimente online!


Levei uma eternidade para perceber que a <precedência era menor do que +eu não conseguia descobrir o que diabos +g%in%r<3estava fazendo, e enquanto fazia isso, você jogou as duas partes que eu ia sugerir ... +1
Giuseppe

@ Giuseppe Acabei de começar a aprender R hoje ... prazer em conhecer um jogador de golfe decente em R.
Leaky Nun

Eu ia dizer o mesmo para você .............
Giuseppe

Ah, mais uma coisa, você pode usar em n=scan()vez de uma definição de função para ler a partir de stdin; isso vai te deixar abaixo dos 100
Giuseppe

Falha na entrada:0
Rift

2

CJam (32 bytes)

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

Demonstração online com indexação 0.

Não tenho certeza de que há muito a ser feito além de uma tradução trivial das especificações, com uma exceção: iniciando com uma lista de [0 1 2 3](em vez de [2, 3]), economizo um byte imediatamente na inicialização e outros dois ao poder fazer 0=|(adicionando apenas o novo elemento porque sua frequência está 1e já está na lista), mas não apresente nenhum elemento falso, pois para todos os itens xda lista 0*xe 1*xjá estão na lista.



1

Mathematica, 154 bytes

modificação simples do código encontrado no link 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[[#]])&

1

PHP , 130 bytes

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

Experimente online!

Expandido

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 bytes

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

Experimente online!

PHP , 161 bytes

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

Experimente online!


1

Mathematica, 140 bytes

(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 bytes

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

Experimente online!

Explicação

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 bytes

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

Experimente online!

  • 2, 3, { ... } ... *é uma sequência infinita em que cada elemento que começa com o terceiro é calculado pelo bloco de código delimitado por colchetes. Como o bloco de código recebe seus argumentos por meio da @_matriz slurpy , ele recebe toda a sequência atual nessa matriz.
  • @_.combinations(2) é uma sequência de todas as combinações de 2 elementos de @_ .
  • .classify({ [*] $_ }) classifica cada tupla 2 por seu produto, produzindo um hash em que os produtos são as chaves e os valores são a lista de 2 tuplas que possuem esse produto.
  • .grep(*.value == 1) seleciona esses pares de valores-chave no hash em que o valor (ou seja, a lista de pares que possuem essa chave como produto) tem um tamanho de 1.
  • ».keyseleciona apenas as teclas de cada par. Esta é a lista de produtos que surgem de apenas uma combinação de fatores da sequência atual.
  • .sort classifica os produtos numericamente.
  • first * ∉ @_, ... encontra o primeiro desses produtos que ainda não apareceu na sequência.

1

JavaScript (ES6), 119 118 117 bytes

Uma função recursiva que recebe um índice baseado em 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)

Quão?

A cada iteração de f () , usamos o último termo m da sequência e uma matriz inicialmente vazia b para identificar o próximo termo. Para cada produto d> m de dois números MU distintos anteriores, fazemos:

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

e mantenha o valor mínimo de b .

A expressão acima é avaliada da seguinte maneira:

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

Isso garante que os produtos que podem ser expressos de mais de uma maneira nunca sejam selecionados.

Formatado e comentado

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


0

Haskell , 117 115 113 bytes

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

Experimente online!


A primeira linha pode ser escrito como uma expressão útil para o operador do produto cartesiano:n x=(*)<$>x<*>1:x
xnor

0

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

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]

Experimente online!


Obrigado a @ Mr.Xcoder e @LeakyNun pelas melhorias!


159 bytes , apenas removendo espaços e colchetes desnecessários.
Mr. Xcoder

@ Mr.Xcoder Obrigado pelas melhorias. Não tenho certeza de que mudar p.count(q)==1para p.count(q)>0é válido, porque esse é o código que garante a condição "de uma maneira exata" do desafio.
Perseguição Vogeli

p.count(q)-~(q in a)<=3é equivalente ap.count(q)+(q in a)<3
gotejante Nun

@LeakyNun thanks!
Chase Vogeli
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.