LoginSignup
0
0

More than 5 years have passed since last update.

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

Posted at

掲題の問題を解いてみました。
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()
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0