Minimo común multiplo


31

El mínimo común múltiplo de un conjunto de números enteros positivos Aes el entero más pequeño postive Btal que, para cada uno ken A, existe un número entero positivo ntal que k*n = B.

Dado al menos dos enteros positivos como entrada, genera su mínimo común múltiplo.

Reglas

  • Se permiten las soluciones integradas, pero si su solución usa una, se le recomienda que incluya una solución alternativa que no use las soluciones integrales GCD / LCM. Sin embargo, la solución alternativa no contará para su puntaje, por lo que es completamente opcional.
  • Todas las entradas y salidas estarán dentro del rango representable de forma nativa para su idioma. Si su idioma es capaz de forma nativa de enteros arbitrariamente grandes, entonces su solución debe funcionar con entradas y salidas arbitrariamente grandes.

Casos de prueba

[7, 2] -> 14
[8, 1] -> 8
[6, 4, 8] -> 24
[8, 2, 1, 10] -> 40
[9, 6, 2, 1, 5] -> 90
[5, 5, 7, 1, 1] -> 35
[4, 13, 8, 8, 11, 1] -> 1144
[7, 2, 2, 11, 11, 8, 5] -> 3080
[1, 6, 10, 3, 4, 10, 7] -> 420
[5, 2, 9, 10, 3, 4, 4, 4, 7] -> 1260
[9, 7, 10, 9, 7, 8, 5, 10, 1] -> 2520

66
Debido a que es una idea errónea razonablemente frecuente: la fórmula LCM (a, b) = ab / GCD (a, b) no se extiende a más de dos números (o, para el caso, ¡a un número!).
Greg Martin

Respuestas:


4

En realidad, 12 1 byte

Las sugerencias de golf siguen siendo bienvenidas, aunque no estoy seguro de cómo mejorar el LCM sin procesar incorporado. Pruébalo en línea!

Una versión de 12 bytes sin el incorporado. Sugerencias de golf bienvenidas. Pruébalo en línea!

╗2`╜@♀%ΣY`╓N

Ungolfing

          Implicit input array.
╗         Save array in register 0.
2`...`╓   Starting with f(0), find the first (two) x where f(x) returns a truthy value.
          These two values will be 0 and our LCM.
  ╜         Push array from register 0.
  @         Swap the top two values. Stack: x, array
  ♀%        Map % over x and array, returning (x % item) for each item in array.
  ΣY        If the sum of all the modulos equals 0, x is either 0 or our LCM.

N         Push the last (second) value of our results. This is our LCM.
          Implicit return.

Te das cuenta de que puedes usar el builtin, ¿verdad?
Mego

1
@Mego Lo agregaré, pero entendí que se desaconsejaban las construcciones, por lo que no lo usé al principio.
Sherlock9

1
Las construcciones están permitidas. No se desaniman en absoluto: simplemente quería alentar a que también se incluyan soluciones que no están integradas porque a menudo son mucho más interesantes que las integradas.
Mego

1
Lo leí como en realidad, 1 byte .
programmer5000

2
@ programmer5000 Creo que es por eso que el lenguaje se llama en realidad ...
Socratic Phoenix

17

JavaScript (ES6), 36 bytes

f=(a,i=1)=>a.some(v=>i%v)?f(a,i+1):i

A partir de 1este es el primer número que se puede dividir por todos.


Por supuesto ... pensé en hacer un ciclo con esta técnica, pero la recursión es mucho más corta.
ETHproductions

1
Esto es genial ... Si recuerdo, somedevuelve verdadero si al menos un elemento de la matriz cumple la condición, ¿verdad?
WallyWest



8

Python, 69 65 52 50 bytes

A=lambda l,i=1:any(i%a for a in l)and A(l,i+1)or i

¡2 bytes guardados gracias a Dennis!

Solución recursiva bastante sencilla, deberá hacer que el límite de recurrencia sea un poco más alto para que funcionen algunos de los casos de prueba.


1
anytoma un generador; No necesitas los soportes.
Dennis

3
A=lambda l,i=1:all(i%a<1for a in l)or-~A(l,i+1)Guarda algunos bytes más.
Dennis

8

MATL , 7 bytes

&YFX>^p

No incorporado.

Pruébalo en línea!

Explicación

Tomemos la entrada [8, 2, 1, 10]como un ejemplo.

&YF    % Take array implicitly. Push vector of prime factors and matrix of exponents 
       % of factorization, where each row represents one of the input numbers
       %   STACK: [2 3 5], [3 0 0; 1 0 0; 0 0 0; 1 0 1]
X>     % Maximum of each column
       %   STACK: [2 3 5], [3 0 1]
^      % Element-wise power
       %   STACK: [8 1 5]
p      % Product of array
       %   STACK: 40
       % Implicitly display

EDITAR (9 de junio de 2017): YFcon dos salidas se ha modificado en la versión 20.1.0 : los primos sin factor y sus exponentes (cero) se omiten. Esto no afecta el código anterior, que funciona sin requerir ningún cambio.


6

Julia (3 Bytes) [Trabajando en no incorporado]

lcm     # Using LCM built-in (3 Bytes)

Como señaló Dennis, sigo olvidando que Julia vectoriza automáticamente las entradas.

Ejemplo:

println(lcm(1,2,3,4,5,6,7,8,9)) #Prints 2520

6

PowerShell v2 +, 73 60 bytes

param($a)for($i=1;($a|?{!($i%$_)}).count-ne$a.count){$i++}$i

Toma de entrada $a, bucles hacia arriba desde $i=1con $i++, basado en un condicional. La condición se ($a|?{!($i%$_)}).countsiendo -not equal a $a.count. Es decir, el ciclo termina cuando los elementos de $aque son divisores de $ies igual a los elementos de $a. Luego, $iqueda un solitario en la tubería, y la salida es implícita.

Casos de prueba

PS C:\Tools\Scripts\golfing> @(7,2),@(8,1),@(6,4,8),@(8,2,1,10),@(9,6,2,1,5),@(5,5,7,1,1),@(4,13,8,8,11,1)|%{($_-join',')+" -> "+(.\least-common-multiple.ps1 $_)}
7,2 -> 14
8,1 -> 8
6,4,8 -> 24
8,2,1,10 -> 40
9,6,2,1,5 -> 90
5,5,7,1,1 -> 35
4,13,8,8,11,1 -> 1144

PS C:\Tools\Scripts\golfing> @(7,2,2,11,11,8,5),@(1,6,10,3,4,10,7),@(5,2,9,10,3,4,4,4,7),@(9,7,10,9,7,8,5,10,1)|%{($_-join',')+" -> "+(.\least-common-multiple.ps1 $_)}
7,2,2,11,11,8,5 -> 3080
1,6,10,3,4,10,7 -> 420
5,2,9,10,3,4,4,4,7 -> 1260
9,7,10,9,7,8,5,10,1 -> 2520

4

Mathematica, 3 bytes

LCM

Uso:

In[1]:= LCM[9, 7, 10, 9, 7, 8, 5, 10, 1]                                        

Out[1]= 2520

66
El día en que Mathematica coincidió con Jelly es un día que nunca pensé que vería.
Steven H.

3

Cheddar, 33 bytes

(n,i=1)f->n.any(i&(%))?f(n,i+1):i

Nada super nuevo.

Sin golf

(n, i = 1) f ->
  n.any(j -> i % j) ?
    f(n, i + 1) :
    i

Básicamente, esto comienza en uno y continúa aumentando hasta que encuentra un LCM


3

JavaScript (ES6), 63 59 bytes

f=([x,...a])=>a[0]?x*f(a)/(g=(m,n)=>n?g(n,m%n):m)(x,f(a)):x

Encuentra recursivamente el MCM de los dos últimos elementos.


Esta es mi solución:a=>a.reduce((l,n)=>l*n/(g=(m,n)=>n?g(n,m%n):m)(l,n))
Neil

@Neil Puede publicar eso si lo desea. Dudo que mi técnica pueda ser tan corta ...
ETHproductions


3

JavaScript (ES6), 52 bytes

a=>a.reduce((l,n)=>l*n/(g=(m,n)=>n?g(n,m%n):m)(l,n))

I reduced esta respuesta tanto como pude, pero obviamente no voy a llegar a ninguna parte cerca de la simplicidad de la respuesta de Hedi @.


3

Java 8, 75 59 121 89 bytes

Utiliza el algoritmo euclidiano y el hecho de que LCM (A, B) = A * B / GCD (A, B)

  • 16 bytes de descuento. Gracias a @carusocomputing
  • Entrada múltiple agregada + 62 bytes
  • 32 bytes de descuento. Gracias a @Olivier Grégoire

Código:

public static int lcm(int l, int c){
  for(int i=1;i<=l&&i<=c;++i) 
    if (i%l==0&&i%c==0)
      return l*c/i;
}
public static int lcm(int...x){
  int y=x[0];
  for(int j:x){
    y=lcm(j,y);
  }
  return y;
}

Eliminar saltos de línea:

int g(int a,int b){return b<1?a:g(b,a%b);}

l->{int l=1;for(int n:a)l=l*n/g(l,n);return l;}

Técnicamente un fragmento, pero si se agrega n->{...}Creo que adquiera validez de Java 8.
Magia pulpo Urna

Gracias. Estoy tratando de acostumbrarme a ver lambda en Java. Con lambda, probablemente pueda jugar golf en algunos de los bucles for. Pero no se como.
Roman Gräf

Sí, todo eso es una ocurrencia tardía en Java; probablemente sea mejor aprenderlo en Python :).
Urna de pulpo mágico

A menos que me falte algo, esto no admite más de dos entradas
pinkfloydx33

Si calcula el MCD, se puede jugar golf mucho más: int g(int a,int b){return b<1?a:g(b,a%b);}. LCM puede convertirse int l(int[]a){int l=1;for(int n:a)l=l*n/g(l,n);return l;}en un total de 99 bytes.
Olivier Grégoire


2

Brachylog , 17 bytes

,.#>=g:?z:%a#=h0,

Pruébalo en línea!

Explicación

,.#>=               Output is a strictly positive integer
     g:?z           Zip the Output with the Input
         :%a        Compute Output mod I for each I in the Input
            #=h0,   All results must be equal to 0


2

J, 11 bytes

>./&.(_&q:)

Hay una solución para 3 bytes usando el LCM incorporado.

*./

Explicación

>./&.(_&q:)  Input: array of integers A
      _&q:   Get the prime exponents of each integer in A
>./&         Reduce by maximum on the lists
   &. _&q:   Convert the list of exponents back to an integer

*./  Input: array of integers A
  /  Reduce using
*.     LCM

2

CJam, 18 17 16 bytes

1 byte guardado gracias a Martin Ender.

Incrementando hasta encontrar el LCM.

q~0{)_2$f%:+}g\;

Pruébalo en línea


1
No estoy completamente familiarizado con CJam, pero la regla de reutilización es para funciones, no para programas completos. Si su solución de 17 bytes es un programa completo que funciona de manera consistente entre ejecuciones, está bien.
Mego

2

Raqueta 13 bytes

mcm es una función incorporada en Racket:

(apply lcm l)

Pruebas:

(define (f l)
   (apply lcm l))

(f (list 7 2)) 
(f (list 8 1)) 
(f (list 6 4 8)) 
(f (list 8 2 1 10)) 
(f (list 9 6 2 1 5))
(f (list 5 5 7 1 1)) 
(f (list 4 13 8 8 11 1))
(f (list 7 2 2 11 11 8 5))
(f (list 1 6 10 3 4 10 7))
(f (list 5 2 9 10 3 4 4 4 7)) 
(f (list 9 7 10 9 7 8 5 10 1))

Salida:

14
8
24
40
90
35
1144
3080
420
1260
2520

Ahh ¿Cómo puedes usar esa sintaxis? Siempre me rendía cuando intentaba aprender Racket.
Roman Gräf

1
La primera palabra entre paréntesis es un nombre de procedimiento, el resto son sus argumentos. Si un argumento es un procedimiento, debe estar entre paréntesis. Los valores (no procedimientos) se escriben sin corchetes. Considero que es un excelente lenguaje de propósito general con una ventaja adicional de estrés en la programación funcional. Siendo derivado de Lisp, uno también tiene la sensación de cubrir esa área de programación.
rnso

Encuentro que las palabras clave y el lenguaje de codificación son más fáciles en Racket & Scheme que Lisp.
rnso

Sí, pero ¿dije que entiendo a Lisp? Me gustan más los lenguajes como Jelly o Java.
Roman Gräf

1
La principal diferencia de sintaxis entre Java y Racket es f (a, b) vs (fab), x + y + z vs (+ xyz), x == y vs (eq? Xy) y x = 2 vs (define x 2) , o si ya está definido, (set! x 2). Tampoco es necesario declarar tipos como public static void o int char string, etc. Espero que vuelva a interesarle en Racket.
rnso

2

R, 36 bytes (no incorporado)

v=scan();i=1;while(any(i%%v))i=i+1;i

Toma la entrada. Luego prueba cada entero positivo tomando el mod.


Creo que necesitas una catúltima rondai
Giuseppe

@Giuseppe cuando lo ejecuto, el valor se imprime bien.
user5957401

vea la discusión aquí , pero supongo que ec=Testá bien para +4 en lugar de +5 para cat().
Giuseppe

1
De todos modos, esto se puede golfed abajo alguna v=scan();while(any((F=F+1)%%v)){};Fcon cat()o ec=Tpor lo que es 40 o 39 bytes, respectivamente. Y +1, muy buen enfoque.
Giuseppe


1

Haskell, 10 bytes

foldr1 lcm

Ejemplo de uso: foldl1 lcm [5,2,9,10,3,4,4,4,7]-> 1260.


1

C #, 50 + 18 = 68 bytes

50 bytes para la definición del método, +18 bytes para la importación LINQ.

using System.Linq;int L(int[]n,int i=1)=>n.All(x=>1>i%x)?i:L(n,i+1);

Más o menos lo mismo que muchas otras respuestas. Cuenta recursivamente hasta encontrar el LCM. Me sorprendió un poco que esto no obtuviera una StackOverflowException, por lo que también tengo una versión no recursiva que en realidad es solo 1 byte más.

using System.Linq;n=>{for(int i=1;;i++)if(n.All(x=>1>i%x))return i;};

Sin golf:

using System.Linq;            // Import LINQ
int L(int[] n, int i = 1) =>  // Function declaration
    n.All(x => 1 > i % x)     // Check if each x in n divides i
        ? i                   // And if so return i
        : L(n, i + 1)         // Otherwise increment i and recurse
;

1

Pip , 10 bytes

W$+o%g++oo

Utiliza la estrategia "prueba cada número hasta que uno funcione". Pruébalo en línea!

            o is preinitialized to 1, g is list of cmdline args
   o%g      Mod o by each arg
 $+         Sum (truthy if any nonzero, falsy if all zero)
W           Loop while that expression is truthy:
      ++o     Increment o
         o  Autoprint o

1

PHP, 42 74 bytes

for(;($p=++$f*$argv[1])%$argv[2];);echo$p;

directo:
bucle $fde 1 hacia arriba; si se $f*$adivide $bsin un resto, se encuentra el LCM.


Leí por completo el at least... aquí está el código para cualquier número de parámetros:

for(;$i<$argc;)for($p=$argv[$i=1]*++$f;++$i<$argc&$p%$argv[$i]<1;);echo$p;

Bucle $fde 1 hacia arriba, mientras que el bucle interno no se ha ejecutado a $ argc.
Bucle $idesde 2hasta $argc-1mientras se $f*$argv[1]divide $argv[$i]sin un resto.
ambos bucles rotos: impresión $f*$argument 1.



1

Python 3, 83 bytes

import math,functools as i
t=lambda t:i.reduce(lambda a,b:int(a*b/math.gcd(a,b)),t)

Bienvenido a PPCG!
Laikoni

Es posible que desee incluir un enlace a un sitio de prueba en línea como ¡ Pruébelo en línea! entonces es más fácil para otros verificar su respuesta.
Laikoni

1

Brachylog v2, 8 bytes

{×↙Xℕ₁}ᵛ

Pruébalo en línea!

Es curioso cuán directamente esto se asigna a la definición dada en el desafío.

{     }ᵛ    Each element of
            the input
 ×          multiplied by
  ↙X        some arbitrary and inconsistent integer
    ℕ₁      is a natural number,
       ᵛ    which is the same for each element,
            and is the output.

Una solución sospechosamente lenta pero significativamente más corta:

Brachylog v2, 5 bytes

f⊇p~d

Pruébalo en línea!

Toma entrada a través de la variable de salida y da salida a través de la variable de entrada. Desglosa los primeros cuatro casos de prueba, pero todavía estoy esperando el quinto ... Por lo general, todavía lo convertiría en mi solución principal y confío en que funcione correctamente, pero no sé por qué no lo ha hecho. confirmó que 90 es el MCM de 9, 6, 2, 1, 5cuando le di 90 hace veinte minutos.

(Editar: confirmó la respuesta después de no más de 16 horas y la generó junto con el LCM de 5, 5, 7, 1, 1aproximadamente dos días).

         The output variable
   ~d    with duplicates removed
  p      is a permutation of
 ⊇       a sublist of
f        the factors of
         the input variable.

Y otro predicado completamente diferente que accidentalmente traduce más o menos la solución Brachylog v1 de Fatalize:

Brachylog v2, 10 bytes

;.gᵗ↔z%ᵛ0<

Pruébalo en línea!

Esto se rescató de una solución que había hecho para este desafío antes de darme cuenta de que la salida no se limitaba a ser un número entero.

 .            The output
; gᵗ↔z        paired with each element of
              the input,
      %ᵛ      when the first element of each pair is taken mod the second, is always
        0     zero.
              Furthermore, the output
         <    is strictly greater than
        0     zero.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.