3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【ネタ記事】オレが世界のナベアツ問題を解いたから見てほしい

Last updated at Posted at 2024-02-19

はじめに

資格の勉強もひと段落がつき、そろそろ何か趣味でコーディングしたいとなり、最初に思いついたのが何故か世界のナベアツのあのネタである。
FizzBuzz問題の延長だろうと考え、安易に取り組むことになったのだが...

これより以下、本文です。
大変下らない記事ですので、興味の無い方やお忙しい方はブラウザバック推奨です。

本文

なにはともあれ要件定義

FizzBuzz問題の要件定義

  1. 最初のプレイヤーは「1」と数字を発言する。
  2. 次のプレイヤーは直前のプレイヤーの発言した数字に1を足した数字を発言していく。
  3. ただし、3の倍数の場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5の倍数の場合は「Buzz」、3の倍数かつ5の倍数の場合(すなわち15の倍数の場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。

世界のナベアツ問題の要件定義

  1. 世界のナベアツが「1」という数字を発言する。
  2. 世界のナベアツが直前に発言した数字に1を足した数字を発言していく。
  3. 3の倍数と3が付く数字のときだけ阿呆になります
  • それぞれには上限が定められていないので、爆笑レッドカーペット時代によく宣言されていた「40」を上限とします。
  • 阿呆の声は、数値の後に(阿呆の声)を連結して表現するものとします。

よって上記の要件をすべてまとめると以下のようになります。

# 要件
1 世界のナベアツが「1」という数字を発言する。
2 世界のナベアツが直前に発言した数字に1を足した数字を発言していく。
3 3の倍数と3が付く数字のときだけ阿呆になります。
4 1から始まり、40まで数える。
5 阿呆の声は、数値の後に(阿呆の声)を連結して表現する。

ようやく本文

まずは、今回のベースとなるFizzBuzzのソースをここに。

sample.py

for i in range(1, 41):
    if i % 3 == 0 and i % 5 == 0:
        print("Fizz Buzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)

FizzBuzzのソースから世界のナベアツ問題に修正するにあたり、不要な記述を削除します。


for i in range(1, 41):
-    if i % 3 == 0 and i % 5 == 0:
-        print("Fizz Buzz")
-    elif i % 3 == 0:
+    if i % 3 == 0:
-        print("Fizz")
+        print(i) # 数値の後に文字列を連結するため、この時点で数値に変えておく
-    elif i % 5 == 0:
-        print("Buzz")
    else:
        print(i)

修正後のファイルは以下のようになります。

sample.py
for i in range(1, 41):
    if i % 3 == 0:
        print(i)
    else:
        print(i)

シンプルになりましたね。

本格的に世界のナベアツ問題に取り組んでいきます。
この時点で、既に3の倍数の条件を満たしているので、追記するのは3がつく数字のときという条件です。
まず必要なのは、range objectをstrにキャストするということ。
その後、キャストしたstr(i)に3が含まれるかをstr.count()を通して、3が出現する回数を受け取ります。
その返り値を元に分岐をさせて、3がつく数字を判定しようと思います。

for i in range(1, 41):
+   if str(i).count("3") >= 1 or i % 3 == 0:
+       print(i, "(阿呆の声)")
+   else:
        print(i)

@fujitanozomu 様より、ご指摘頂いた内容を元にソースを修正しました。

それではこの作成したPythonファイルを実行しましょう。

$ python sample.py

以下のような結果がコマンドラインに出力されたら終了です。

1
2
3 (阿呆の声)
4
5
6 (阿呆の声)
7
8
9 (阿呆の声)
10
11
12 (阿呆の声)
13 (阿呆の声)
14
15 (阿呆の声)
16
17
18 (阿呆の声)
19
20
21 (阿呆の声)
22
23 (阿呆の声)
24 (阿呆の声)
25
26
27 (阿呆の声)
28
29
30 (阿呆の声)
31 (阿呆の声)
32 (阿呆の声)
33 (阿呆の声)
34 (阿呆の声)
35 (阿呆の声)
36 (阿呆の声)
37 (阿呆の声)
38 (阿呆の声)
39 (阿呆の声)
40

期待通りの結果が出力されましたね。
本文はここまでです、お疲れさまでした。

まとめ

まとめも、何もなくFizzBuzz問題のソースに分岐を追加しただけですね。しかし、私の技量では、スマートに書くことができなかったことを反省しようと思います。

どなたか「こんな書き方があるよ」みたいなのをご存知でしたら、コメントを頂けると嬉しいです。

最後まで、読んで頂きありがとうございました。

参考文献

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?