ITP1_3_C Swapping Two Numbers
さて、やっとAOJへのチャレンジも2桁の第10日目。
楽しく地道にがんばろう!
今日の問題はこちら #=>
2つの数の交換 | プログラミング入門 | Aizu Online Judge
問題
2 つの数の交換
2つの整数 x, y を読み込み、それらを値が小さい順に出力するプログラムを作成して下さい。
ただし、この問題は以下に示すようにいくつかのデータセットが与えられることに注意して下さい。
Input
入力は複数のデータセットから構成されています。各データセットは空白で区切られた2つの整数 x, y を含む1行から構成されています。
x と y がともに 0 のとき入力の終わりを示し、このデータセットに対する出力を行ってはいけません。
Output
各データセットごとに、x と y を小さい順に並べたものを1行に出力して下さい。x と y の間には1つの空白を入れて下さい。
自分のコード
while true nums = gets.split.map(&:to_i) break if (nums[0]==0&&nums[1]==0) puts nums.sort.join(" ") end
昨日は余計なことをしてコード実行が挑戦者中最遅という恥ずかしい記録を打ち立てたので、
今日は何も考えず、無駄なことは何もせず、とにかくシンプルにやろうということだけを考えて書いてみました。
結果、挑戦者中最速で処理が終わるという、光栄な結果を頂くことができました!
やっぱり、シンプルに考えた方がいいということですね。継続します!
他の人のコード
コードが最短の人
puts$_.split.map(&:to_i).sort*" "while"0 0 "!=gets
なんか、可読性とかメンテナンス性とか捨ててコードの短さを追求するのもなぁ、という感じが最近してきました。
でも、短いのはこれはこれで面白いなぁ、と。
Array.joinせずに、*" "してたりとか、そんなのとか。見た目が短くなるだけで、処理は一緒だから何とも言えないけど…
処理が最遅だった人
ほとんどの人が、0.03秒程度の処理なのに対し、一人だけ0.11秒とずば抜けて処理が遅い人が… どうしたんだろう?と思ってみてみました。
require 'scanf' while true x,y = gets.scanf("%d %d") if x == 0 && y == 0 break end if x > y x,y = y,x end printf("%d %d\n", x, y) end
なるほど、Arrayを使わなかったわけですね。
そうすると、確かにコードが複雑になったり処理が遅くなったりするのかなぁ?
もしくは、scanfを呼び出したから?