Kata W 2 D 1-ローマ字to数字(feat.再包装)


具本旭と一緒に問題を解いた
これは考えるべき内容だ.

1.質問



2.初期計画


論理的な「ナビゲータ」を言語で説明し、
本旭はコードを書く「運転手」を演じた
最初に作成したプール計画は次のとおりです.
  • で与えられた文字列sをチェックします.
  • Symbolで、Valueに最大文字列があるかどうかを確認します.
    2-1. ない場合は、Valueに大きな文字列があるかどうかを繰り返しチェックします.
  • を計算した後、計算した文字列を削除します.
    3-1. 見つかった文字列が1番目の場合、0番目の文字の値を答えから減算し、1番目の文字を追加します.
    3-2. 見つかった文字列が0番目の場合は、0番目の文字の値を追加します.
    (*最初の文字列の値が最大の場合は
  • )
    def roman_to_num(s):
      # 여기에 코드를 작성해주세요.
        rom_list = ['M', 'D', 'C', 'L', 'X', 'V', 'I']
        numbers = [1000, 500, 100, 50, 10, 5, 1]
        answer = 0
        j = 0
        while s:
            i = rom_list[j]
            if i in s:
                if s.index(i) == 1:
                    idx0 = rom_list.index(s[0])
                    idx1 = rom_list.index(s[1])
                    answer += -numbers[idx0] + numbers[idx1]
                    s = s[2:]
                else:
                    idx = rom_list.index(s[0])
                    answer += numbers[idx]
                    s = s[1:]
            elif not i in s :
                j += 1
        return answer
    最初のコード.解決したけど...
    2つの
  • リストを共通インデックス(数値)として使用します.
  • にはrom listもあります.index()の繰り返しも見たくありません.
  • 3.マスター再構築-冗長メソッド関数に変換し、共通インデックスを削除


  • rom_list.index()のネスト方法は関数に分けられる.

  • どうせチェックする部分はs[1]とs[0]だけなので、2つの部分だけを比較するようにコードを変更しました.
    (*いずれにしても最大値の文字列は0または1のみ)
    この過程で、2つの配列が共に使用するインデックスjを排除することができる.
    2-1. ただs[1]をずっと呼び出していたので、sがないのを防ぐため[1]
    最初は長さをチェックしていましたが、s[1]がなければ終了関数を返します.
  • def roman_to_num(s):
      # 여기에 코드를 작성해주세요.
      rom_list = ['M', 'D', 'C', 'L', 'X', 'V', 'I']
      answer = 0
      while s:
        if len(s) == 1 :
          answer += rom_value(s[0])
          return answer
        if rom_list.index(s[1]) < rom_list.index(s[0]) :
          answer += rom_value(s[1]) - rom_value(s[0])
          s = s[2:]
        else :
          answer += rom_value(s[0])
          s = s[1:]
      return answer
      
    def rom_value(string) :
      rom_list = ['M', 'D', 'C', 'L', 'X', 'V', 'I']
      num_list = [1000, 500, 100, 50, 10, 5, 1]
      return num_list[rom_list.index(string)]
    最初のコードに比べて簡潔になりました.
    でも….
  • は依然として2つのリストを使用しています.
    コードでは、配列を使用する方法はrom->numの一方向です.
    タイルを使用する必要はありません.
  • 4.二次再構成-配列ではなくdictを使用


    次はBonUkが並べ替えをキャンセルする方向に再包装した結果です
    def roman_to_num(s):
      # 여기에 코드를 작성해주세요.
        rom_num = {'M' : 1000, 'D' : 500, 'C' : 100, 'L' : 50, 'X' : 10, 'V' : 5, 'I' : 1}
        answer = 0
        while s:
            if len(s) == 1:
                answer += rom_num[s[0]]
                return answer
            if rom_num[s[0]] < rom_num[s[1]]:
                answer += rom_num[s[1]] - rom_num[s[0]]
                s = s[2:]
            else:
                answer += rom_num[s[0]]
                s = s[1:]
        return answer
    和弦がずいぶんきれいになりました.
    関数は正常に削除されました.
    新しく宣言された変数/オブジェクトにはディックシーケンスが1つしかありません.
    最初からクリーンなコードを作成したい場合は、より多くの時間や労力が必要ない場合があります.
    しかし、接着剤がコードを形成すると、表示しにくい部分が見つかり、減少します.
    時間的に聞くのはずっと少ない.
    二人が交代でコードを交換する初めての体験.
    ブログにコメントします.