やりたいことがやりたい。

情報技術で学んだことや漫画の話を中心に、好きなことを色々書いていきます。

RubyでAOJの問題を解く その2

今日もRubyAIZU ONLINE JUDGE (AOJ)の問題を解いていきます。

今日解いた問題はこの2つです。

  • Volume0 0004 (Simultaneous Equation)
  • Volume0 0005 (GCD and LCM)

Simultaneous Equation

Simultaneous Equation | Aizu Online Judge

これは連立方程式を解く問題ですね。

僕の解答はこれです。

require "matrix"

$<.map {|a| a.split.map(&:to_i)}.each do |a|
  Matrix[[a[0], a[1]], [a[3], a[4]]]
    .lup
    .solve([a[2], a[5]])
    .map{|b| b.to_f.round(3)}
    .tap{|c| print format("%.3f %.3f\n", c[0], c[1])}
end

結構長くなってしまいました (汗)

一応ざっくり解説しておくと、3行目で標準入力を適当にさばき、4-5行目でLU分解というもので方程式を解きます。

その後、6行目で小数第4桁を四捨五入し、7行目で指定された形式で標準出力しています。

今回の問題では、LU分解なんてものを持ち込まなくても、もっと簡単に解けば良かったです。

GCD and LCM

GCD and LCM | Aizu Online Judge

最大公約数と最小公倍数を求める問題です。

僕の解答はこれです。

$<.map{|a| a.split.map(&:to_i)}
  .each{|a| puts "#{a[0].gcd(a[1])} #{a[0].lcm(a[1])}"}

多少なりとも分かりやすくするために、2行で表示しています。

これはRubyのIntegerクラスが標準で備えているgcdlcmメソッドを使えば良いだけなので、簡単ですね。

コード量の少なさランキングは執筆時点で23位でした!

まとめ

今解いている問題はいずれも簡単なものなので、解くこと自体はすぐにできますが、コード量の削減を考え出すとなかなか難しいです...

ですが、ただ解くよりも全然楽しいので、これからもなるべく短いコードを書けるように頑張りつつ、Rubyの勉強をしていきます^^