円周率2 pi

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

異性体の問題 counting isomers
実行:Playground

import Foundation

func pi2() -> Double {
    var a:Double = 1
    var b:Double = 1 / sqrt(2)
    var s:Double = 1
    var t:Double = 4
    
    for _ in 1..<3 {
        let last = a
        a = (a + b) / 2
        b = sqrt(last * b)
        s -= t * (a - last) * (a - last)
        t *= 2
    }
    return (a + b) * (a + b) / s
}

print("相加相乗平均")
print("円周率:\(pi2())")


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

円周率 pi

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

円周率 pi
実行:Playground

func pi() -> Double {
    var k:Double = 1
    var p:Double = 0.0
    var t:Double = 16.0 / 5.0
    var last:Double
    
    repeat {
        last = p
        p += (t / k)
        t /= -5.0 * 5.0
        k += 2
    } while p != last
    
    k = 1.0
    t = 4.0 / 239.0
    repeat {
        last = p
        p -= t / k
        t /= -239.0 * 239
        k += 2
    } while p != last
    return p
}

print("Machin公式")
print("円周率:\(pi())")


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

エジプトの分数 Egyptian fractions

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

異性体の問題 counting isomers
実行: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!
}

var m = Int(input(msg: " 分子 m = "))!
var n = Int(input(msg: " 分母 n = "))!
print("\(m)/\(n) = ")
var q:Int
while n % m != 0 {
    q = n / m + 1
    print("1/\(q) + ")
    m = m * q - n
    n *= q
}
print("1/\(n / m)")


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

異性体の問題 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)