最近、ネットでFizzBuzz問題を目にすることがあったので、私もやってみました。
34行目の
FizzBuzz関数は最初に書いたものですが、変数Responseが次々に上書きされることが気に入らなかったので、43行目の
FizzBuzz2のように書き直しました。
ループと実行時間測定はおまけです。
追記
ゲームとしての
FizzBuzzを調べてみると、「1, 2, Fizz, 4, Buzz, Fizz, 7, 8…」のように発音するとあるので、このプログラムはゲーム本来の仕様とはズレてますね…
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. |
|
|
Module Module1 |
|
|
Private oStopwatch As New System.Diagnostics.Stopwatch() |
|
|
Sub Main() |
Do |
Console.WriteLine(vbCrLf & |
"FizzBuzzを行う自然数列の最大値を入力してください…") |
Dim Response As String = Console.ReadLine() |
Dim MaxValue As Integer |
|
If Integer.TryParse(Response, MaxValue) = True Then |
oStopwatch.Start() |
For i = 1 To MaxValue |
Console.WriteLine(FizzBuzz2(i)) |
Next |
oStopwatch.Stop() |
Console.WriteLine("実行時間 : " & |
oStopwatch.Elapsed.ToString) |
oStopwatch.Reset() |
Else |
Console.WriteLine(vbCrLf & |
"入力を数値に変換できませんでした。") |
End If |
Console.WriteLine("もう一度実行する<R>、終了する<R>以外のキー") |
If Console.ReadKey.Key <> ConsoleKey.R Then Exit Sub |
Loop |
End Sub |
|
|
Private Function FizzBuzz(ByVal Value As Integer) As String |
Dim Response As String = Value |
If (Value Mod 3) = 0 Then Response = Value & " > Fizz" |
If (Value Mod 5) = 0 Then Response = Value & " > Buzz" |
If (Value Mod 15) = 0 Then Response = Value & " > FizzBuzz" |
Return Response |
End Function |
|
|
Private Function FizzBuzz2(ByVal Value As Integer) As String |
Dim Response As String = Value |
Dim x3 As Integer = Value Mod 3 |
Dim x5 As Integer = Value Mod 5 |
If x3 = 0 And x5 <> 0 Then |
Response = Value & " > Fizz" |
ElseIf x3 <> 0 And x5 = 0 Then |
Response = Value & " > Buzz" |
ElseIf x3 = 0 And x5 = 0 Then |
Response = Value & " > FizzBuzz" |
End If |
Return Response |
End Function |
End Module |
|
入力値が「0以下」の時、動作が考慮されてないことに気付きました。
返信削除15行目を
If Integer.TryParse(Response, MaxValue) = True And 0 < MaxValue Then
として、25行目のメッセージを
Console.WriteLine(vbCrLf & "入力値が正しくありません。")
とするとよいかな。