異性体の問題 counting isomers

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

異性体の問題 counting isomers
実行:Playground※但し時間がかかります。Command Lineが現実的です。

let C = 17
let L = 2558
var size = [Int](repeating: 0, count: L)
var length = [Int](repeating: 0, count: L)
var count = [Int](repeating: 0, count: C + 1)

func isomer() -> Bool {
    var n = 0
    var len = 0
    
    for i in 0..<L {
        len = length[i] + 1
        if len > C / 2 {
            break
        }
        let si = size[i] + 1
        if si + len > C {
            continue
        }
        for j in 0...i {
            let sj = si + size[j]
            if sj + len > C {
                continue
            }
            for k in 0...j {
                let sk = sj + size[k]
                if sk + len > C {
                    continue
                }
                n = n + 1
                if n >= L {
                    return false
                }
                size[n] = sk
                length[n] = len
            }
        }
    }
    if len <= C / 2 {
        return false
    }
    for i in 0...n {
        let si = size[i]
        for j in 0...i {
            if length[i] != length[j] {
                continue
            }
            let sj = si + size[j]
            if sj > C {
                continue
            }
            count[sj] = count[sj] + 1
            for k in 0...j {
                let sk = sj + size[k] + 1
                if sk > C {
                    continue
                }
                for h in 0...k {
                    let sh = sk + size[h]
                    if sh <= C {
                        count[sh] = count[sh] + 1
                    }
                }
            }
        }
    }
    for i in 1...C {
        print("炭素原子が \(i) 個のものは \(count[i]) 種類")
    }
    return true
}

print(isomer())


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

石取りゲーム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()


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

接点監視・制御 DI/DO/AI/AO

DI(Degital Input)
ON/OFF情報
接点装置に各装置から入力される。システムはDIを取得して監視等に使用する。

DO(Degital Output)
ON/OFF情報
接点装置から各装置に出力される。システムはDOを設定して制御等に使用する。

AI(Analog Input)
数値情報
接点装置に各装置から入力される。システムはDIを取得して監視等に使用する。

AO(Analog Output)
数値情報
接点装置から各装置に出力される。システムはDOを設定して制御等に使用する。

石取りゲーム1

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

石取りゲーム1
実行: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 stone1() {
    var n = Int(input(msg: "石の数? "))!
    let m = Int(input(msg: "1回に取れる最大の石の数? "))!
    if n < 1 || m < 1 {
        exit(1)
    }
    var my_turn:Int
    my_turn = 1
    while n != 0 {
        var x:Int
        if my_turn == 1 {
            x = (n - 1) % (m + 1)
            if x == 0 {
                x = 1
            }
            print("私は \(x) 個の石を取ります。")
        }
        else {
            repeat {
                x = Int(input(msg: "何個取りますか? "))!
            } while x <= 0 || x > m || x > n
        }
        n -= x
        print("残りは \(n) 個です。")
        my_turn ^= 1
    }
    my_turn == 1 ? print("あなたの負けです!") : print("私の負けです!")
}

stone1()


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

安定な結婚の問題 stable marriage problem

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

安定な結婚の問題 stable marriage problem
実行: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 marriage() {
    let N = 3
    var boy = [Int](repeating: 0, count: N + 1)
    var position = [Int](repeating: 0, count: N + 1)
    var rank = Array<[Int]>(repeating: [Int](repeating: 0, count: N + 1), count: N + 1)
    var girl = Array<[Int]>(repeating: [Int](repeating: 0, count: N + 1), count: N + 1)
    
    for g in 1...N {
        print("女性\(g)好み入力")
        for r in 1...N {
            let b = Int(input(msg: "\(r)位入力:"))!
            rank[g][b] = r
        }
        boy[g] = 0
        rank[g][0] = N + 1
    }
    for b in 1...N {
        print("男性\(b)好み入力")
        for r in 1...N {
            girl[b][r] = Int(input(msg: "\(r)位入力:"))!
        }
        position[b] = 0
    }
    for b in 1...N {
        var s = b
        while s != 0 {
            position[s] = position[s] + 1
            let g = girl[s][position[s]]
            if rank[g][s] < rank[g][boy[g]] {
                let t = boy[g]
                boy[g] = s
                s = t
            }
        }
    }
    for g in 1...N {
        print("女 \(g) - 男 \(boy[g])")
    }
}

marriage()


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

誤り検出符号 error detecting code

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

誤り検出符号 error detecting code
実行:Playground

func errorDetectingCode(s: String) {
    var d:Int
    var w = 1
    var t = 0
    
    for c in s {
        d = w * Int(String(c))!
        if d > 9 {
            d = d - 9
        }
        t = t + d
        w = 3 - w
    }
    (t % 10 == 0) ? print("有効") : print("無効")
}

let s = "5555555555554444"
errorDetectingCode(s: s)


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)

値の交換 exchange of values

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

値の交換 exchange of values
実行:Playground

func mySwap(x: inout Int, y: inout Int) {
    let temp = x;
    x = y;
    y = temp;
}

var x = 12
var y = 34
print("x=\(x) y=\(y)")
mySwap(x:&x, y:&y)
print("x=\(x) y=\(y)")

ジェネリクス版

func mySwap<T>(x: inout T, y: inout T) {
    let temp = x;
    x = y;
    y = temp;
}

var x = 12
var y = 34
print("x=\(x) y=\(y)")
mySwap(x:&x, y:&y)
print("x=\(x) y=\(y)")

Swift標準ライブラリ

var x = 12
var y = 34
print("x=\(x) y=\(y)")
swap(&x, &y)
print("x=\(x) y=\(y)")

タプル

var x = 12
var y = 34
print("x=\(x) y=\(y)")
(y, x) = (x, y)
print("x=\(x) y=\(y)")


[改訂新版]C言語による標準アルゴリズム事典 (Software Technology)