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"


ロジックとしては

前の文字が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

あ〜難しいよぉ