Найменше спільне множина


31

Найменше спільне кратне набору позитивних цілих чисел Aє найменшим цілим числом Postive Bтаким чином, що, для кожного kв Aіснує позитивне ціле число , nтаке , що k*n = B.

Враховуючи щонайменше два натуральних числа, виведіть їх найменше спільне кратне число.

Правила

  • Вбудовані дозволені, але якщо ваше рішення використовує таке, вам рекомендується включити альтернативне рішення, яке не використовує вбудовані GCD / LCM. Однак альтернативне рішення взагалі не зараховуватиметься до вашої оцінки, тому це абсолютно необов’язково.
  • Усі входи та виходи знаходяться в межах діапазону для вашої мови. Якщо ваша мова споконвічно здатна до довільно великих цілих чисел, то ваше рішення повинно працювати з довільно великими входами та виходами.

Тестові справи

[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

6
Тому що це досить часто помилкова думка: формула LCM (a, b) = ab / GCD (a, b) не поширюється на більш ніж два числа (або, з цього приводу, на одне число!).
Грег Мартін

Відповіді:


4

Власне, 12 1 байт

Пропозиції з гольфу все ще вітаються, хоча я не впевнений, як покращити сирий вбудований LCM. Спробуйте в Інтернеті!

12-байтна версія без вбудованої. Пропозиції з гольфу вітаються. Спробуйте в Інтернеті!

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

Ви розумієте, що вам дозволяється використовувати вбудований, правда?
Мего

1
@Mego Я додам це, але моє розуміння було, що вбудовані не відсторонюються, тому я спочатку не використовував його.
Шерлок9

1
Вбудовані дозволені. Вони взагалі не відлякують - я просто хотів заохотити невбудовані рішення також включати, оскільки вони часто набагато цікавіші, ніж вбудовані.
Мего

1
Я прочитав це, як насправді, 1 байт .
програміст5000

2
@ programmer5000 Я думаю, що це може бути причиною того, що мова називається насправді ...
Socrat Phoenix

17

JavaScript (ES6), 36 байт

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

Починаючи з 1цього першого числа, яке можна розділити всіма.


Звичайно ... Я думав про те, щоб зробити цикл за допомогою цієї методики, але рекурсія набагато коротша.
ETHproductions

1
Це геніально ... Якщо я пригадую, someповертає істину, якщо хоча б один елемент масиву задовольняє умову, правда?
WallyWest


11

Желе , 3 байти

æl/

Зменшує за LCM. Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Альтернативна версія, 6 байт

ÆE»/ÆẸ

Спробуйте в Інтернеті! або перевірити всі тестові випадки .

Як це працює

ÆE»/ÆẸ  Main link. Argument: A (array)

ÆE      Yield all prime exponents of each integer in A.
  »/    Reduce columns (exponents that correspond to the same prime) by maximum.
    ÆẸ  Turn the resulting array of prime exponents into the corresponding integer.

8

Python, 69 65 52 50 байт

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

2 байти збережено завдяки Деннісу!

Досить просте рекурсивне рішення, для деяких тестових випадків потрібно буде обмежити рекурсію трохи вище.


1
anyбере генератор; дужки вам не потрібні.
Денніс

3
A=lambda l,i=1:all(i%a<1for a in l)or-~A(l,i+1)економить ще кілька байт.
Денніс

8

MATL , 7 байт

&YFX>^p

Ніякого вбудованого.

Спробуйте в Інтернеті!

Пояснення

Візьмемо [8, 2, 1, 10]приклад як приклад.

&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

EDIT (9 червня 2017 р.): YFУ випуску 20.1.0 було змінено два виходи : нефакторні праймери та їх (нульові) показники пропускаються. Це не впливає на наведений вище код, який працює, не вимагаючи змін.


6

Джулія (3 байти) [Робота над невбудованим]

lcm     # Using LCM built-in (3 Bytes)

Як зазначив Денніс, я постійно забуваю, що Джулія автоматично векторизує дані.

Приклад:

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

6

PowerShell v2 +, 73 60 байт

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

Бере введення $a, петлі вгору з $i=1допомогою $i++, на основі умовного. Умова ($a|?{!($i%$_)}).countбути -nВЗ eякост до $a.count. Значить, петля закінчується, коли елементи, $aщо є дільниками $i, дорівнюють елементам $a. Потім $iна конвеєрі залишається солітар, і вихід неявний.

Випробування

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

Математика, 3 байти

LCM

Використання:

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

Out[1]= 2520

6
День, коли Mathematica відповідав Jelly, - це день, який я ніколи не думав побачити.
Стівен Х.

3

Чеддар, 33 байти

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

Нічого супер нового.

Безумовно

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

В основному це починається з одного і продовжує збільшуватися, поки не знайде LCM


3

JavaScript (ES6), 63 59 байт

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

Рекурсивно знаходить LCM двох останніх елементів.


Це моє рішення було б:a=>a.reduce((l,n)=>l*n/(g=(m,n)=>n?g(n,m%n):m)(l,n))
Ніл

@Neil Ви можете розмістити це, якщо хочете. Я сумніваюсь, що моя техніка може
настільки


3

JavaScript (ES6), 52 байти

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

Я reduceвідповів би на цю відповідь настільки, наскільки міг, але я, очевидно, нікуди не дістанусь поблизу простоти відповіді @ Хеді.


3

Java 8, 75 59 121 89 байт

Використовується евклідовий алгоритм і той факт, що LCM (A, B) = A * B / GCD (A, B)

  • 16 байт вимкнено Завдяки @carusocomputing
  • Додано багато вхідних даних + 62 байти
  • Вимкнено 32 байти Завдяки @Olivier Grégoire

Код:

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

Видалити розриви рядків:

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

Технічно фрагмент, але якщо ви додасте, n->{...}я вважаю, що він стає дійсним Java 8.
Magic Octopus Urn

Спасибі. Я намагаюся звикнути бачити лямбда на Яві. За допомогою лямбда ви, мабуть, зможете пограти в гольф на частину петлі. Але я не знаю як.
Роман Ґраф

Так, все це - думка в Яві; вам, ймовірно, буде краще вивчити це на Python :).
Чарівна урва восьминога

Якщо я щось не пропускаю, це не підтримує більше двох входів
pinkfloydx33

Якщо обчислювати НСД, ви можете грати в гольф набагато більше: int g(int a,int b){return b<1?a:g(b,a%b);}. LCM може потім стати int l(int[]a){int l=1;for(int n:a)l=l*n/g(l,n);return l;}загальною кількістю 99 байт.
Олів'є Грегоар




2

J, 11 байт

>./&.(_&q:)

Існує рішення на 3 байти за допомогою вбудованого LCM.

*./

Пояснення

>./&.(_&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 байт

1 байт збережено завдяки Мартіну Ендеру.

Збільшується, поки не буде знайдено LCM.

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

Спробуйте в Інтернеті


1
Я не зовсім знайомий із CJam, але правило повторного використання - це функції, а не повноцінні програми. Якщо ваше 17-байтне рішення - це повноцінна програма, яка послідовно працює на різних пробігах, це добре.
Mego

2

Ракетка 13 байт

lcm - це вбудована функція в Racket:

(apply lcm l)

Тестування:

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

Вихід:

14
8
24
40
90
35
1144
3080
420
1260
2520

А-а-а. Як можна використовувати цей синтаксис. Я завжди здавався, коли намагався вивчити Ракетку.
Роман Ґраф

1
Перше слово в дужках - це назва процедури, решта - це його аргументи. Якщо аргумент є процедурою, він повинен бути у власних дужках. Значення (непроцедури) записуються без дужок. Я вважаю це чудовою мовою загального призначення з додатковою перевагою наголосом на функціональному програмуванні. Будучи похідним від Lisp, також виникає відчуття охоплення цієї області програмування.
rnso

Я вважаю, що кодування ключових слів і мови в Racket & Scheme бути простішими, ніж у Lisp.
rnso

Так, але я сказав, що я розумію Лісп? Мені більше подобаються такі мови, як Jelly або Java.
Роман Ґраф

1
Основна різниця синтаксису між Java та Racket - f (a, b) vs (fab), x + y + z vs (+ xyz), x == y vs (eq? Xy) та x = 2 vs (визначте x 2) або якщо вже визначено, (встановити! x 2). Також не потрібно оголошувати такі типи, як public static void або int char string тощо. Сподіваюся, що вас знову зацікавить Ракетка.
rnso

2

R, 36 байт (не вбудовано)

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

Бере вхід. Потім тестує кожне додатне ціле число, взявши мод.


Я вважаю, що вам потрібно catприблизно ваш останнійi
Джузеппе

@Giuseppe, коли я запускаю його, значення друкує нормально.
користувач5957401

дивіться обговорення тут , але я вважаю, ec=Tце добре для +4, а не +5 для cat().
Джузеппе

1
незважаючи на те, що деякі v=scan();while(any((F=F+1)%%v)){};Fз них можна переграти cat()або ec=Tскласти відповідно 40 або 39 байт. І +1, дуже приємний підхід.
Джузеппе


1

Haskell, 10 байт

foldr1 lcm

Приклад використання: foldl1 lcm [5,2,9,10,3,4,4,4,7]-> 1260.


1

C #, 50 + 18 = 68 байт

50 байт для визначення методу, +18 байт для імпорту LINQ.

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

Приблизно так само, як і багато інших відповідей. Підраховує рекурсивно, поки не знайде LCM. Я трохи здивований, що це не отримало StackOverflowException, тому у мене також є нерекурсивна версія, яка насправді на 1 байт довше.

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

Безголовки:

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

Піп , 10 байт

W$+o%g++oo

Використовується стратегія "пробувати кожне число, поки не працює". Спробуйте в Інтернеті!

            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 байти

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

прямо вперед:
петля $fвід 1 вгору; якщо $f*$aрозділиться $bбез залишку, знайдеться LCM.


Я повністю перечитав at least... ось код для будь-якої кількості параметрів:

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

Цикл $fвід 1 вгору, поки внутрішній цикл не працює до $ argc.
Петля $iвід 2на $argc-1час $f*$argv[1]розділяється $argv[$i]без залишку.
обидві петлі розірвані: друк $f*$argument 1.




1

Brachylog v2, 8 байт

{×↙Xℕ₁}ᵛ

Спробуйте в Інтернеті!

Смішно, як безпосередньо це підходить до визначення, даного в виклику.

{     }ᵛ    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.

Підозріло повільне, але значно коротше рішення:

Brachylog v2, 5 байт

f⊇p~d

Спробуйте в Інтернеті!

Приймає вхід через вихідну змінну і дає вихід через вхідну змінну. Пробивається прямо через перші чотири тестові справи, але я все ще чекаю на п'ятий ... Зазвичай я все-таки став би своїм основним рішенням і просто вірю, що він працює правильно, але не знаю, чому він не підтвердив, що 90 - це LCM, 9, 6, 2, 1, 5коли я дав це 90 двадцять хвилин тому.

(Редагувати: відповідь підтверджено не більше ніж через 16 годин, і створила її поряд із МКМ 5, 5, 7, 1, 1приблизно через два дні.)

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

І ще один зовсім інший присудок, який випадково більш-менш перекладає рішення Bratalog v1 Fatalize:

Brachylog v2, 10 байт

;.gᵗ↔z%ᵛ0<

Спробуйте в Інтернеті!

Це було врятовано рішенням, яке я зробив для цього виклику до того, як я зрозумів, що результат не обмежується цілим числом.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.