LoginSignup
0
0

More than 3 years have passed since last update.

1-100までのカードをn-1枚置きに裏返す(Ruby)

Posted at

1-100までの数字が書かれたカードが裏返しで横に並んでいます。(1, 2, 3, 4, 5... 99, 100)
①初めは2番目のカードから1枚置きにカードを裏返して行きます。
②次に3番目のカードから2枚置きにカードを裏返して行きます。
③次に4番目のカードから3枚置きにカードを裏返して行きます。



このようにn番目のカードからn-1枚置きにカードを裏返していって、これ以上カードの向きが変わらなくなるまで続けます。

その時に裏返っているカードは何番かを調べていきます。

考え方

カードを左から順に裏返す処理を書いていきます。カードが表か裏かはTrue(表), またはFalse(裏)で表すことが出来ます。

まずはカードを100枚用意します。

qiita.rb
n = 100
cards = Array.new(n, false)

配列はArray.newで作成することが出来ます。
また、その時に第2引数を指定すると、新しい配列をそのオブジェクトで埋めます。
ここでは100枚全てfalse(裏)にして配列を作成しました。

次にカードを裏返して行きます。

qiita.rb
(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枚置きにカードを裏返す処理を行います。

最後に裏返しのカードの番号を表示します。

qiita.rb
no = 1
cards.each do |i|
  puts no if !i
  no += 1
end

初めのカードから順番に、false(裏)だったらその番号(no)をputsしています。

答え

qiita.rb
1
4
9
16
25
36
49
64
81
100

ちなみに

カードの番号とその裏表の状態を同時にハッシュで保持出来るともっと簡単に記述出来るかもしれないと思ったり。。。

qiita.rb
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
0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0