有理数のLCM


18

数字の組の最小公倍数(LCM)は、A最小の整数であるbそのようなb/a全ての整数の整数でありaにおけるA。この定義は有理数に拡張できます!

仕事

最小の正の検索合理的な bようb/aである整数のすべてのための有理数 aの入力では。

ルール

  • 標準的な抜け穴は禁止されています。
  • 入力では分子と分母を別々に使用できますが、double、floatなどは使用できません。
  • 入力が完全に削減されない場合があります。
  • 整数入力を分母の有理数としてとることができます1
  • 有理数をLCM / GCDビルトインに送信する送信は許可されますが、競合しません。

テストケース

In:  3
Out: 3

In:  1/17
Out: 1/17

In:  1/2, 3/4
Out: 3/2

In:  1/3, 2/8
Out: 1

In:  1/4, 3
Out: 3

In:  2/5, 3
Out: 6

In:  1/2, 3/4, 5/6, 7/8
Out: 105/2

これはであるため、最小限のバイトを使用した送信が勝ちです!


4
注:LCM[numerators]/GCD[denominators]入力に非縮小有理数が含まれる場合、計算が機能しない場合があります。例えば1/3, 2/8
ジョンファンミン

それで、私がそれを減らすならば、それは働きますか?
リーキー修道女

@LeakyNunはい、そうです。
ジョンファンミン

人々に非組み込みの回答を送信するよう促すために、私は質問を編集し、組み込みの回答を競合しないようにしました(まだ許可されています)。これが問題であれば、編集をロールバックします。
ジョンファンミン

整数のみで使用されるLCMビルトインはどうですか?
ジョナサンアラン

回答:



6

J、3バイト、非競合。

*./

合理的な入力のリストが与えられると、これはそれを通してLCMを折りたたみます。


4

sed、374(373 + 1)バイト

sedの-Eフラグは1バイトとしてカウントされます。注:私はまだこれをゴルフしようとしませんでした、そしておそらくかなり長い間そうしないでしょう。
入力は単項式になり、出力は単項式になります。スペースはすべての端数を囲む必要があります。例:echo " 1/111 111/11111 111111/111 "

:d;s, (1*)/\1(1*), \1/\22,;s,(1*)(1*)/\2 ,2\1/\2 ,;td;s,1*(1/22*),\1,g;s,(22*/1)1*,\1,g;:r;s,((1*)/1*)2,\1\2,;s,2(1*/(1*)),\2\1,;tr;h;s,1*/,,g;:g;s/^(1*) 1(1*) 1(1*)/1\1 \2 \3/;tg;s/  */ /g;s/^/ /;/1 1/bg;x;s,/1*,,g;s/^( 1*)( 1*)/\1\2\2/;:l;s/^(1*) (1*) \2(1*)/\1\2 \2 \3/;tl;/  $/be;/  /{s/^(1*) 1*  1*( 1*)/ \1\2\2/;bl};s/^(1* 1* )(1*) (1*)/\1\2\3 \3/;bl;:e;G;s, *\n *,/,

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



3

JavaScript(ES6)、85バイト

a=>a.reduce(([b,c],[d,e,g=(b,c)=>c?g(c,b%c):b,h=g(b*e,c*d),i=g(b*d,h)])=>[b*d/i,h/i])

ビルトインはありません!間違いなく、誰かが再帰的なアプローチなどを使用してこれを打ち負かすでしょう。



2

Perl 6の 46の  42バイト

{[lcm](@_».numerator)/[gcd] @_».denominator}

試して

{[lcm](($/=@_».nude)[*;0])/[gcd] $/[*;1]}

試して

入力は、有理数のリストです。

拡張:

{ # bare block lambda with implicit parameter list 「@_」

  [lcm](            # reduce using &infix:<lcm>
    (
      $/ = @_».nude # store in 「$/」 a list of the NUmerators and DEnominiators
                    # ((1,2), (3,4))

    )[
      *;            # from all of the first level 「*」,
      0             # but only the 0th of the second level (numerators)
    ]
  )
  /
  [gcd] $/[ *; 1 ]  # gcd of the denominators
}

2

網膜、117バイト

\d+
$*
\b(1+)(\1)*/(\1)+\b
$#2$*11/$#3$*
{`^((1+)\2*)/(1+)+ (\2)+/\3+\b
$1 $#4$*1/$3
}`\G1(?=1* (1+))|\G 1+
$1
1+
$.&

オンラインでお試しください!入力をスペースで区切られた一連の不適切な小数として受け取ります(整数または混合数値は使用しません)。説明:

\d+
$*

10進数を単項に変換します。

\b(1+)(\1)*/(\1)+\b
$#2$*11/$#3$*

これにより、各分数が最下位の用語に削減されます。キャプチャグループ1は分子と分母のGCDを表すため、の前後のキャプチャ数をカウントし/ます。\b(1+)+/(\1)+\b何らかの理由でキャプチャの数を正しくカウントしていないようですので、追加のキャプチャグループを使用して、結果に1を追加します。

{`^((1+)\2*)/(1+)+ (\2)+/\3+\b
$1 $#4$*1/$3

これは多くのことを行います。キャプチャグループ2は最初の2つの分数の分子のGCDを表し、キャプチャグループ3は分母のGCDを表します。$#4したがって、2番目の分子をGCDで除算します。(繰り返しますが、最初の分子のキャプチャの数はできませんでしたが、1つの分子をGCDで割るだけでよいので、それほどコストはかかりません。)

}`\G1(?=1* (1+))|\G 1+
$1

2番目の分子がGCDで除算されたので、単項算術チュートリアルのこの式を使用して2つを乗算し、LCMを作成します。その後、残りの分数について演習を繰り返します。

1+
$.&

単項を10進数に変換します。


2

Common Lisp、154バイト

(defun f(l &aux(s(pairlis l l)))(loop(and(eval`(=,@(mapcar'car s)))(return(caar s)))(let((x(assoc(reduce'min s :key'car)s)))(rplaca x(+(car x)(cdr x))))))

使用されるアルゴリズム(整数に対して指定されますが、有理数に対しても機能します)。

最初に入力データとそれ自体の関連リストを作成して、要素の初期値を追跡するため、操作シーケンスはリストの「車」によって与えられます。

(defun f(l &aux (s (pairlis l l)))        ; make the associative list
  (loop
     (when (eval `(= ,@(mapcar 'car s))) ; when the car are all equal
       (return (caar s)))                 ; exit with the first one
     (let ((x (assoc (reduce 'min s :key 'car) s))) ; find the (first) least element
       (rplaca x (+ (car x) (cdr x))))))  ; replace its car adding the original value (cdr)

テストケース:

CL-USER> (f '(3))
3
CL-USER> (f '(1/17))
1/17
CL-USER> (f '(1/2 3/4))
3/2
CL-USER> (f '(1/3 2/8))
1
CL-USER> (f '(1/4 3))
3
CL-USER> (f '(2/5 3))
6
CL-USER> (f '(1/2 3/4 5/6 7/8))
105/2

注:解決策は、整数を受け入れるbuild lcmおよびを使用しないことgcdです。


W00t?REPLでこれを試してください(/ (lcm 1 3 5 7) (gcd 2 4 6 8))
カズ

@Kazは、問題で述べたように、「LCM / GCDビルトインに有理数を入力する送信は許可されますが、競合しません」。
レンゾ・

Lispの用語では、厳密に言えば、(lcm 1 3 5 7)整数は有理数のサブタイプであるため、実際にを呼び出すときに有理数を供給していますが、合理的な入力を許可するa lcmまたは gcd
カズ

@カズ、操作...私はルールを誤解しました!投稿を削除する必要がありますか?(多分それはCommon Lispの良いマーケティングではありません:)
Renzo

これは組み込みの整数lcmとを使用しないソリューションであることに注意してくださいgcd
カズ

1

Mathematica、3バイト、非競合

LCM

Mathematicaの組み込みLCM関数は有理数入力を処理できます。


3
P:あなた自身の質問に答えることは細かいですが、私は非常に勝つのは非常に本当のチャンスを持っているソリューションでそれに答えるためにスポーツだとは思わない
ベータ崩壊

@BetaDecayうん...だから、今は競合していない。
ジョンファンミン


1

Common Lisp、87 78バイト

整数入力を持つlcmおよびを使用しgcdます。

(defun l(a)(/(apply #'lcm(mapcar #'numerator a))(apply #'gcd(mapcar #'denominator a))))

もっとゴルフ:

(defun l(a)(eval`(/(lcm,@(mapcar'numerator a))(gcd,@(mapcar'denominator a))))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.