【案内】小説『エクストリームセンス』について

 小説『エクストリームセンス』は、本ブログを含めていくつか掲載していますが、PC、スマフォ、携帯のいずれでも読みやすいのは、「小説家になろう」サイトだと思います。縦書きのPDFをダウンロードすることもできます。

 小説『エクストリームセンス』のURLは、 http://ncode.syosetu.com/n7174bj/

2011年10月9日日曜日

FizzBuzz問題をやってみた

最近、ネットで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
‌ 
    '.NETのStopwatchで実行時間を測定。
    Private oStopwatch As New System.Diagnostics.Stopwatch()
‌ 
    'Main関数
    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.Then Exit Sub
        Loop
    End Sub
‌ 
    '最初に書いたFizzBuzz関数
    Private Function FizzBuzz(ByVal Value As IntegerAs 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
‌ 
    '書き直したFizzBuzz関数(FizzBuzz2)
    Private Function FizzBuzz2(ByVal Value As IntegerAs 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

1 件のコメント:

  1. 入力値が「0以下」の時、動作が考慮されてないことに気付きました。
    15行目を
    If Integer.TryParse(Response, MaxValue) = True And 0 < MaxValue Then
    として、25行目のメッセージを
    Console.WriteLine(vbCrLf & "入力値が正しくありません。")
    とするとよいかな。

    返信削除