⍝ The N-queens Chess problem:

    3 4⍴queens 8
┌───────────────┬───────────────┬───────────────┬───────────────┐
│⍟ · · · · · · ·│⍟ · · · · · · ·│· ⍟ · · · · · ·│· ⍟ · · · · · ·│
│· · · · ⍟ · · ·│· · · · · ⍟ · ·│· · · ⍟ · · · ·│· · · · ⍟ · · ·│
│· · · · · · · ⍟│· · · · · · · ⍟│· · · · · ⍟ · ·│· · · · · · ⍟ ·│
│· · · · · ⍟ · ·│· · ⍟ · · · · ·│· · · · · · · ⍟│⍟ · · · · · · ·│
│· · ⍟ · · · · ·│· · · · · · ⍟ ·│· · ⍟ · · · · ·│· · ⍟ · · · · ·│
│· · · · · · ⍟ ·│· · · ⍟ · · · ·│⍟ · · · · · · ·│· · · · · · · ⍟│
│· ⍟ · · · · · ·│· ⍟ · · · · · ·│· · · · · · ⍟ ·│· · · · · ⍟ · ·│
│· · · ⍟ · · · ·│· · · · ⍟ · · ·│· · · · ⍟ · · ·│· · · ⍟ · · · ·│
├───────────────┼───────────────┼───────────────┼───────────────┤
│· ⍟ · · · · · ·│· ⍟ · · · · · ·│· ⍟ · · · · · ·│· ⍟ · · · · · ·│
│· · · · ⍟ · · ·│· · · · · ⍟ · ·│· · · · · ⍟ · ·│· · · · · · ⍟ ·│
│· · · · · · ⍟ ·│⍟ · · · · · · ·│· · · · · · · ⍟│· · ⍟ · · · · ·│
│· · · ⍟ · · · ·│· · · · · · ⍟ ·│· · ⍟ · · · · ·│· · · · · ⍟ · ·│
│⍟ · · · · · · ·│· · · ⍟ · · · ·│⍟ · · · · · · ·│· · · · · · · ⍟│
│· · · · · · · ⍟│· · · · · · · ⍟│· · · ⍟ · · · ·│· · · · ⍟ · · ·│
│· · · · · ⍟ · ·│· · ⍟ · · · · ·│· · · · · · ⍟ ·│⍟ · · · · · · ·│
│· · ⍟ · · · · ·│· · · · ⍟ · · ·│· · · · ⍟ · · ·│· · · ⍟ · · · ·│
├───────────────┼───────────────┼───────────────┼───────────────┤
│· ⍟ · · · · · ·│· · ⍟ · · · · ·│· · ⍟ · · · · ·│· · ⍟ · · · · ·│
│· · · · · · ⍟ ·│· · · · ⍟ · · ·│· · · · ⍟ · · ·│· · · · · ⍟ · ·│
│· · · · ⍟ · · ·│· ⍟ · · · · · ·│· · · · · · · ⍟│· ⍟ · · · · · ·│
│· · · · · · · ⍟│· · · · · · · ⍟│· · · ⍟ · · · ·│· · · · ⍟ · · ·│
│⍟ · · · · · · ·│⍟ · · · · · · ·│⍟ · · · · · · ·│· · · · · · · ⍟│
│· · · ⍟ · · · ·│· · · · · · ⍟ ·│· · · · · · ⍟ ·│⍟ · · · · · · ·│
│· · · · · ⍟ · ·│· · · ⍟ · · · ·│· ⍟ · · · · · ·│· · · · · · ⍟ ·│
│· · ⍟ · · · · ·│· · · · · ⍟ · ·│· · · · · ⍟ · ·│· · · ⍟ · · · ·│
└───────────────┴───────────────┴───────────────┴───────────────┘

    1 disp queens¨0 1 2 3 4
┌→──┬───┬─────┬───────┬─────────┐
│┌⊖┐│┌→┐│┌⊖──┐│┌⊖────┐│┌→──────┐│
││ ⌽││⍟↓││   ⌽││     ⌽││· ⍟ · ·││
│└⊖┘│└→┘│└──→┘│└────→┘││· · · ⍟││
│   │   │     │       ││⍟ · · ·││
│   │   │     │       ││· · ⍟ ·↓│
│   │   │     │       │└──────→┘│
└──⊖┴──→┴────⊖┴──────⊖┴────────→┘

⍝ Alternative codings:

    ⍝ One-liner for 5-queens:

    ⎕io←0

    {⍵{↑¨↓↓(2|1↓⍳2×⍺)\((↑⍵)∘.=⍳⍺)⊃¨⊂'·⍟'}∪{{(⊃⍋↑⍵)⊃⍵},↑⍵}¨{{⍋⍵}\2/⊂⍵}¨∘{{⍒⍵}\4/⊂⍵}¨⍵{(⍺=,↑⍴¨⍵)/⍵},¨↑⍬{↑(⍺⍺,⍺)∇∇(1↓⍵⍵~¨⍺+(1+⍳⍴⍵⍵)×⊂¯1 0 1)/((⊃⍵⍵)~⍺+¯1 0 1),⊂⍵,⊂⍺⍺,⍺}(1↓⍵⍴⊂⌽⍳⍵)/(⌽⍳⌈⍵÷2),⊂0⍴⊂⍬}5
┌─────────┬─────────┐
│⍟ · · · ·│· ⍟ · · ·│
│· · ⍟ · ·│· · · · ⍟│
│· · · · ⍟│· · ⍟ · ·│
│· ⍟ · · ·│⍟ · · · ·│
│· · · ⍟ ·│· · · ⍟ ·│
└─────────┴─────────┘

    ⍝ Roger Hui's one-liner for 5-queens:

    ⎕io←0

    {⍵{((+/b)⌿⍵),⍺|(,b)/⍳×/⍴b←~↑(⊂⍳⍺)∊¨(↓⍵)+[0]¨⊂(c-⍳c←1↓⍴⍵)∘.ׯ1 0 1}⍣⍵⍳1 0}5
0 2 4 1 3
0 3 1 4 2
1 3 0 2 4
1 4 2 0 3
2 0 3 1 4
2 4 1 3 0
3 0 2 4 1
3 1 4 2 0
4 1 3 0 2
4 2 0 3 1

    ⍝ Alternative coding, which uses the →trav← DFS operator:

    qtrav←{                             ⍝ N-queens using →trav← operator.
        subs←{(⊂⍵),¨(⍳⍴⊃⍺)~atk ⍵}       ⍝ sub-trees of tree-node ⍵.
        accm←{⍺,((⍴⍵)=⍴⊃⍺)/⊂⍵}          ⍝ accumlation of N-placement.
        atk←{↑(⊂⍵)+¯1 0 1×⊂⌽⍳⍴⍵}        ⍝ columns under attack in row 1+⍵.
        fmt←{⍵∘.=⍳⍴⍵}                   ⍝ formatted as bool matrix.
        fmt¨(↓0 ⍵⍴0)accm trav subs ⍬    ⍝ formatted solutions.
    }

    ⎕io←1

    2 5⍴ qtrav 5
┌─────────┬─────────┬─────────┬─────────┬─────────┐
│1 0 0 0 0│1 0 0 0 0│0 1 0 0 0│0 1 0 0 0│0 0 1 0 0│
│0 0 1 0 0│0 0 0 1 0│0 0 0 1 0│0 0 0 0 1│1 0 0 0 0│
│0 0 0 0 1│0 1 0 0 0│1 0 0 0 0│0 0 1 0 0│0 0 0 1 0│
│0 1 0 0 0│0 0 0 0 1│0 0 1 0 0│1 0 0 0 0│0 1 0 0 0│
│0 0 0 1 0│0 0 1 0 0│0 0 0 0 1│0 0 0 1 0│0 0 0 0 1│
├─────────┼─────────┼─────────┼─────────┼─────────┤
│0 0 1 0 0│0 0 0 1 0│0 0 0 1 0│0 0 0 0 1│0 0 0 0 1│
│0 0 0 0 1│1 0 0 0 0│0 1 0 0 0│0 1 0 0 0│0 0 1 0 0│
│0 1 0 0 0│0 0 1 0 0│0 0 0 0 1│0 0 0 1 0│1 0 0 0 0│
│0 0 0 1 0│0 0 0 0 1│0 0 1 0 0│1 0 0 0 0│0 0 0 1 0│
│1 0 0 0 0│0 1 0 0 0│1 0 0 0 0│0 0 1 0 0│0 1 0 0 0│
└─────────┴─────────┴─────────┴─────────┴─────────┘

Back to: code

Back to: Workspaces