2
0
paiza×Qiita記事投稿キャンペーン「プログラミング問題をやってみて書いたコードを投稿しよう!」

paizaラーニングレベルアップ問題集のFizz Buzz (paizaランク C 相当)をやってみた

Last updated at Posted at 2024-07-20

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集のFizz Buzz (paizaランク C 相当)をやってみました。言語はPython3です。

ちなみに、Dランクレベルアップメニューにもあるのですが、こちらは

  • 入力値なし($N=100$で固定)
  • FizzBuzzの間に半角空白なし

となっております。


  • サンプルプログラム(Python3)

    n = int(input())
    for i in range(1, n + 1):
        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)
    
    • 1行目にて、整数値$N$を標準入力から受け取ります。
    • 今回は$i=1,2,...,N$について処理していくので、for i in range(1,n+1)とします。
    • あとは、問題文に従って
      • 3の倍数かつ5の倍数のときには、"Fizz Buzz"
      • 3の倍数のときには、"Fizz"
      • 5の倍数のときには、"Buzz"
      • 上記以外のときには、数値
        を1から順に表示していきます。

  • 別解1
    andを使わずに書くこともできます。

    n = int(input())
    for i in range(1, n + 1):
        if i % 3 == 0:
            if i % 5 == 0:
                print("Fizz Buzz")
            else:
                print("Fizz")
        else:
            if i % 5 == 0:
                print("Buzz")
            else:
                print(i)
    

    改行無しの出力が容易な言語では、3で割り切れる判定をした直後にFizzを出力するのもいいでしょう。(以下はJavaのサンプルです)

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            sc.close();
            for (int i = 1; i <= n; i++) {
                if (i % 3 == 0) {
                    System.out.print("Fizz");
                    if (i % 5 == 0) {
                        System.out.print(" Buzz");
                    }
                } else if (i % 5 == 0) {
                    System.out.print("Buzz");
                } else {
                    System.out.print(i);
                }
                System.out.println();
            }
        }
    }
    

ここから先の内容は実務では非推奨と思われます。

  • 別解2
    PythonやC、C++等、一部の言語では、0はFalse、0以外はTrueとして扱われるので、先に「3で割り切れない、かつ5で割り切れない」を処理することにして、以下のように書くこともできます。
    n = int(input())
    for i in range(1, n + 1):
        if i % 3 and i % 5:  # 3でも5でも割り切れない
            print(i)
        elif i % 3:  # 3で割り切れない(5では割り切れる)
            print("Buzz")
        elif i % 5:  # 5で割り切れない(3では割り切れる)
            print("Fizz")
        else:  # 3でも5でも割り切れる
            print("Fizz Buzz")
    
    ※JavaやC#ではif(i%3)のような書き方はできません。

  • 別解3
    Pythonでは、空文字列はFalse、1文字以上の文字列はTrueとして扱われます。
    更に、or演算子を用いて、orの前がTrueならばorの後を処理しない、orの前がFalseならばorの後を処理することを利用すれば、以下のように書くこともできます。(短絡評価
    n = int(input())
    for i in range(1, n + 1):
        s = ""
        if i % 3 == 0:
            s += "Fizz"
            if i % 5 == 0:
                s += " "
        if i % 5 == 0:
            s += "Buzz"
        print(s or i)  # sが空文字ならiを、sが空文字でなければsを出力する
    
    上記の内容と内包表記を使えば、一行で書けてしまったりします。
    print(*[(("Fizz"if i%3==0else"")+" "+("Buzz"if i%5==0else "")).strip()or i for i in range(1,int(input())+1)],sep="\n")
    
    更に、PythonやC、C++では、Trueは1、Falseは0と評価されるので、配列の添字に入れたりしてこんな書き方もできます。
    print(*[(["","Fizz"][i%3==0]+" "+["","Buzz"][i%5==0]).strip() or i for i in range(1,int(input())+1)],sep="\n")
    
    Pythonでは、文字列*整数文字列整数回繰り返しになります。
    print(*[("Fizz"*(i%3==0)+" "+"Buzz"*(i%5==0)).strip() or i for i in range(1,int(input())+1)],sep="\n")
    

 
あとはコードゴルファーの方に短くしていただきましょう。
(真ん中の+" "+をどちらかに寄せるとか、$i=0$から始めてi%3==0の部分をi%3>1にするとかor ior-~iにするとかかんとか)


今はChatGPTに「標準入力」「FizzBuzz」と言語名を入れればサンプルプログラムが出る時代ですね(ChatGPTの回答は必ずご自身で確かめてください)。

2
0
0

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
2
0