るびらな!

RubyをLearnする人の勉強記録。(超)弩(級の)素人なので、誰かダメさがわかる人に罵ってもらったりして、少しずつ知見を広げたいと思っています。

ITP1_3_C Swapping Two Numbers

ここも押していただけると嬉しいです #=> にほんブログ村 IT技術ブログへ にほんブログ村 IT技術ブログ Rubyへ にほんブログ村 IT技術ブログ Ruby on Railsへ

さて、やっと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を呼び出したから?