読者です 読者をやめる 読者になる 読者になる

まめ畑

ゆるゆると書いていきます

算数にチャレンジの問題を解いてみた

Ruby

高校から続けている、算数にチャレンジ!!の第624回問題を解いてみた。
本当は、算数の知識で解答するべきなんだけれど数字にがれなのでRubyでやってみた。


解答になるので、まだ解いていない方はお気をつけてください。
問題は

1〜512の数の書かれたカードが1枚ずつ、左から小さい順に、「1,2,3,4,・・・,511,512」と並んでいます。いま、次のような作業を行うことにします。

ア. 前から奇数番目のカードをすべて取り除く
イ. 前から偶数番目のカードをすべて取り除く

 まず、この作業を、ア→イ→ア→イ→・・・の順に、カードが残り1枚になるまで繰り返して行うことにします。

 このとき、最後に残るカードに書かれた数字を答えてください。

def run(nums, flag = true)
   return nums[0] if nums.length == 1
   nums.reject!{|i| (nums.index(i)%2).zero? == flag}
   run(nums, !flag)
end

result = run((1..512).to_a)
puts result

で、342。

こんな感じでいかがでしょうか?
出題曜日を忘れてて、昨日解答して191位ですね。

意外と解答している人いたのですね

解答をして、さっきTwitterのログとか読んでたら解答している人がいた。
しかも、同じ大学の気配。
ということで、リンク張ってみる。

2008-11-28 - い〜さねっと
算数にチャレンジ! - はこべにっき@bkc - bkcグループ


算数にチャレンジ!! 第624回問題 をRubyで解く - y_tsuda's blog - s21g
僕の解答は、y_tsudaさんと同じ感じですが、y_tsudaさんの解答の方が綺麗ですね。
再帰なんか使わなくても、reject!で破壊的に消し去ってるんだからwhileでいいよな・・・。
何やってんだ俺・・・。


こちらはJavaでやった例
RubyとかPerlとかゆるふわで困る - UDONCHAN


という事で、やってみました。