画面にこう出れば正解
どの言語で書いても、同じ入力なら画面に出る文字は1文字も違わない、というのが正解の決め方です(例は Python で動かしたときのコマンドです)。
15まで
$ python3 fizzbuzz.py 15
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz5まで
$ python3 fizzbuzz.py 5
1
2
Fizz
4
Buzz1まで
$ python3 fizzbuzz.py 1
130まで
$ python3 fizzbuzz.py 30
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz0(何も出さない)
$ python3 fizzbuzz.py 0
10言語のプログラム
どれもそのまま保存して動かせます。毎朝、上の正解の例をすべて実際に動かして確かめています。
fizzbuzz.php8.4.26 で 5 / 5 件の出力が正解と一致
<?php
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
$n = (int) $argv[1];
for ($i = 1; $i <= $n; $i++) {
if ($i % 15 === 0) {
echo "FizzBuzz\n";
} elseif ($i % 3 === 0) {
echo "Fizz\n";
} elseif ($i % 5 === 0) {
echo "Buzz\n";
} else {
echo $i, "\n";
}
}
動かし方(ファイルを保存したフォルダで) ・ PHP を入れる
$ php fizzbuzz.php 15
fizzbuzz.py3.14.7 で 5 / 5 件の出力が正解と一致
# 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
import sys
n = int(sys.argv[1])
for i in range(1, n + 1):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
動かし方(ファイルを保存したフォルダで) ・ Python を入れる
$ python3 fizzbuzz.py 15
fizzbuzz.go1.27.2 で 5 / 5 件の出力が正解と一致
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
package main
import (
"fmt"
"os"
"strconv"
)
func main() {
n, _ := strconv.Atoi(os.Args[1])
for i := 1; i <= n; i++ {
switch {
case i%15 == 0:
fmt.Println("FizzBuzz")
case i%3 == 0:
fmt.Println("Fizz")
case i%5 == 0:
fmt.Println("Buzz")
default:
fmt.Println(i)
}
}
}
動かし方(ファイルを保存したフォルダで) ・ Go を入れる
$ go run fizzbuzz.go 15
fizzbuzz.js24.15.0 で 5 / 5 件の出力が正解と一致
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
const n = Number(process.argv[2]);
for (let i = 1; i <= n; i++) {
if (i % 15 === 0) {
console.log("FizzBuzz");
} else if (i % 3 === 0) {
console.log("Fizz");
} else if (i % 5 === 0) {
console.log("Buzz");
} else {
console.log(i);
}
}
動かし方(ファイルを保存したフォルダで) ・ JavaScript を入れる
$ node fizzbuzz.js 15
FizzBuzz.java21.0.12 で 5 / 5 件の出力が正解と一致
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
public class FizzBuzz {
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
for (int i = 1; i <= n; i++) {
if (i % 15 == 0) {
System.out.println("FizzBuzz");
} else if (i % 3 == 0) {
System.out.println("Fizz");
} else if (i % 5 == 0) {
System.out.println("Buzz");
} else {
System.out.println(i);
}
}
}
}
動かし方(ファイルを保存したフォルダで) ・ Java を入れる
$ java FizzBuzz.java 15
fizzbuzz.cs10.0.402 で 5 / 5 件の出力が正解と一致
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
int n = int.Parse(args[0]);
for (int i = 1; i <= n; i++)
{
if (i % 15 == 0) Console.WriteLine("FizzBuzz");
else if (i % 3 == 0) Console.WriteLine("Fizz");
else if (i % 5 == 0) Console.WriteLine("Buzz");
else Console.WriteLine(i);
}
動かし方(ファイルを保存したフォルダで) ・ C# を入れる
$ dotnet run fizzbuzz.cs -- 15
fizzbuzz.rs1.99.0 で 5 / 5 件の出力が正解と一致
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
fn main() {
let n: u32 = std::env::args().nth(1).unwrap().parse().unwrap();
for i in 1..=n {
if i % 15 == 0 {
println!("FizzBuzz");
} else if i % 3 == 0 {
println!("Fizz");
} else if i % 5 == 0 {
println!("Buzz");
} else {
println!("{i}");
}
}
}
動かし方(ファイルを保存したフォルダで) ・ Rust を入れる
$ rustc fizzbuzz.rs && ./fizzbuzz 15
fizzbuzz.rb4.0.7 で 5 / 5 件の出力が正解と一致
# 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
n = ARGV[0].to_i
(1..n).each do |i|
if i % 15 == 0
puts "FizzBuzz"
elsif i % 3 == 0
puts "Fizz"
elsif i % 5 == 0
puts "Buzz"
else
puts i
end
end
動かし方(ファイルを保存したフォルダで) ・ Ruby を入れる
$ ruby fizzbuzz.rb 15
fizzbuzz.kt2.4.21 で 5 / 5 件の出力が正解と一致
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
fun main(args: Array<String>) {
val n = args[0].toInt()
for (i in 1..n) {
when {
i % 15 == 0 -> println("FizzBuzz")
i % 3 == 0 -> println("Fizz")
i % 5 == 0 -> println("Buzz")
else -> println(i)
}
}
}
動かし方(ファイルを保存したフォルダで) ・ Kotlin を入れる
$ kotlinc fizzbuzz.kt -include-runtime -d fizzbuzz.jar && java -jar fizzbuzz.jar 15
fizzbuzz.swift6.3.3 で 5 / 5 件の出力が正解と一致
// 1 から n までの数を出す。3の倍数は Fizz、5の倍数は Buzz、両方の倍数は FizzBuzz
let n = Int(CommandLine.arguments[1])!
for i in stride(from: 1, through: n, by: 1) {
if i % 15 == 0 {
print("FizzBuzz")
} else if i % 3 == 0 {
print("Fizz")
} else if i % 5 == 0 {
print("Buzz")
} else {
print(i)
}
}
動かし方(ファイルを保存したフォルダで) ・ Swift を入れる
$ swift fizzbuzz.swift 15
この回でやること
- 1 から n まで数を増やしながら、同じ処理を繰り返す(
for・each) - 条件によって、出すものを変える(
if・else if・switch) - 「割り切れるか」を余り(
%)で調べる
解説
繰り返し
for は「数を1つずつ増やしながら、同じことを何度もする」ための書き方です。Python の range(1, n + 1) や Ruby の (1..n) のように、「1 から n まで」をひとまとまりで書ける言語もあります。Python の range(1, n) は n を含まないので、n + 1 と書きます。
「割り切れるか」は余りで調べる
i % 3 は「i を 3 で割った余り」です。余りが 0 なら、3 で割り切れる、つまり 3 の倍数です。
調べる順番が大事
15 は、3 の倍数でも 5 の倍数でもあります。先に「3 の倍数か」を調べると、15 で「Fizz」と出て、そこで終わってしまいます。両方の倍数(15 の倍数)を最初に調べるのがコツです。
この回は、8言語とも同じ考え方で書けて、答えも割れません。書き方(elif・elseif・else if・switch)の違いを見比べてみてください。
練習
- 7 の倍数のときに「Lucky」と出すようにしてみましょう
- n までではなく、n から 1 へ逆の順に出してみましょう