VB.NETでもFizzBuzzを書きたい
はじめに
ちょっと興味があったのでVisual Basic Advent Calendar 2015に参加しようと思いました。 そこで、はてなブログには予約投稿機能があるということでそれを利用しようと思ったのですが、初めて使う機能をいきなり本番に突っ込むのはアレかなと思い、事前のテストとして記事を投稿しようと考えました。
そうです、記事を投稿するのが目的で内容はおまけです。
FizzBuzz
そういえば弊社はVBで一度もFizzBuzzを書いたことが無いな〜と思い、書いてみました。
普通に書く
Public Class Normal Public Shared Sub FizzBuzz([end] As Integer) For i = 1 To [end] If i Mod 15 = 0 Then Console.WriteLine("fizzbuzz") ElseIf i Mod 5 = 0 Then Console.WriteLine("buzz") ElseIf i Mod 3 = 0 Console.WriteLine("fizz") Else Console.WriteLine(i) End If Next End Sub End Class
特にひねりも無く、いたって普通のコードです。普段からこのようなトリッキーではないコードを書きたいですね。
Linqを使う
Public Class Linq Public Shared Sub FizzBuzz([end] As Integer) Enumerable.Range(1, [end]). Select(AddressOf Map). ToList(). ForEach(AddressOf Console.WriteLine) End Sub Private Shared Function Map(value As Integer) As String If value Mod 15 = 0 Then Return "fizzbuzz" ElseIf value Mod 5 = 0 Then Return "buzz" ElseIf value Mod 3 = 0 Then Return "fizz" Else Return value.ToString End If End Function End Class
まぁ、読めなくも無いですが、なんかこう、分かりにくいかな〜って感じですね。
再帰を使う
Public Class Recursion Public Shared Sub FizzBuzz([end] As Integer) Internal(1, [end]) End Sub Private Shared Sub Internal(current As Integer, [end] As Integer) Console.WriteLine(Map(current)) If current < [end] Then Internal(current + 1, [end]) End If End Sub Private Shared Function Map(value As Integer) As String If value Mod 15 = 0 Then Return "fizzbuzz" ElseIf value Mod 5 = 0 Then Return "buzz" ElseIf value Mod 3 = 0 Then Return "fizz" Else Return value.ToString End If End Function End Class
スタックオーバーフローする可能性があるので再帰回数に気をつけましょう。
Gotoを使う
Public Class Gotou Public Shared Sub FizzBuzz([end] As Integer) Dim current = 0 Start: current = current + 1 If current > [end] Then GoTo Fin If current Mod 15 = 0 Then Console.WriteLine("fizzbuzz") GoTo Start End If If current Mod 5 = 0 Then Console.WriteLine("buzz") GoTo Start End If If current Mod 3 = 0 Then Console.WriteLine("fizz") GoTo Start End If Console.WriteLine(current) GoTo Start Fin: End Sub End Class
とてもつらいですね。