Last active
December 18, 2015 21:59
-
-
Save yonta/5851577 to your computer and use it in GitHub Desktop.
solve "send more money" in SML
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(* | |
* "send more money" is quiz. | |
* One character means one number. | |
* All characters are different each other. | |
* Numbers satisfy following condition. | |
* | |
* send | |
* +) more | |
* -------- | |
* money | |
* | |
* What are characters ? | |
* ... s,e,n,d,m,o,r,y | |
*) | |
(* | |
* *** solver design *** | |
* | |
* s,e,n,d,m,o,r,y | |
* [ [0,0,0,0,0,0,0,0], | |
* [0,0,0,0,0,0,0,1], | |
* ... , | |
* [9,9,9,9,9,9,9,9] ] : all list | |
* || | |
* || filtered with conditions | |
* || > filter (condition : int list -> int list) allList | |
* vv | |
* [ [S,E,N,D,M,O,R,Y], ... ] : answer!! | |
*) | |
(* | |
* makeAll design : adding one by one | |
* [] => [[0],[1],...,[9]] => [[0,0],[1,0],...,[9,0], | |
* [0,1], ... ,[9,1], | |
* ... [9,9]] | |
* => ... => ... ... | |
* => [[0,0,0,0,0,0,0,0], ... , [9,9,9,9,9,9,9,9]] | |
*) | |
fun addToAll nil _ = nil | |
| addToAll (x::t) listlist = | |
(map (fn list => x :: list) listlist) @ addToAll t listlist | |
fun makeAll () = | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] [[]])))))))) | |
(* different each other *) | |
fun oneDiff x nil = true | |
| oneDiff x (h::t) = x <> h andalso oneDiff x t | |
fun diff nil = true | |
| diff (h::t) = oneDiff h t andalso diff t | |
(* d + e = y *) | |
fun oneCond [_,e,_,d,_,_,_,y] = d + e = y orelse d + e = y + 10 | |
| oneCond _ = raise Fail "oneCond" | |
(* n + r = e *) | |
fun tenCond [_,e,n,d,_,_,r,y] = n + r + ((d + e) div 10) = e orelse | |
n + r + ((d + e) div 10) = e + 10 | |
| tenCond _ = raise Fail "tenCond" | |
(* e + o = n *) | |
fun handCond [_,e,n,d,_,O,r,y] = | |
e + O + ((n + r + ((d + e) div 10)) div 10) = n orelse | |
e + O + ((n + r + ((d + e) div 10)) div 10) = n + 10 | |
| handCond _ = raise Fail "handCond" | |
(* s + m = o *) | |
fun thouCond [s,e,n,d,m,O,r,y] = | |
s + m + ((e + O + ((n + r + ((d + e) div 10)) div 10)) div 10) = O orelse | |
s + m + ((e + O + ((n + r + ((d + e) div 10)) div 10)) div 10) = O + 10 | |
| thouCond _ = raise Fail "thouCond" | |
(* carrng to m *) | |
fun tenthouCond [s,e,n,d,m,O,r,y] = (s + m) div 10 = m | |
| tenthouCond _ = raise Fail "tenthouCond" | |
fun solve () = | |
let | |
val all = makeAll () | |
val tmp = List.filter diff all | |
val tmp = List.filter oneCond tmp | |
val tmp = List.filter tenCond tmp | |
val tmp = List.filter thouCond tmp | |
val ans = List.filter tenthouCond tmp | |
in | |
ans | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(* | |
* "send more money" is quiz. | |
* One character means one number. | |
* All characters are different each other. | |
* Numbers satisfy following condition. | |
* | |
* send | |
* +) more | |
* -------- | |
* money | |
* | |
* What are characters ? | |
* ... s,e,n,d,m,o,r,y | |
*) | |
(* | |
* *** solver design *** | |
* | |
* s,e,n,d,m,o,r,y | |
* [ [0,0,0,0,0,0,0,0], | |
* [0,0,0,0,0,0,0,1], | |
* ... , | |
* [9,9,9,9,9,9,9,9] ] | |
* || | |
* || filtered with conditions | |
* || > filter (f : int list -> int list) all | |
* vv | |
* [ [S,E,N,D,M,O,R,Y], ... ] | |
*) | |
(* different each other *) | |
fun oneDiff x nil = true | |
| oneDiff x (h::t) = x <> h andalso oneDiff x t | |
fun diff nil = true | |
| diff (h::t) = oneDiff h t andalso diff t | |
(* | |
* [] => [[0],[1],...,[9]] => [[0,0],[1,0],...,[9,0], | |
* [0,1], ... ,[9,1], | |
* ... [9,9]] | |
* ... | |
* => [[0,0,0,0,0,0,0,0], ... , [9,9,9,9,9,9,9,9]] | |
*) | |
fun addToAll nil _ = nil | |
| addToAll (x::t) listlist = | |
(map (fn list => x :: list) listlist) @ addToAll t listlist | |
(* | |
* delete list which have same number | |
* [] => [[0],[1],...,[9]] => [[1,0],... ,[9,0], | |
* [0,1],[2,1],...,[9,1], | |
* ... [8,9]] | |
* ... | |
* => [[0,1,2,3,4,5,6,7], ... , [9,8,7,6,5,4,3,2]] | |
*) | |
fun addToAll nil _ = nil | |
| addToAll (x::t) listlist = | |
(foldl (fn (list, res) => if oneDiff x list | |
then (x :: list) :: res | |
else res) | |
nil listlist) | |
@ addToAll t listlist | |
fun makeAll () = | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] | |
(addToAll [0,1,2,3,4,5,6,7,8,9] [[]])))))))) | |
(* d + e = y *) | |
fun oneCond [_,e,_,d,_,_,_,y] = d + e = y orelse d + e = y + 10 | |
| oneCond _ = raise Fail "oneCond" | |
(* n + r = e *) | |
fun tenCond [_,e,n,d,_,_,r,y] = n + r + ((d + e) div 10) = e orelse | |
n + r + ((d + e) div 10) = e + 10 | |
| tenCond _ = raise Fail "tenCond" | |
(* e + o = n *) | |
fun handCond [_,e,n,d,_,O,r,y] = | |
e + O + ((n + r + ((d + e) div 10)) div 10) = n orelse | |
e + O + ((n + r + ((d + e) div 10)) div 10) = n + 10 | |
| handCond _ = raise Fail "handCond" | |
(* s + m = o *) | |
fun thouCond [s,e,n,d,m,O,r,y] = | |
s + m + ((e + O + ((n + r + ((d + e) div 10)) div 10)) div 10) = O orelse | |
s + m + ((e + O + ((n + r + ((d + e) div 10)) div 10)) div 10) = O + 10 | |
| thouCond _ = raise Fail "thouCond" | |
(* carrng to m *) | |
fun tenthouCond [s,e,n,d,m,O,r,y] = (s + m) div 10 = m | |
| tenthouCond _ = raise Fail "tenthouCond" | |
(* m <> 0 *) | |
fun m [_,_,_,_,m,_,_,_] = m <> 0 | |
fun solve () = | |
let | |
val all = makeAll () | |
(* val tmp = List.filter diff all *) | |
val tmp = List.filter oneCond all | |
val tmp = List.filter tenCond tmp | |
val tmp = List.filter thouCond tmp | |
val tmp = List.filter tenthouCond tmp | |
val ans = List.filter m tmp | |
in | |
ans | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment