# SEND MORE MONEY

More than 1 year has passed since last update.

せっかく「Hello,World!」書いたのに転職先が見つからない。

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

まず、数字のテーブル。

```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 <> '';
```

```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
```

```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文修正。