骨のダイスを転がそう

2009|01|02|03|04|05|06|07|10|12|
2010|01|02|03|04|05|06|07|08|09|10|11|
2011|02|03|05|06|07|08|09|10|11|12|
2012|01|02|04|05|09|10|11|12|
2013|01|02|04|
2014|11|
2015|01|04|05|
2016|06|07|08|09|11|
2017|01|02|03|04|
2018|03|

2010-11-03

_ [SQL] SQL で 8クイーン

ふと思い立って。

Cell
1
2
3
4
5
6
7
8

に対して

WITH E1 AS (
   SELECT E.Cell I
   FROM   eight_queen E
),
E2 AS (
   SELECT E1.*,
          E.Cell II
   FROM   eight_queen E,E1
   WHERE  E1.I <> E.Cell
          AND E1.I + 1 <> E.Cell
          AND E1.I - 1 <> E.Cell
),
E3 AS (
   SELECT E2.*,
          E.Cell III
   FROM   eight_queen E,E2
   WHERE  E2.I <> E.Cell
          AND E2.I + 2 <> E.Cell
          AND E2.I - 2 <> E.Cell
          AND E2.II <> E.Cell
          AND E2.II + 1 <> E.Cell
          AND E2.II - 1 <> E.Cell
),
E4 AS (
   SELECT E3.*,
          E.Cell IV
   FROM   eight_queen E,E3
   WHERE  E3.I <> E.Cell
          AND E3.I + 3 <> E.Cell
          AND E3.I - 3 <> E.Cell
          AND E3.II <> E.Cell
          AND E3.II + 2 <> E.Cell
          AND E3.II - 2 <> E.Cell
          AND E3.III <> E.Cell
          AND E3.III + 1 <> E.Cell
          AND E3.III - 1 <> E.Cell
),
E5 AS (
   SELECT E4.*,
          E.Cell V
   FROM   eight_queen E,E4
   WHERE  E4.I <> E.Cell
          AND E4.I + 4 <> E.Cell
          AND E4.I - 4 <> E.Cell
          AND E4.II <> E.Cell
          AND E4.II + 3 <> E.Cell
          AND E4.II - 3 <> E.Cell
          AND E4.III <> E.Cell
          AND E4.III + 2 <> E.Cell
          AND E4.III - 2 <> E.Cell
          AND E4.IV <> E.Cell
          AND E4.IV + 1 <> E.Cell
          AND E4.IV - 1 <> E.Cell
),
E6 AS (
   SELECT E5.*,
          E.Cell VI
   FROM   eight_queen E,E5
   WHERE  E5.I <> E.Cell
          AND E5.I + 5 <> E.Cell
          AND E5.I - 5 <> E.Cell
          AND E5.II <> E.Cell
          AND E5.II + 4 <> E.Cell
          AND E5.II - 4 <> E.Cell
          AND E5.III <> E.Cell
          AND E5.III + 3 <> E.Cell
          AND E5.III - 3 <> E.Cell
          AND E5.IV <> E.Cell
          AND E5.IV + 2 <> E.Cell
          AND E5.IV - 2 <> E.Cell
          AND E5.V <> E.Cell
          AND E5.V + 1 <> E.Cell
          AND E5.V - 1 <> E.Cell
),
E7 AS (
   SELECT E6.*,
          E.Cell VII
   FROM   eight_queen E,E6
   WHERE  E6.I <> E.Cell
          AND E6.I + 6 <> E.Cell
          AND E6.I - 6 <> E.Cell
          AND E6.II <> E.Cell
          AND E6.II + 5 <> E.Cell
          AND E6.II - 5 <> E.Cell
          AND E6.III <> E.Cell
          AND E6.III + 4 <> E.Cell
          AND E6.III - 4 <> E.Cell
          AND E6.IV <> E.Cell
          AND E6.IV + 3 <> E.Cell
          AND E6.IV - 3 <> E.Cell
          AND E6.V <> E.Cell
          AND E6.V + 2 <> E.Cell
          AND E6.V - 2 <> E.Cell
          AND E6.VI <> E.Cell
          AND E6.VI + 1 <> E.Cell
          AND E6.VI - 1 <> E.Cell
),
E8 AS (
   SELECT E7.*,
          E.Cell VIII
   FROM   eight_queen E,E7
   WHERE  E7.I <> E.Cell
          AND E7.I + 7 <> E.Cell
          AND E7.I - 7 <> E.Cell
          AND E7.II <> E.Cell
          AND E7.II + 6 <> E.Cell
          AND E7.II - 6 <> E.Cell
          AND E7.III <> E.Cell
          AND E7.III + 5 <> E.Cell
          AND E7.III - 5 <> E.Cell
          AND E7.IV <> E.Cell
          AND E7.IV + 4 <> E.Cell
          AND E7.IV - 4 <> E.Cell
          AND E7.V <> E.Cell
          AND E7.V + 3 <> E.Cell
          AND E7.V - 3 <> E.Cell
          AND E7.VI <> E.Cell
          AND E7.VI + 2 <> E.Cell
          AND E7.VI - 2 <> E.Cell
          AND E7.VII <> E.Cell
          AND E7.VII + 1 <> E.Cell
          AND E7.VII - 1 <> E.Cell
)
SELECT * FROM E8 ORDER BY I,II,III,IV,V,VII,VIII

こんな馬鹿な解じゃなくてもっとスマートな方法がありそうなもんだが