友人のisanoくんが「Rubyわかんねー」と言いながら頑張って解いたみたいなので、僕もRubyで書いてみる。

問題内容を引用。

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

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

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

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

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

isanoくんが後で見てもわかるように、丁寧にコメントまでつけちゃうぜ。

以下、僕の書いたコード
ruby>>
#/usr/bin/env ruby

Integerクラスを拡張する

class Integer

値が偶数かどうかを調べる

偶数 -> true

奇数 -> false

def even?
return (self % 2).zero?
end

end

numbers = (1..512).to_a

以下, 指定された通りにカードを取り除いていくコード

(ア) 奇数番目のカードを抜く = 添え字が偶数のカードを抜く

(イ) 偶数番目のカードを抜く = 添え字が奇数のカードを抜く

flag = true # (ア)のときtrue, (イ)のときfalse. 最初は(ア)

カードが1枚になるまで続ける

while numbers.size > 1 do

Arrayで何かを取り除く操作をするのは、rejectが簡単

ここではrejectの破壊的メソッドreject!を使う

numbers.reject!{|i| numbers.index(i).even? == flag }

flag = !flag # (ア)/(イ)の入れ替え

end

puts numbers
#=> 342
<<ruby

こんなもんでどうや!!

追記 (2008/12/02 16:35)
気づけばいろんな人がやってた。

Ritsなはてなーばっかで困る。

posted by y_tsuda y_tsuda on Fri 28 Nov 2008 at 17:57 with 0 comments
Contents rssrss
Xperiaにインストールして1週間生き残ったアプリたち
gem serverをIE8から見るとヒドイことになる現象を解決
gem serverをIE8から見るとヒドイことに
Twitter, Account Suspended
GentooにRuby1.9をインストールした
GentooにScalaをインストールしてみた
多面ディスプレイ環境を手作りしてみた
lower-camel caseな文字列とアンダースコア区切りな文字列の相互変換をRubyで
topコマンドでのCPUコア毎の表示
Fedora11 (on VirtualBox) 速効レビュー
Tags
rubyGentooDIYFedoralinuxmemoScalatwitterunixvirtualboxweb
Comments rssrss
Aleksey Aleksey: The uname check is only due to a somewhat sloppy t... 02/02 07:03
Yu Tsuda Yu Tsuda: あぁ、そうですね、、syncすると戻ってしまいますね・・・。 ご指摘ありがとうございます!! 07/11 15:38
ursm ursm: /usr/portage 以下のファイルは更新のたび元に戻ってしまうので、/etc/portage/... 07/11 13:46
Yu Tsuda Yu Tsuda: 見た目だけでも、わざわざGentooをこういうリストに入れてるのがすごいなぁと思ったりしたのです(笑... 03/31 19:49
Leonard Chin (レオ) Leonard Chin (レオ): ただし、VirtualBoxで「Gentoo」などを選択しても、別にどのOSを入れても大丈夫だ。あく... 03/31 13:00
Yu Tsuda Yu Tsuda: この機能、結構便利なんですよねー。 またEmacsで便利な機能を見つけたらブログに書きまーす。 11/27 23:46
satoko satoko: 知らんかった!emacs派なのでうれしい。thanks! 11/27 12:08
satoko satoko: 他の記事も御苦労さまです!大変だけど、後で報われる(はず!)のでがんばってくださいませっ あとあと... 10/23 00:18