codeiq
Python3

【CodeIQ】言語不問:英語でプリーズ!【解いてみた】

掲題の問題を解いてみました。
https://codeiq.jp/challenge/1658
(少し前にも同じ投稿したんですけど、回答期限前だったんので削除しました。指摘していただいた方、ありがとうございました。)

はじめに、謝罪

このコードだと上手くいきません。微妙に違います。
申し訳ありません。
ただのスキルアップ目的で書いただけなので、、、申し訳ありません。
ご指導ご鞭撻いただければ幸いです、よろしくお願いいたします、、、。

コード

Python3を使用しました。

#
# 言語不問:英語でプリーズ!
#
class ConvNumber2String:

    RANGE_0_9 = {
        0: "Zero",
        1: "One",
        2: "Two",
        3: "Three",
        4: "Four",
        5: "Five",
        6: "Six",
        7: "Seven",
        8: "Eight",
        9: "Nine"
    }

    RANGE_10_19 = {
        10: "Ten",
        11: "Eleven",
        12: "Twelve",
        13: "Thirteen",
        14: "Fourteen",
        15: "Fifteen",
        16: "Sixteen",
        17: "Seventeen",
        18: "Eighteen",
        19: "Nineteen"
    }

    RANGE_20_90 = {
        20: "Twenty",
        30: "Thirty",
        40: "Forty",
        50: "Fifty",
        60: "Sixty",
        70: "Seventy",
        80: "Eighty",
        90: "Ninety"
    }

    RANGE_100_ = {
        100:        "Hundred",
        1000:       "Thousand",
        1000000:    "Million",
        1000000000: "Billion"
    }

    _conv = []


    # 主処理
    # - 標準入力からの受け取り
    # - 指定された回数のループ
    # - 桁数に応じて分岐
    # - 標準出力に結果を吐きだす
    def main(self):
        # 標準入力を受け取り、argvに設定
        argv = []
        count = int(input())
        for i in range(0, count):
            argv.append(input())

        # 念のため、標準入力の内容を確認
        if len(argv) == 0:
            print("ERROR: not found argv.")
            return
        if len(argv) < count:
            print("ERROR: `len(sys.argv)` is less than `sys.argv[1]`")
            return

        # 標準入力の第一引数の数だけloop
        for idx in range(0, count):
            self._conv = []
            num = argv[idx]

            # マイナス値の場合は最初に単語を設定しとく、そしてマイナスを除去する
            if "-" in argv[idx]:
                self._conv.append("Negative")
                num = num[1:]

            # 桁数に応じて分岐
            if len(num) == 1:
                self.set_1_digit(num)
            elif len(num) == 2:
                self.set_2_digits(num)
            elif len(num) == 3:
                self.set_3_digits(num)
            elif len(num) in [4, 5, 6]:
                self.set_4_6_digits(num)
            elif len(num) in [7, 8, 9]:
                self.set_7_9_digits(num)
            else:
                self.set_over_10_digits(num)

            # nullが入ってたら消してから標準出力
            if None in self._conv:
                self.remove_none()
            print(" ".join(self._conv))


    # 1桁の場合の処理
    def set_1_digit(self, num):
        self._conv.append(self.RANGE_0_9[int(num)])


    # 2桁の場合の処理
    def set_2_digits(self, num):
        if num[0] == "1":
            self._conv.append(self.RANGE_10_19[int(num)])
        else:
            if num[0] != "0":
                self._conv.append(self.RANGE_20_90[int(num[0]) * 10])
            if num[1] != "0":
                self._conv.append(self.RANGE_0_9[int(num[1])])


    # 3桁の場合の処理
    # - 1桁の処理と2桁の処理を使い回す
    def set_3_digits(self, num):
        self._conv.append(self.RANGE_0_9[int(num[0])])
        self._conv.append(self.RANGE_100_[100])
        self._conv.append(self.set_2_digits(num[1:4]))


    # 4~6桁の場合の処理
    # - 上位1〜3桁は、桁数に応じて1桁/2桁/3桁の処理を使い回す
    # - 下位3桁は、3桁の処理を使い回す
    def set_4_6_digits(self, num):
        remover = 0
        if len(num) == 4:
            remover = 1
            self.set_1_digit(num[0])
        elif len(num) == 5:
            remover = 2
            self.set_2_digits(num[0:2])
        else:
            remover = 3
            self.set_3_digits(num[0:3])
        self._conv.append(self.RANGE_100_[1000])
        self.set_3_digits(num[remover:len(num)])


    # 7~9桁の場合の処理
    # - 上位1〜3桁は、桁数に応じて1桁/2桁/3桁の処理を使い回す
    # - 下位6桁は、4~6桁の処理を使い回す
    def set_7_9_digits(self, num):
        remover = 0
        if len(num) == 7:
            remover = 1
            self.set_1_digit(num[0])
        elif len(num) == 8:
            remover = 2
            self.set_2_digits(num[0:2])
        else:
            remover = 3
            self.set_3_digits(num[0:3])
        self._conv.append(self.RANGE_100_[1000000])
        self.set_4_6_digits(num[remover:len(num)])


    # 10桁以上の場合の処理
    # - 13桁以上の場合は無視
    # - 上位1〜3桁は、桁数に応じて1桁/2桁/3桁の処理を使い回す
    # - 下位9桁は、4~6桁の処理を使い回す
    def set_over_10_digits(self, num):
        remover = 0
        if len(num) == 10:
            remover = 1
            self.set_1_digit(num[0])
        elif len(num) == 11:
            remover = 2
            self.set_2_digits(num[0:2])
        elif len(num) == 12:
            remover = 3
            self.set_3_digits(num[0:3])
        else:
            return
        self._conv.append(self.RANGE_100_[1000000000])
        self.set_7_9_digits(num[remover:len(num)])


    # 配列からNoneを削除
    def remove_none(self):
        self._conv.remove(None)
        if None in self._conv:
            self.remove_none()


logic = ConvNumber2String()
logic.main()