RubyでAOJの問題を解く その2
今日もRubyでAIZU 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クラスが標準で備えているgcd
やlcm
メソッドを使えば良いだけなので、簡単ですね。
コード量の少なさランキングは執筆時点で23位でした!
まとめ
今解いている問題はいずれも簡単なものなので、解くこと自体はすぐにできますが、コード量の削減を考え出すとなかなか難しいです...
ですが、ただ解くよりも全然楽しいので、これからもなるべく短いコードを書けるように頑張りつつ、Rubyの勉強をしていきます^^