array[n]でフラグを立ててarray[n+1]で作業したい話
配列"2z3"を読み込む時の話。
"2z3"は"2000"を表しています。つまり"zn"で0がn個続くことを表しています。
これをプログラムにする時の話。
まずはコードを書いてみた。
zero_numは"z"の後にある数字を表すフラグ
zero_num = 0 nums.each_char() do |c| if zero_num == 1 if c == "0" c = "10" end zero = "0" * c.to_i r << zero zero_num = 0 next end if c == "z" zero_num = 1 next else r << c end end
"z"の後に数字が来るのだが、どう処理していいか上手い方法が見つかりませんでした。結局嫌だったけど、ifが沢山並んでごちゃごちゃなコードになりました。
さて、これを修正していこうと思います。
- 何故ifが沢山並んだか。
- zの後は0を並べる処理をしたかったから
- zがあった事を覚えさせる
- zの後の数が0だったら10を表す、→ "z0"="0 * 10"
- zの後は0を並べる処理をしたかったから
ロジックとしては
前の文字が0か判断 _____________________________ yes↓ no ↓ 今見ている文字が0か判断 次の文字へ _____________________________ yes↓ no ↓ "0" * 10 文字の文"0"を表示
これを整理すると
zero_num = 0 nums.each_char() do |c| if zero_num == 1 if c == "0" c = "10" end zero = "0" * c.to_i r << zero zero_num = 0 next end if c == "z" zero_num = 1 next else r << c end end
あと、変数名も良くないので修正すると
previous = nil nums.each_char() do |c| if previous count = c if count == "0" count = "10" end previous = "0" * count.to_i r << previous previous = nil else if c == "z" previous = "z" next end r << c end end return r end
あ〜難しいよぉ