Swiftで8人の女王その2

reduceの代わりにjoinを使うとメソッドdebugPrintが簡潔にかけるようになった。 文字列の結合や配列の結合くらいでは、joinの方が見た目が綺麗。

// debug用出力
func debugPrint()
{
    // 数列に対するmap&joinedを行い、デバッグ文字列を作成する
    print(
        ( 0..<queens.count ).map
            {
                i -> String in // ここで引数に名前をつけないと内側のmapのクロージャでアクセスできない。

                (0..<sizeN).map{ $0 == queens[i] ? " q" : " ." }.joined() + "\n"

            }.joined()
    )
}

メソッドresolveの方はreduceの代わりにflatMapを二重にかけた方が簡潔に見える。

func resolve() -> [EQBoard]
{
    precondition(queens.count <= self.sizeN)

    func resolve_intarnal( _ count:Int, _ boards:[EQBoard]) -> [EQBoard]
    {
        return count == 0 ? boards :
            resolve_intarnal(
                                count - 1,
                                boards.flatMap
                                {
                                    i -> [EQBoard] in // この記述がないと曖昧(ambiguous)でわからぬとエラーが出る
                                    (0..<i.sizeN).flatMap
                                    {
                                        i.tryAddAQueen($0) ? i.boardAddAQueen($0) : nil
                                    }
                                })
    }

    return resolve_intarnal(self.sizeN, [self])
}

参考文献とソースコード

プロジェクトファイル

  •  Logo 人工知能へのアプローチ
    https://www.amazon.co.jp/Logo-人工知能へのアプローチ-ラジオ技術選書-150-祐安-重夫/dp/4844301500