Calcule los números MU

19

Los primeros dos números MU son 2 y 3. Todos los demás números MU son el número más pequeño que aún no aparece y que se puede expresar como el producto de dos números MU distintos anteriores de una sola manera.

Aquí están los primeros 10

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

Tarea

Dado un número positivo, calcule y genere el enésimo número MU.

Esta es una competencia de , por lo que debe intentar hacer que su código fuente sea lo más pequeño posible.

OEIS A007335

Asistente de trigo
fuente
1
0-indexación o 1-indexación?
HyperNeutrino
1
@HyperNeutrino O bien está bien.
Wheat Wizard
2
¿Alguna idea de por qué se llaman números MU? (Conjetura salvaje: ¿Multiplicación única?)

Respuestas:

5

Pyth, 22 21 bytes

@u+Gfq2l@GcLTGheGQhB2

Pruébalo en línea. Banco de pruebas.

0 indexado.

Explicación

@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
fuente
El @letrero en la última línea está desalineado. No puedo hacer una edición sugerida, ya que es un cambio de 2 caracteres.
user2357112 es compatible con Monica
@ user2357112 Fijo.
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..])!!)

Pruébalo en línea!

Cómo 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              
nimi
fuente
3

Jalea , 22 bytes

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

Un enlace monádico, 1 indexado.

Pruébalo en línea!

¿Cómo?

Œ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
fuente
3

R , 127 118 111 108 105 100 98 90 bytes

8 bytes gracias 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]

Pruébalo en línea!

Monja permeable
fuente
Me llevó una eternidad darme cuenta de que <tiene una precedencia menor que +por lo que no pude entender qué demonios +g%in%r<3estaba haciendo, y mientras lo hacía, diste cuenta de las dos partes que iba a sugerir ... +1
Giuseppe
@Giuseppe Acabo de empezar a aprender R hoy ... es un placer conocer a un golfista decente de R.
Leaky Nun
Te iba a decir lo mismo .............
Giuseppe
Ah, una cosa más, puede usar en n=scan()lugar de una definición de función para leer desde stdin; eso te llevará por debajo de 100
Giuseppe
Fallos de entrada:0
Rift
2

CJam (32 bytes)

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

Demostración en línea con indexación 0.

No estoy seguro de que haya mucho por hacer más allá de una traducción trivial de la especificación con una excepción: al comenzar con una lista de [0 1 2 3](en lugar de [2, 3]) guardo un byte inmediatamente en la inicialización y otros dos al poder hacerlo 0=|(agregando solo el nuevo elemento porque su frecuencia está 1y ya está en la lista), pero no introduzca ningún elemento falso porque para todos xen la lista 0*xy 1*xya están en la lista.

Peter Taylor
fuente
2

Python 2 , 127 118 bytes

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]

Pruébalo en línea!

varilla
fuente
1

Mathematica, 154 bytes

modificación simple del código encontrado en el enlace 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
fuente
1

PHP , 130 bytes

0 indexado

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

Pruébalo en línea!

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

0 indexado

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

Pruébalo en línea!

PHP , 161 bytes

0 indexado

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

Pruébalo en línea!

Jörg Hülsermann
fuente
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[[#]])&
J42161217
fuente
1

MATL , 25 bytes

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

Pruébalo en línea!

Explicación

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
fuente
1

Perl 6 , 96 bytes

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

Pruébalo en línea!

  • 2, 3, { ... } ... *es una secuencia infinita donde cada elemento que comienza con el tercero se calcula mediante el bloque de código delimitado por llaves. Dado que el bloque de código toma sus argumentos a través de la @_matriz slurpy , recibe toda la secuencia actual en esa matriz.
  • @_.combinations(2)es una secuencia de todas las combinaciones de 2 elementos de @_.
  • .classify({ [*] $_ }) clasifica cada 2 tuplas por su producto, produciendo un hash donde los productos son las claves y los valores son la lista de 2 tuplas que tienen ese producto.
  • .grep(*.value == 1) selecciona esos pares clave-valor del hash donde el valor (es decir, la lista de pares que tiene esa clave como producto) tiene un tamaño de 1.
  • ».keyselecciona solo las claves de cada par. Esta es la lista de productos que surgen de una sola combinación de factores de la secuencia actual.
  • .sort ordena los productos numéricamente.
  • first * ∉ @_, ... encuentra el primero de esos productos que aún no ha aparecido en la secuencia.
Sean
fuente
1

JavaScript (ES6), 119 118 117 bytes

Una función recursiva que toma un índice basado en 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)

¿Cómo?

En cada iteración de f () , utilizamos el último término m de la secuencia y una matriz inicialmente vacía b para identificar el siguiente término. Para cada producto d> m de dos números MU distintos anteriores, hacemos:

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

y luego mantener el valor mínimo de b .

La expresión anterior se evalúa de la siguiente manera:

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

Esto garantiza que los productos que pueden expresarse en más de una forma nunca serán seleccionados.

Formateado y 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

Manifestación

Arnauld
fuente
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

Pruébalo en línea!

Asistente de trigo
fuente
La primera línea se puede escribir como un modismo útil para el producto cartesiano operador: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]

Pruébalo en línea!


¡Gracias a @ Mr.Xcoder y @LeakyNun por las mejoras!

Chase Vogeli
fuente
159 bytes , simplemente eliminando espacios y paréntesis innecesarios.
Sr. Xcoder
@ Mr.Xcoder Gracias por las mejoras. No estoy seguro de que cambiar p.count(q)==1a p.count(q)>0sea ​​válido, porque ese es el código que garantiza la condición "exactamente de una forma" del desafío.
Chase Vogeli
p.count(q)-~(q in a)<=3es equivalente ap.count(q)+(q in a)<3
Leaky Nun
@LeakyNun gracias!
Chase Vogeli