質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.60%

エラーがでてきてどこに問題があるのかわかりません

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 309

malia

score 9

'''

テキストエディタに書いて、ターミナル(Linux)で実行しています

エラーの結果がこれでした
Traceback (most recent call last):
File "17.py", line 71, in <module>
result += one_ninteen_num[ i ]
IndexError: list index out of range

ですので一番下から2行目のコードでインデックスの範囲を超えて参照しているのが原因
だと思うのですが、プログラムを何度見直してもどこに問題があるのかわかりません。

どこに問題があるのでしょうか?

問題17「数字の文字数」
1から5までの数字を英単語で書けばone、two、three、four、fiveであり、全部で3 + 3 + 5 + 4 + 4 = 19の文字が使われている。

では1から1000(千)までの数字をすべて英単語で書けば、全部で何文字になるか。

注:空白文字やハイフンを数えないこと。例えば、342(three hundred and forty-two)は23文字、115(one hundred and fifteen)は20文字と数える。なお、「and」を使用するのは英国の慣習。

'''

one_ten = ['dummy', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']
eleven_nineteen = ['dummy', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']
twenty_ninety = ['dummy', 'dummy', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']
hundred = ['hundred']
thousand =['thousand']

one_ten_num = []
eleven_ninteen_num = []
twenty_ninety_num = []
hundred_num = []
thousand_num = []


#文字列の長さを図る(下準備)
#1-10
for i in one_ten:
    one_ten_num.append(len(i))
#11-19    
for i in eleven_nineteen:
    eleven_ninteen_num.append(len(i))

#1-19
one_ninteen_num = one_ten_num + eleven_ninteen_num

#20-90..10
for i in twenty_ninety:
    twenty_ninety_num.append(len(i))
#100
hundred_num = len(hundred)
#1000
thousand_num = len(thousand)

#此処からメインプログラム

result = 0
standard_value = 1000


for i in range(1, standard_value + 1 ):

    if i == 1000: # 1000の場合足して終了
        result += thousand_num
        break

    if i >= 100: # 100以上の場合
        result += hundred_num

        a = one_ninteen_num[ int( str( i )[2])] 
        result += a
        i -= 100*(int( str( i )[2]))

        if not i: # 端数がある場合
            result += len('and')

    if 0 < i < 20: # 1から19までの場合
        result += one_ninteen_num[ i ]

    elif 20 < i < 100: # 20から99までの場合
        a = twenty_ninety_num[int( str( i )[1])] 
        result += a
        i -= 10*(int( str( i )[1]))

        if i > 1:
            result += one_ninteen_num[ i ]

print( result )
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+2

インデックスの値は範囲外になる、ということははっきりしているので、
その実際のインデックスの値を表示させるなりしてみればどうなんでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/05 11:18

    その手がありましたか
    ありがとうございます!

    もう一度自分でやってみようと思います。

    キャンセル

+1

デバッグしましょう。

File "17.py", line 71, in <module>
result += one_ninteen_num[ i ]

上記でエラーが起きているので、その行の前で変数iを確認してください。

print(i)
result += one_ninteen_num[ i ]

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

ロジック追ってませんが、ぱっと見、終わりの方のif文で、`i‘が20のときどうなるんだろう?と思ってしまいます。
このレベルのミスがほかにもあるのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

elif 20 < i < 100:のブロックの中のstr( i )[1]はおそらく10の位の数値を表現したかったのだと思いますが実際は1の位になっています。str( i )[0]の間違いだと思います。

>> list(str(29))
['2', '9']
>>> str(29)[0]
'2'
>>> str(29)[1]
'9'


わざわざ文字列にしなくてもint(i/10)でいい気がします。

i -= 10*(int( str( i )[1]))は元の値の20の剰余を求めたかったと思いますがそのようになっていないと思います。
i %=20 でいいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

文字の参照位置を間違えていました

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る