1-100までの数字が書かれたカードが裏返しで横に並んでいます。(1, 2, 3, 4, 5... 99, 100)
①初めは2番目のカードから1枚置きにカードを裏返して行きます。
②次に3番目のカードから2枚置きにカードを裏返して行きます。
③次に4番目のカードから3枚置きにカードを裏返して行きます。
・
・
・
このようにn番目のカードからn-1枚置きにカードを裏返していって、これ以上カードの向きが変わらなくなるまで続けます。
#####その時に裏返っているカードは何番かを調べていきます。
##考え方
カードを左から順に裏返す処理を書いていきます。カードが表か裏かはTrue(表), またはFalse(裏)で表すことが出来ます。
まずはカードを100枚用意します。
n = 100
cards = Array.new(n, false)
配列はArray.newで作成することが出来ます。
また、その時に第2引数を指定すると、新しい配列をそのオブジェクトで埋めます。
ここでは100枚全てfalse(裏)にして配列を作成しました。
次にカードを裏返して行きます。
(2..n).each do |i|
j = i - 1
while j < cards.length do
cards[j] = !cards[j]
j += i
end
end
初めは2番目のカードから裏返していくので、(2..n)として2番目のカードから順番に処理をしています。
また、n-1枚置きにカードを裏返すために、jにn−1の値を格納します。
そうしたら、whileのループの中で、n-1枚置きにカードを裏返す処理を行います。
###最後に裏返しのカードの番号を表示します。
no = 1
cards.each do |i|
puts no if !i
no += 1
end
初めのカードから順番に、false(裏)だったらその番号(no)をputsしています。
###答え
1
4
9
16
25
36
49
64
81
100
###ちなみに
カードの番号とその裏表の状態を同時にハッシュで保持出来るともっと簡単に記述出来るかもしれないと思ったり。。。
n = 100
cards = Array.new(n, false)
(2..n).each do |i|
j = i - 1
while j < cards.length do
cards[j] = !cards[j]
j += i
end
end
no = 1
cards.each do |i|
puts no if !i
no += 1
end