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

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

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

最近、Rubyを勉強したい欲が高まっていて、アプリケーションを作るまではいかなくても、何か軽い題材が欲しいなーと思っていました。

そこで、目についたのが、AIZU ONLINE JUDGE (AOJ) というプログラミング問題のオンライン採点サービスです。

いわゆる競技プログラミングの問題を解いて、それが正解かどうかを判定してくれるシステムになっています。

他の人とプログラムの実行速度やコードの量を競うことができ、他のユーザのソースコードを見て勉強することもできます。

僕は、Rubyで問題を解いていくことにしたのですが、 (特に序盤の) 簡単な問題はなるべくコード量を減らして解くことを目標に設定しています。

これから、たまにAOJ関係の記事が出てくると思いますが、変なコードだと思ったら指摘頂けると嬉しいです:)

今日解いた問題。

  • Volume0 0003 (Is it a Right Triangle?)

Is it a Right Triangle?

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0003&lang=jp

僕の回答

$<.map(&:split)[1..-1]
  .map{|e| e.map(&:to_i).sort}
  .each{|e| Math.hypot(e[0],e[1]) == e[2] ? puts("YES") : puts("NO")}

1行目で標準入力を配列に分割。2行目は各辺の長さが文字列扱いなので整数型にした後に昇順ソート。3行目で直角三角形かどうかの判断をしてYES/NO出力をしています。

もっと短くできそうだなーと思いながらも思いつきませんでした... (ちなみにコード量ランキングではこの記事を執筆時点で80位でした。僕のコードの半分くらいのものもあって本当にすごいです...)

まとめ

自分が思っているよりも、Ruby力が低いことを実感しました。 (コード量の少なさで1番だった人のコードを見ましたが、よくわかりませんでした...)

今のところ大正義mapに頼りまくっている感じがありますね笑

でも、書いていて楽しかったので、これからもちょこちょこ時間を見つけて頑張って問題を解いていこうと思います!