石取りゲーム2

改訂新版 C言語による標準アルゴリズム事典をSwiftでコーディング

アルゴリズム

石取りゲーム2

実行

Command Line

コード

import Foundation

/// 入力
/// - parameter メッセージ
/// - returns 入力文字列
func input(msg:String = "") -> String {
    print(msg, separator: "", terminator: "")
    let indata = FileHandle.standardInput;
    let rawdata = indata.availableData;
    let str = NSString(data: rawdata, encoding: String.Encoding.utf8.rawValue);
    let length = str?.length
    let result = str?.substring(with: NSRange(location: 0,length: length! - 1))
    return result!
}

func stone2() {
    var f = [Int](repeating: 1, count: 21)
    for i in 3...20 {
        f[i] = f[i - 1] + f[i - 2]
    }
    var n = Int(input(msg: "石の数? (2..10000)? "))!
    if n < 2 || n > 10000 {
        exit(1)
    }
    var max = n - 1
    var my_turn = 1
    var x:Int = 0
    while n != 0 {
        print("\(max) 個まで取れます")
        if my_turn == 1 {
            x = n
            var i = 20
            while x != f[i] {
                if x > f[i] {
                    x = x - f[i]
                }
                i = i - 1
            }
            if x > max {
                x = 1
            }
            print("私は \(x) 個の石をとります。")
        }
        else {
            repeat {
                x = Int(input(msg: "何個とりますか? "))!
            } while x < 1 || x > max
        }
        n = n - x
        max = 2 * x
        if max > n {
            max = n
        }
        my_turn = my_turn ^ 1
    }
    my_turn == 1 ? print("あなたの勝ちです!") : print("私の勝ちです!")
}

stone2()

Algorithm, Swift

Posted by shi-n