LoginSignup
3
1

More than 5 years have passed since last update.

Pythonで世界のナベアツ問題を解いてみた。

Last updated at Posted at 2017-10-13

前書き

Pythonの練習がてら、FizzBuzzよりもほんのちょっと手の込んだモノを作ろうと思った。

世界のナベアツの「3のつく数字と3の倍数だけアホになる」は、文字操作系もちょっぴりあるから、FizzBuzzの1歩先としてはちょうどいいかなー、と。

工夫など

ちゃんとアホになって数字を叫んで欲しかったので、「アホ」を返すのではなくて、「サァーン!」とか叫んでくれるようにした。10000まで対応。(それ以降は焼き増しコードなので・・・)

Python3から入ったらしいType Hints使ってみた。Obj-C好きっ子としては是非使いたかった。
参考: Pythonではじまる、型のある世界 - Qiita

アホになる判断よりも、ナベアツワード(?)を生成するほうがめんどかった。もっと上手い方法あると思う。

コード

nabeatsu.py

# アホ数字か否か
def is_aho(i: int)-> bool:
    # Is string 3 in the number?
    if '3' in str(i):
        return True

    # Is the number dividable by 3?
    if i % 3 == 0:
        return True

    return False


# 3の倍数と3のつく数字の時だけアホになる。
def say_nabeatsu(i: int) -> str:
    limit = 10000
    is_nabeatsu = is_aho(i)

    ####
    if not is_nabeatsu:
        return str(i) + ''

    if i > limit:
        return 'アホ'

    # To generate Nabeatsu word
    nabeatsu_dic = {
        1: '',
        2: 'ニ',
        3: 'サァーン',
        4: 'ヨーン',
        5: 'ゴー',
        6: 'ローク',
        7: 'ナーナ',
        8: 'ハーチ',
        9: 'キュー',
        0: ''
    }

    nabeatsu_ten_dic = {
        1: 'ジュー',
        2: 'ニージュ',
        3: 'サァーンジュ',
        4: 'ヨーンジュ',
        5: 'ゴージュ',
        6: 'ロークジュ',
        7: 'ナーナジュ',
        8: 'ハーチジュ',
        9: 'キュージュ',
        0: ''
    }

    nabeatsu_end_dic = {
        1: 'イーチ',
        2: 'ニーッ',
        3: 'サァーン',
        4: 'シーッ',
        5: 'ゴーッ',
        6: 'ローク',
        7: 'シーチ',
        8: 'ハーチ',
        9: 'キュ-ッ',
        0: ''
    }
    nabeatsu_str = ''
    if i >= 1000:
        nabeatsu_str += nabeatsu_dic[int(i / 1000)] + 'セェーン'
    if i >= 100:
        tmp_i = i - (int(i / 1000) * 1000)
        nabeatsu_str += nabeatsu_dic[int(tmp_i / 100)] + 'ヒャク'
    if i >= 10:
        tmp_i = i - (int(i / 100) * 100)
        nabeatsu_str += nabeatsu_ten_dic[int(tmp_i / 10)]

    nabeatsu_str += nabeatsu_end_dic[i % 10] + '!'
    return nabeatsu_str


def main():
    end_num = 10000
    for x in range(1, end_num + 1):
        print(say_nabeatsu(x))


if __name__ == "__main__":
    main()
出力
1
2
サァーン!
4
5
ローク!
7
8
キュ-ッ!
10
11
ジューニーッ!
ジューサァーン!
14
ジューゴーッ!
16
17
ジューハーチ!
19
20
ニージュイーチ!
22
ニージュサァーン!
ニージュシーッ!
25
26
ニージュシーチ!
28
29
サァーンジュ!
サァーンジュイーチ!
サァーンジュニーッ!
サァーンジュサァーン!
サァーンジュシーッ!
サァーンジュゴーッ!
サァーンジュローク!
サァーンジュシーチ!
サァーンジュハーチ!
サァーンジュキュ-ッ!
40
...
...
...
9989
キューセェーンキューヒャクキュージュ!
9991
9992
キューセェーンキューヒャクキュージュサァーン!
9994
9995
キューセェーンキューヒャクキュージュローク!
9997
9998
キューセェーンキューヒャクキュージュキュ-ッ!
10000

あとがき

Pepperあたりに組み込んで喋らせたい。

多分、こちらの記事の方が賢い。
Pythonでナベアツしてみた | ハックノート

更新履歴

2017-10-13: str_i.find('3') >= 0:'3' in str(i)(コメントを受けて。)

PHP、Obj-C民にこの発想はなかったなー。

3
1
2

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
3
1