Posted at

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

More than 1 year has passed since last update.

掲題の問題を解いてみました。

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()