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

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

# 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: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で実行](https://wandbox.org/permlink/bOLKbDx3MCUvJn93)

# 2. Javaの場合

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

```java: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で実行](https://wandbox.org/permlink/YxqnKWgArClet18c)

# 3. Scalaの場合

いろいろな書き方ができると思いますが、個人的に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で実行](https://wandbox.org/permlink/WrmO5722LlX7ltYe)

# 4. PowerShellの場合

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

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

# 5. Python3の場合

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

```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で実行](https://wandbox.org/permlink/7blkrQYfdeT9F72v)

# 6. Rubyの場合

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

```ruby: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で実行](https://wandbox.org/permlink/JeycpJMLWkWeYmC3)

# 7. Goの場合

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

```go: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で実行](https://wandbox.org/permlink/LF3Gj6u2UZ5LiFac)

---

以上です。

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