Ruby 競技プログラミング アルゴリズム

最大公約数と最小公倍数

最大公約数と最小公倍数を求める こちら の問題を解いてみる。

20億以下の正の整数 a, b を入力したとき、a と b の最大公約数と最小公倍数を出力して終了するプログラムを作成して下さい。ただし、a と b の最小公倍数は 20 億を超えないものとします。

Input:
複数のデータセットが与えられます。各データセットは1行に a と b が1つのスペースで区切られて与えられます。入力の最後まで処理して下さい。

Output:
各データセットに対して、最大公約数と最小公倍数を1つのスペースで区切って1行に出力して下さい。

書いたコードがこちら。

この値を入力すると

8 6
50000000 30000000

出力結果はこんな感じ。

2 24
10000000 150000000  

Rubyは練習中だけど $F の使い方も覚えたし、そこそこいい感じで書けたな、と思って他の人の回答を見てみたら もっとシンプルなコード を発見。

puts$<.map{|l|eval(l.sub" ",".gcdlcm ")*" "}

こんな短いコードで最大公約数と最小公倍数が分かるとは。 Integerには gcdlcm なんて便利なメソッドがあるのね。

eval とか使ったこと無くて一目見ただけでは何やってるのか分からなかったけど、どうやらこんな感じで処理されてるみたい。

1.$<.map で標準入力から一行取得

"8 6"

2.l.sub " ", ".gcdlcm" で最大公約数と最小公倍数を求めるためのコードを作成。

"8.gcdlcm 6"

3.eval8.gcdlcm 6 を実行。計算結果は配列で返ってくる

[2, 24]

4.この時点で |l|eval(l.sub" ",".gcdlcm ")*" "[2, 24] * " " になる。配列に対する *join同じ なので、配列の要素をスペース区切りで結合することになる。

"2 24"

シンプルさとわかり易さは必ずしも両立はしないけど、トレーニング次第でこのギャップは埋められるはず。ワンライナーの練習がんばってこ。