gpt4 book ai didi

sql - 使用关系数据库解决密码算术难题

转载 作者:行者123 更新时间:2023-12-02 05:21:20 24 4
gpt4 key购买 nike

假设你有一个密码算术难题:

发送+更多=金钱

目标是用数字 (0-9) 替换字母,以便进行加法运算。

我知道如何用数学方法解决这个问题,但我不确定如何使用关系数据库来解决这个问题。

如何设计架构来解决这个问题?

尝试解决此问题的 SQL 查询会是什么样子?

编辑:有一些限制:

  1. 给定的字母应始终使用相同的数字。例如,如果你猜字母 E 是“5”,那么 E 在所有它出现的地方都应该得到值“5”发生。
  2. 不同的字母应该有不同的数字,例如,您不能为两者分配“4”E 和 M。
  3. 所有数字(单词)都不能有任何前导零

最佳答案

这回答了用户提出的其他问题。

SEND + MORE = MONEY,其中每个字符都有一个唯一的数字,并且没有单词以零开头。

select
top 1
S.num as S,
E.num as E,
N.num as N,
D.num as D,
M.num as M,
O.num as O,
R.num as R,
Y.num as Y,
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num) as [SEND],
(M.num * 1000 + O.num * 100 + R.num * 10 + E.num) as MORE,
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num) + (M.num * 1000 + O.num * 100 + R.num * 10 + E.num) as SEND_plus_MORE,
(M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num) as [MONEY]

from
Digits as S
join digits as E on E.num <> S.num
join digits as N on N.num <> S.num and N.num <> E.num
join digits as D on D.num <> S.num and D.num <> E.num and D.num <> N.num
join digits as M on M.num <> S.num and M.num <> E.num and M.num <> N.num and M.num <> D.num
join digits as O on O.num <> S.num and O.num <> E.num and O.num <> N.num and O.num <> D.num and O.num <> M.num
join digits as R on R.num <> S.num and R.num <> E.num and R.num <> N.num and R.num <> D.num and R.num <> M.num and R.num <> O.num
join digits as Y on Y.num <> S.num and Y.num <> E.num and Y.num <> N.num and Y.num <> D.num and Y.num <> M.num and Y.num <> O.num and Y.num <> R.num

where
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num)
+ (M.num * 1000 + O.num * 100 + R.num * 10 + E.num)
= (M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num)
and S.num <> 0 and M.num <> 0

我考虑过在 WHERE 子句中强制执行唯一数字,但我相信这最终会在检查 WHERE 子句之前处理太多排列。

由于我们只处理最多 10 位数字,因此出于速度考虑,我认为最好构建长 ON 子句。

这是没有疯狂 ON 子句的 FROM + WHERE 子句。这在我的服务器上运行速度慢很多。

from
Digits as S
cross join digits as E
cross join digits as N
cross join digits as D
cross join digits as M
cross join digits as O
cross join digits as R
cross join digits as Y

where
(S.num * 1000 + E.num * 100 + N.num * 10 + D.num)
+ (M.num * 1000 + O.num * 100 + R.num * 10 + E.num)
= (M.num * 10000 + O.num * 1000 + N.num * 100 + E.num * 10 + Y.num)
and S.num <> 0 and M.num <> 0

and (select max(B.Count) from
(select COUNT(*) as Count from
(select S.num, 's' as letter -- the letters are included to make sure the unions do not merge equivalent rows
UNION select E.num, 'e'
UNION select N.num, 'n'
UNION select D.num, 'd'
UNION select M.num, 'm'
UNION select O.num, 'o'
UNION select R.num, 'r'
UNION select Y.num, 'y') as A
group by A.num
) as B
) = 1

关于sql - 使用关系数据库解决密码算术难题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com