Quantcast
Channel: Bashタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 2912

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

$
0
0

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

0. 説明

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

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

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

出力イメージ
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

2. Javaの場合

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

Javaの場合
importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args)throwsException{//1から100までの数字をループfor(inti=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っぽいと思う書き方にしてみました

Scalaの場合
objectMainextendsApp{println(1to100map((n)=>{//1から100までの数字をキーにmapを生成vars=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にならって関数っぽく書いてみました

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

5. Python3の場合

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

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

6. Rubyの場合

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

Rubyの場合
#!/bin/env rubyforiin1..100ifi%3==0||i.to_s=~/3/printf("%d : ٩( ᐛ )و\n",i)elseprintf("%d\n",i)endend

7. Goの場合

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

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

以上です。

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


Viewing all articles
Browse latest Browse all 2912

Trending Articles