友人のisanoくんが「Rubyわかんねー」と言いながら頑張って解いたみたいなので、僕もRubyで書いてみる。
- 算数にチャレンジ!! 第624回問題 - い~さねっと
- 算数にチャレンジ!!
- 算数にチャレンジ!! 第624回問題 (← おそらく、後々見れるようになるかと)
問題内容を引用。
1~512の数の書かれたカードが1枚ずつ、左から小さい順に、「1,2,3,4,・・・,511,512」と並んでいます。いま、次のような作業を行うことにします。
ア. 前から奇数番目のカードをすべて取り除く
イ. 前から偶数番目のカードをすべて取り除く
まず、この作業を、ア→イ→ア→イ→・・・の順に、カードが残り1枚になるまで繰り返して行うことにします。
このとき、最後に残るカードに書かれた数字を答えてください。
isanoくんが後で見てもわかるように、丁寧にコメントまでつけちゃうぜ。
以下、僕の書いたコード
1 #/usr/bin/env ruby 2 3 # Integerクラスを拡張する 4 class Integer 5 6 # 値が偶数かどうかを調べる 7 # 偶数 -> true 8 # 奇数 -> false 9 def even? 10 return (self % 2).zero? 11 end 12 13 end 14 15 numbers = (1..512).to_a 16 17 # 以下, 指定された通りにカードを取り除いていくコード 18 # (ア) 奇数番目のカードを抜く = 添え字が偶数のカードを抜く 19 # (イ) 偶数番目のカードを抜く = 添え字が奇数のカードを抜く 20 21 flag = true # (ア)のときtrue, (イ)のときfalse. 最初は(ア) 22 23 # カードが1枚になるまで続ける 24 while numbers.size > 1 do 25 26 # Arrayで何かを取り除く操作をするのは、rejectが簡単 27 # ここではrejectの破壊的メソッドreject!を使う 28 numbers.reject!{|i| numbers.index(i).even? == flag } 29 30 flag = !flag # (ア)/(イ)の入れ替え 31 32 end 33 34 puts numbers 35 #=> 342
こんなもんでどうや!!
追記 (2008/12/02
Ritsなはてなーばっかで困る。
posted by
y_tsuda
on Fri 28 Nov 2008
at 17:51