LoginSignup
2
1

More than 3 years have passed since last update.

【#FizzBuzz】いろいろな言語で”1から100までの数字を数えて3の倍数と3の付く数字のときにだけアホになる”というのを書いてみる

Last updated at Posted at 2020-05-27

ふだん定期的にコードを書いていないと、ふとしたときに簡単なロジックのコードも書けなくなってしまう場面に遭遇してしまったため、リハビリの意味も含めて、再勉強した際の内容を自分用のメモとしてまとめました。

0. 説明

世界のナベアツさん(桂三度さん)の最も代表的なネタ「3の倍数と3が付く数字のときだけアホになります」というものを、いろいろな言語で実装してみます。

Wikipedia - 桂三度#主な持ちネタ&ギャグ
https://ja.wikipedia.org/wiki/桂三度#主な持ちネタ&ギャグ

単純に1から100までの数字を改行を入れながら出力するのですが、3の倍数と3が付く数字のときだけ「٩( ᐛ )و」という顔文字を「:(コロン)」と合わせて数字の後ろに出力します。

※なので FizzBuzz のタグを付けていますが正確には FizzBuzz ではないです

出力イメージ
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
41
42 : ٩( ᐛ )و
43 : ٩( ᐛ )و
44
45 : ٩( ᐛ )و
46
47
48 : ٩( ᐛ )و
49
50
51 : ٩( ᐛ )و
52
53 : ٩( ᐛ )و
54 : ٩( ᐛ )و
55
56
57 : ٩( ᐛ )و
58
59
60 : ٩( ᐛ )و
61
62
63 : ٩( ᐛ )و
64
65
66 : ٩( ᐛ )و
67
68
69 : ٩( ᐛ )و
70
71
72 : ٩( ᐛ )و
73 : ٩( ᐛ )و
74
75 : ٩( ᐛ )و
76
77
78 : ٩( ᐛ )و
79
80
81 : ٩( ᐛ )و
82
83 : ٩( ᐛ )و
84 : ٩( ᐛ )و
85
86
87 : ٩( ᐛ )و
88
89
90 : ٩( ᐛ )و
91
92
93 : ٩( ᐛ )و
94
95
96 : ٩( ᐛ )و
97
98
99 : ٩( ᐛ )و
100

1. Bashの場合

"3の付く数字"の判定はgrepを使えば良いので意外とシンプルに書けます

Bashの場合
for i in $(seq 1 100) #1から100までの数字をループ
do
  if [ $(($i % 3)) == 0 ] || [ $(echo "$i" | grep "3") ] #3の倍数と3の付く数字のときにだけアホになる 
  then
    echo "${i} : ٩( ᐛ )و"
  else
    echo "$i"  #それ以外は数字の出力のみ
  fi
done

Wandboxで実行

2. Javaの場合

"3の付く数字"の判定はString.valueOf(i).indexOf("3") != -1としました

Javaの場合
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        //1から100までの数字をループ
        for(int i=1; i<=100; i++){
            //3の倍数と3の付く数字のときにだけアホになる 
            if(i%3 == 0 || String.valueOf(i).indexOf("3") != -1 ){ 
                System.out.println(i + " : ٩( ᐛ )و");
            } else {
                System.out.println(i);
            }
        }
    }
}

Wandboxで実行

3. Scalaの場合

いろいろな書き方ができると思いますが、個人的にScalaっぽいと思う書き方にしてみました

Scalaの場合
object Main extends App{
    println(1 to 100 map ((n) => { //1から100までの数字をキーにmapを生成
        var s = n.toString() //mapの値にはキーをそのまま文字列に変換したものを代入
        if(n % 3 == 0 || s.contains('3')) {s += " : ٩( ᐛ )و"} //3の倍数と3の付く数字のときにだけアホになる
        s
    }) reduceLeft ((s,e) => { s + "\n" + e }) ) //mapの値を改行しながら順に出力
}

Wandboxで実行

4. PowerShellの場合

PowerShellの場合もいろいろな書き方ができると思いますが、Scalaにならって関数っぽく書いてみました

PowerShellの場合
1..100 | 
    %{
        if (($_ % 3 -eq 0) -or ($_ -match "3")) { echo("$_" + " : ٩( ᐛ )و") }
        else { echo("$_") }
    }

5. Python3の場合

Pythonはこういう処理が非常に書きやすい言語だと思います

Python3の場合
# coding: utf-8
for num in range(1, 100+1):
    if num % 3 == 0 or "3" in str(num):
        print("{0} : ٩( ᐛ )و".format(num))
    else:
        print(num)

Wandboxで実行

6. Rubyの場合

RubyもPythonと同様にこういう処理が非常に書きやすい言語ですね

Rubyの場合
#!/bin/env ruby
for i in 1..100
  if i % 3 == 0 || i.to_s =~ /3/
    printf( "%d : ٩( ᐛ )و\n", i )
  else
    printf( "%d\n", i )
  end
end

Wandboxで実行

7. Goの場合

Golangは型変換で苦労すると思いきや、意外とシンプルに書く事ができました

Goの場合
package main

import (
    "fmt"
    "strconv"
    "strings"
)

func main() {
    //1から100までの数字をループ
    for i := 1; i <= 100; i++ {
        //intをstringに変換
        var s string = strconv.Itoa(i)
        //3の倍数と3の付く数字のときにだけアホになる 
        if i%3 == 0 || strings.Contains(s, "3") {
            fmt.Println(s + " : ٩( ᐛ )و")
        } else {
            fmt.Println(s)
        }
    }
}

Wandboxで実行


以上です。

気が向いたら他の言語にも挑戦してみようと思います

2
1
12

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
1