SEND MORE MONEY

せっかく[「Hello,World!」](https://qiita.com/KAZAMAI_NaruTo/items/6feca9aa461b12ac23b0)書いたのに転職先が見つからない。

もう人生嫌になった。金くれー。

まず、数字のテーブル。

```
CREATE TABLE X as
WITH X(n) AS (
        SELECT 0
        UNION ALL SELECT n + 1 FROM X WHERE n < 9)
    SELECT * FROM X;
```

で、文字のテーブル。

```
CREATE TABLE C AS SELECT c FROM (SELECT DISTINCT SUBSTR('SENDMOREMONEY',1 + X.n + 10 * X1.n,1) AS c FROM X,X AS
X1) WHERE c <> '';
```

部品その1

```
SELECT CASE WHEN rowid=1 THEN '' ELSE ', ' END || 'X AS ' || c FROM C;
```

実行結果

```
X AS S
, X AS N
, X AS E
, X AS Y
, X AS D
, X AS M
, X AS O
, X AS R
```


部品その2

```
SELECT 'AND ' || C1.c || '.n <> ' || C2.c || '.n' FROM C as C1, C as C2 WHERE C1.c < C2.c;
```

実行結果

```
AND S.n <> Y.n
AND N.n <> S.n
AND N.n <> Y.n
AND N.n <> O.n
AND N.n <> R.n
AND E.n <> S.n
AND E.n <> N.n
AND E.n <> Y.n
AND E.n <> M.n
AND E.n <> O.n
AND E.n <> R.n
AND D.n <> S.n
AND D.n <> N.n
AND D.n <> E.n
AND D.n <> Y.n
AND D.n <> M.n
AND D.n <> O.n
AND D.n <> R.n
AND M.n <> S.n
AND M.n <> N.n
AND M.n <> Y.n
AND M.n <> O.n
AND M.n <> R.n
AND O.n <> S.n
AND O.n <> Y.n
AND O.n <> R.n
AND R.n <> S.n
AND R.n <> Y.n
```

あとはこつこつ

```
WITH X(n) AS (
        SELECT 0
        UNION ALL SELECT n + 1 FROM X WHERE n < 9)
SELECT
    ((S.n * 10 + E.n) * 10 + N.n) * 10 + D.n AS SEND
    , ' + ' AS OP
    , ((M.n * 10 + O.n) * 10 + R.n) * 10 + E.n AS MORE
    , ' = ' AS EQ
    , (((M.n * 10 + O.n) * 10 + N.n) * 10 + E.n) * 10 + Y.n AS MONEY
FROM
    X AS S
    , X AS N
    , X AS E
    , X AS Y
    , X AS D
    , X AS M
    , X AS O
    , X AS R
WHERE
    ((S.n * 10 + E.n) * 10 + N.n) * 10 + D.n
        + ((M.n * 10 + O.n) * 10 + R.n) * 10 + E.n
        = (((M.n * 10 + O.n) * 10 + N.n) * 10 + E.n) * 10 + Y.n
    AND S.n > 0
    AND M.n > 0
    AND S.n <> Y.n
    AND N.n <> S.n
    AND N.n <> Y.n
    AND N.n <> O.n
    AND N.n <> R.n
    AND E.n <> S.n
    AND E.n <> N.n
    AND E.n <> Y.n
    AND E.n <> M.n
    AND E.n <> O.n
    AND E.n <> R.n
    AND D.n <> S.n
    AND D.n <> N.n
    AND D.n <> E.n
    AND D.n <> Y.n
    AND D.n <> M.n
    AND D.n <> O.n
    AND D.n <> R.n
    AND M.n <> S.n
    AND M.n <> N.n
    AND M.n <> Y.n
    AND M.n <> O.n
    AND M.n <> R.n
    AND O.n <> S.n
    AND O.n <> Y.n
    AND O.n <> R.n
    AND R.n <> S.n
    AND R.n <> Y.n
;
```

実行結果

```
SEND    OP      MORE    EQ      MONEY
9567     +      1085     =      10652
```

え、Python でやれと？

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3


def main():
    try:
        conn = sqlite3.connect(':memory:')
        strSQL = '''
WITH X(n) AS (
        SELECT 0
        UNION ALL SELECT n + 1 FROM X WHERE n < 9)
SELECT
    ((S.n * 10 + E.n) * 10 + N.n) * 10 + D.n AS SEND
    , ' + ' AS OP
    , ((M.n * 10 + O.n) * 10 + R.n) * 10 + E.n AS MORE
    , ' = ' AS EQ
    , (((M.n * 10 + O.n) * 10 + N.n) * 10 + E.n) * 10 + Y.n AS MONEY
FROM
    X AS S
    , X AS N
    , X AS E
    , X AS Y
    , X AS D
    , X AS M
    , X AS O
    , X AS R
WHERE
    ((S.n * 10 + E.n) * 10 + N.n) * 10 + D.n
        + ((M.n * 10 + O.n) * 10 + R.n) * 10 + E.n
        = (((M.n * 10 + O.n) * 10 + N.n) * 10 + E.n) * 10 + Y.n
    AND S.n > 0
    AND M.n > 0
    AND S.n <> Y.n
    AND N.n <> S.n
    AND N.n <> Y.n
    AND N.n <> O.n
    AND N.n <> R.n
    AND E.n <> S.n
    AND E.n <> N.n
    AND E.n <> Y.n
    AND E.n <> M.n
    AND E.n <> O.n
    AND E.n <> R.n
    AND D.n <> S.n
    AND D.n <> N.n
    AND D.n <> E.n
    AND D.n <> Y.n
    AND D.n <> M.n
    AND D.n <> O.n
    AND D.n <> R.n
    AND M.n <> S.n
    AND M.n <> N.n
    AND M.n <> Y.n
    AND M.n <> O.n
    AND M.n <> R.n
    AND O.n <> S.n
    AND O.n <> Y.n
    AND O.n <> R.n
    AND R.n <> S.n
    AND R.n <> Y.n
;
'''
        lines = conn.execute(strSQL).fetchall()
        for line in lines:
            print(line)
    finally:
        conn.close()


if __name__ == '__main__':
    main()
```

実行結果

```
>>> SMM.main()
(9567, ' + ', 1085, ' = ', 10652)
```

汎用の覆面算でやれと？
・・・それはまた別の機会に ....((((^^;)

※ 2017/12/08 21:38 SQL文修正。