Hatena::Grouprubyist

krystal: プログラミング超初心者(文系)

2008-11-10 (Mon)練習

# 前回できなかった「0~100に含まれる0をカウントする」という問題を「0~1000に含まれる0をカウントする」に変更して修正。

arr = []

for i in 0..1000
  if /0/ =~ i.to_s
    arr << i
    if /00/ =~ i.to_s
      arr << i
      if /000/ =~ i.to_s
        arr << i
      end
    end
  end
end

p arr
puts arr.length

一応正しく動くけど、ifは3重になってる。う~ん...

HexaHexa2008/11/10 21:42case 文を使うと、整理できますよ。


count = 0

for i in 0..1000
case i.to_s
when /000/
count += 3
when /00/
count += 2
when /0/
count += 1
end
end

puts count

tosiktosik2008/11/11 01:34krystalさんの書き方だと、100 や 200 や 1000 が多重でカウントされてしまいますよ。
Hexaさんのだと多重にはカウントされませんね。

parin30parin302008/11/11 01:54Stringクラスのcountメソッド使うと短くできました^^

count = 0

for i in 0..1000
count += i.to_s.count("0")
end

puts count

entottoentotto2008/11/11 12:330自体の数をカウントしたいとき: /0/ でマッチすると、1010などの場合に 0 が 2 ではなく 1 とカウントされてしまい、1000以上の数に応用が効きません。
string.count を使うか、正規表現なら count=0; string.gsub(/0/) {|s| count+=1} とするか、かな?

krystalkrystal2008/11/11 16:22> Hexaさん
ありがとうございます。
確かに「ifが多くなるとcaseを使え」と達人に言われたことがあります^^


> tosikさん
そうですね、0がついてる数を配列に入れることでカウントしようとしました。
0が二つの場合は2回、三つの場合は3回入れて正しく出力させようとしました。
どろくさいですね。

> parin30さん
ありがとうございます。
Stringクラスのcountメソッド、知りませんでした!!
かなり短くなりましたね!

> entottoさん
.gsubのほうも試してみました。うまくできてるみたいです。
ありがとうございます!

yyamasakyyamasak2008/11/11 18:37蛇足ですが ('3')==3

(0..1000).inject(0){|c,i|c+i.to_s.count('0')}

krystalkrystal2008/11/11 19:16> yyamasakさん
ありがとうございます。
injectも初めて知りました!
1000以上の場合でも使えました^^v

ringo_ringo_2008/11/12 23:461000の次は、1000万まで、その次は1000兆まで と次の問いが続く

hh2008/11/13 14:31% ruby -e 'p (0..1000).to_a.join("").gsub(/[^0]/,"").size'

かな。

krystalkrystal2008/11/19 16:53> ringo_さん
コメントをありがとうございます。
試してみます。

> hさん
コメントをありがとうございます。
勉強になります。