ふだん定期的にコードを書いていないと、ふとしたときに簡単なロジックのコードも書けなくなってしまう場面に遭遇してしまったため、リハビリの意味も含めて、再勉強した際の内容を自分用のメモとしてまとめました。
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
を使えば良いので意外とシンプルに書けます
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
2. Javaの場合
"3の付く数字"の判定はString.valueOf(i).indexOf("3") != -1
としました
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);
}
}
}
}
3. 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の値を改行しながら順に出力
}
4. PowerShellの場合
PowerShellの場合もいろいろな書き方ができると思いますが、Scalaにならって関数っぽく書いてみました
1..100 |
%{
if (($_ % 3 -eq 0) -or ($_ -match "3")) { echo("$_" + " : ٩( ᐛ )و") }
else { echo("$_") }
}
5. Python3の場合
Pythonはこういう処理が非常に書きやすい言語だと思います
# 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)
6. Rubyの場合
RubyもPythonと同様にこういう処理が非常に書きやすい言語ですね
#!/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
7. Goの場合
Golangは型変換で苦労すると思いきや、意外とシンプルに書く事ができました
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)
}
}
}
以上です。
気が向いたら他の言語にも挑戦してみようと思います