最小公倍数


31

正の整数のセットの最小公倍数はA最小の正の整数Bであり、各にkAnなどの正の整数が存在しk*n = Bます。

入力として少なくとも2つの正の整数を与え、それらの最小公倍数を出力します。

ルール

  • ビルトインは使用できますが、ソリューションで使用する場合は、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)は、2つを超える数(または、そのために1つの数まで)に拡張されませ
グレッグマーティン

回答:


4

実際には、12 1バイト

生のLCMビルトインを改善する方法がわかりませんが、ゴルフの提案は大歓迎です。オンラインでお試しください!

組み込みのない12バイトバージョン。ゴルフの提案を歓迎します。オンラインでお試しください!

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

アンゴルフ

          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私はそれを追加しますが、私の理解ではビルトインは落胆しているので、最初は使用しませんでした。
Sherlock9

1
組み込みが許可されます。それらはまったくがっかりしていません-組み込みよりもはるかに興味深いことが多いので、組み込みではないソリューションも含めることを推奨したかっただけです。
メゴ

1
私はそれを実際には1バイトと読みました。
Programmer5000

2
@ programmer5000私はそれが言語が実際に呼ばれる理由かもしれないと思う
ソクラテスフェニックス

17

JavaScript(ES6)、36バイト

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

1それから始めて、すべてで割ることができる最初の数字です。


もちろん...この手法でループを実行することを考えましたが、再帰ははるかに短くなります。
ETHproductions

1
これは天才です...思い出すとsome、配列内の少なくとも1つの要素が条件を満たしている場合、trueを返しますか?
-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

編集(2017年6月9日):リリース20.1.0YFで2つの出力が変更されました:非因子素数とそれらの(ゼロ)指数はスキップされます。これは上記のコードには影響しません。変更を加えることなく機能します。


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=1with からループ$i++します。条件がされ($a|?{!($i%$_)}).countている-nOT eにQUAL $a.count。要素と、ループ端部を意味する$aことがあるの除数$iISの要素に等しいです$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


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

基本的に、これは1から始まり、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

最後の2つの要素の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この回答をしましたが、明らかに@Hediの回答の単純さに近いところには行きません。


3

Javaの8、75の 59 121 89バイト

ユークリッドアルゴリズムとLCM(A、B)= A * B / GCD(A、B)という事実を使用します

  • 16バイトオフ。@carusocomputingに感謝
  • マルチ入力+ 62バイトを追加
  • 32バイトオフ。@OlivierGré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となっ信じる
マジックタコ壺

ありがとう。Javaでラムダを見ることに慣れようとしています。ラムダを使用すると、おそらくforループの一部をゴルフできます。しかし、私は方法がわかりません。
ローマングラフ

ええ、それらはすべてJavaの再考です。Pythonで学習した方が良いでしょう:)。
魔法のタコUr

何かが足りない場合を
除き

GCDを計算すると、もっとゴルフができますint g(int a,int b){return b<1?a:g(b,a%b);}。その後int l(int[]a){int l=1;for(int n:a)l=l*n/g(l,n);return l;}、LCMは、合計99バイトになる可能性があります。
オリビエグレゴワール




2

J、11バイト

>./&.(_&q:)

LCMビルトインを使用した3バイトのソリューションがあります

*./

説明

>./&.(_&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バイト

Martin Enderのおかげで1バイト節約されました。

LCMが見つかるまで増分します。

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

オンラインで試す


1
私はCJamに完全に精通しているわけではありませんが、再利用可能性のルールは完全なプログラムではなく、機能に関するものです。17バイトのソリューションが複数の実行にわたって一貫して機能する完全なプログラムである場合は、問題ありません。
メゴ

2

ラケット13バイト

lcmは、ラケットの組み込み関数です。

(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

ラケットとスキームでは、キーワードと言語のコーディングがLispより簡単であることがわかりました。
rnso

はい、でも私はLispを理解していると言ったのですか?私はJellyやJavaなどの言語が好きです。
ローマングラフ

1
JavaとRacketの主な構文の違いは、f(a、b)vs(fab)、x + y + z vs(+ xyz)、x == y vs(eq?xy)、x = 2 vs(define x 2)です、または既に定義されている場合(set!x 2)。また、public static voidやint char stringなどの型を宣言する必要もありません。再びRacketに興味を持つことを願っています。
rnso

2

R、36バイト(組み込みではない)

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

入力を受け取ります。次に、modを使用して各正の整数をテストします。


catあなたの最後の周りが必要だと思うi
ジュゼッペ

@Giuseppeを実行すると、値は正常に印刷されます。
user5957401

ここの説明を参照してください。ただしec=T、+5ではなく+4で問題ありませんcat()
ジュゼッペ

1
かかわらず、これはいくつかのダウンgolfedことができるv=scan();while(any((F=F+1)%%v)){};Fcat()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バイト、LINQインポートでは+18バイト。

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

「1つが機能するまですべての番号を試す」戦略を使用します。オンラインでお試しください!

            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;

まっすぐ進む:1から上に
ループ$fします。余りなく$f*$a分割される場合$b、LCMが見つかります。


私は完全にat least上書きしました...ここに任意の数のパラメーターのコードがあります

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

ループは$f1から上方内側のループは、$ argcのに実行されていないながら。
ループ$iから2$argc-1一方の$f*$argv[1]分割を介して$argv[$i]残り無し。
両方のループが壊れて:印刷を$f*$argument 1



1

Python 3、83バイト

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

PPCGへようこそ!
ライコニ

オンラインで試すなどのオンラインテストサイトへのリンクを含めることもできます。そのため、他の人があなたの答えを簡単に確認できます。
ライコニ

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

オンラインでお試しください!

出力変数を介して入力を受け取り、入力変数を介して出力を提供します。最初の4つのテストケースをリッピングしますが、私はまだ5番目のテストケースを待機しています... 90 9, 6, 2, 1, 5与えたときのLCMが90であることを確認しました分が20分前。

(編集:16時間以内に回答を確認し、5, 5, 7, 1, 1約2日後のLCMと一緒に生成しました。)

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

また、FatalizeのBrachylog v1ソリューションを誤って多かれ少なかれ翻訳する、まったく別の述語:

Brachylog v2、10バイト

;.gᵗ↔z%ᵛ0<

オンラインでお試しください!

This was salvaged from a solution I'd made for this challenge before I realized the output wasn't restricted to being an integer.

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.