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

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

はじめに

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

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

時々、当日の出社しているメンバーとおしゃべりをします。仕事のことが多いですが、たまにまったく意味のない雑談をします。いろいろと煮詰まっているときなど、救いになることもあります。

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

スーパー鳩時計 (paizaランク C 相当)

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


入力される値

なし

入力値最終行の末尾に改行が1つ入ります。


期待する出力

0 時 0 分の鳩時計の鳴き声
0 時 1 分の鳩時計の鳴き声
...
23 時 58 分の鳩時計の鳴き声
23 時 59 分の鳩時計の鳴き声

0 時 0 分から 23 時 59 分までの各分の鳩時計の鳴き声を以上の形式で出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。

こんな時計あったら嫌だな、の時計。相当うるさいだろうなぁ。

JavaScript
for (let i = 0; i < 24; i++) {
    for (let j = 0; j < 60; j++) {
        if ((i + j) % 3 == 0 && (i + j) % 5 == 0) {
            console.log('FIZZBUZZ');
        } else if ((i + j) % 3 == 0) {
            console.log('FIZZ');
        } else if ((i + j) % 5 == 0) {
            console.log('BUZZ');
        } else {
            console.log();
        }
    }
}
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 回なるらしい。Python のときにも書いたけれど、うちにあったら速攻叩き壊す。

格子点 (paizaランク C 相当)

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 通り(等差数列の和の公式を利用)であるため、全ての組を調べても実行時間制限に間に合います。


入力される値

なし

入力値最終行の末尾に改行が1つ入ります。


期待する出力

条件を満たす正の整数 x , y について x × y の最大値を 1 行で出力してください。

また、末尾に改行を入れ、余計な文字、空行を含んではいけません。

総当たりで解くやつ。条件が緩いので簡単だと思う。

JavaScript
let maxNum = 0;
for (let x = 1; x < 99; x++) {
    for (let y = 1; y < (100 - x); y++) {
        if (maxNum < x * y && Math.pow(x,3) + Math.pow(y,3) < 100000) {
            maxNum = x * y;
        }
    }
}
console.log(maxNum);

べき乗については、アスタリスク 2 個(**)を書くと、ES 7 からだから気を付けろ、と言われる。

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)

最後に

いろいろと調べていると、ちゃんと main() が書かれているコードを見かける。その辺の作法についての知識が不足していることを実感。もっと勉強しないといけない、と思った。

LeoSaki(旦那)の場合、AWS Lambda が多いので、handler で event をとるところがスタートになる。しかし、ちゃんとクラス化しているコードを見ると、素直にカッコいいなぁと思う。みんな、どこでそういう知識を習得しているのか。

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

Python の第21回はこちら