第21回【Python】スーパー鳩時計、格子点

現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 21 回目です。

毎日必ず Python に触れるようにしています。休日はもちろん、仕事の日もどんなに帰宅が遅くなっても、少しの時間でも触れるようにしています。触れなければ忘れる。1 日触れなかった分を取り戻すには 3 日かかる。まぁ、そんなことはないだろうけれど、そのくらいの心持で。

それでは、今日も頑張ってみようと思います。

スーパー鳩時計

普通の鳩時計は 1 時間に 1 回しか鳴かないのでつまらないと思ったあなたは、鳩時計を改造してスーパー鳩時計を作りました。このスーパー鳩時計は時刻が x 時 y 分のとき x + y が 3の倍数のとき"FIZZ"、5 の倍数のとき"BUZZ", 3の倍数かつ5の倍数のとき “FIZZBUZZ" と鳴き、これらのいずれにも当てはまらなかった場合は鳴きません。なお、0 は 3 の倍数かつ 5 の倍数であるとします。 0 時 0 分 〜 23 時 59 分 の各分のスーパー鳩時計の様子を出力してください。

こんな時計嫌だなぁ。かなりうるさい時計な気がするんだけれど。書いてみよう。

Python
for i in range(0,24):
    for j in range(0,60):
        if i + j == 0 or ((i + j) % 3 == 0 and (i + j) % 5 == 0):
            print("FIZZBUZZ")
        elif (i + j) % 3 == 0:
            print("FIZZ")
        elif (i + j) % 5 == 0:
            print("BUZZ")
        else:
            print()

出力結果はアコーディオンに格納しておきますが、1 日に 672 回も鳴く時計が出来上がりました。

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ
BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ
FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ
BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

FIZZ
BUZZ

FIZZ

FIZZBUZZ

FIZZ

BUZZ
FIZZ

VBA でも書いてみる。

VBA
For i = 0 To 23
    For j = 0 To 59
        If i + j = 0 Or ((i + j) Mod 3 = 0 And (i + j) Mod 5 = 0) Then
            Debug.Print "FIZZBUZZ"
        ElseIf (i + j) Mod 3 = 0 Then
            Debug.Print "FIZZ"
        ElseIf (i + j) Mod 5 = 0 Then
            Debug.Print "BUZZ"
        Else
            Debug.Print ""
        End If
    Next
Next

念のためカウントしてみたけれど、672 回鳴く時計で間違いないらしい。

こんなうるさい時計が家にあったら、速攻叩き壊している気がする。

格子点

x + y < 100 かつ (x ^ 3) + (y ^ 3) < 100000 が成り立つような正の整数 x , y について x × y の最大値を求めてください。

・ ヒント
2 つの式を連立不等式として解きたくなりますが、x + y < 100 に注目すると、(x , y) のとりうる値は (1,1) , (1,2) , (1,98) , (2,1)… (98,1) のいずれかであり、これらは高々 98 + 97 + … + 1 = 99 × 44 = 4356 通り(等差数列の和の公式を利用)であるため、全ての組を調べても実行時間制限に間に合います。

たかだか 4356 通りであるならば、総当たりで調べられる、って問題なんだと解釈した。

Python
ans = 0
for x in range(1,99):
    for y in range(1,100-x):
        if ans < x * y and x**3 + y**3 < 100000:
            ans = x * y
print(ans)

最初は、ans と x * y の値をいちいち比較していたのだけれど、ans < x * y とすることで、更に計算量を減らすことができることに気づいた。多分、このレベルであればそんなに変わらないのだろうけれど、計算量を意識することは重要だと偉い人が言っていた気がする。

VBA でも書いてみる。

VBA
ans = 0
For x = 1 To 98
    For y = 1 To 99 - x
        If ans < x * y And x ^ 3 + y ^ 3 < 100000 Then
            ans = x * y
        End If
    Next
Next
Debug.Print ans

二つ目のループの y が取り得る範囲が 1 から 99 – x でないといけないことに注意。この辺の値の取り方は慣れの問題になりそう。LeoSaki(旦那)は未だに悩む。

最後に

普段は paiza にあるスキルチェックもどんどんと進めている。書いて書いて書きまくって、身体に叩き込むしかないと思って。いろいろなパターンに触れれば、引き出しはその分増える。

実のところ、業務で使用している Lambda 関数を作成する際に、どうしてもタイムアウトしてしまう問題が発生してしまった。しかし、勉強して作られた幾つもの引き出しの中から、問題解決のためのヒントを見つけることができた。

いつ使うかわからない引き出しをどれだけ多く得ることができるか。それが勉強だと思っている。

引き続き、お付き合いよろしくお願いいたします!

Python学習,Python,paiza

Posted by LeoSaki