Skip to content

Instantly share code, notes, and snippets.

@yonta
Last active December 18, 2015 21:59
Show Gist options
  • Save yonta/5851577 to your computer and use it in GitHub Desktop.
Save yonta/5851577 to your computer and use it in GitHub Desktop.
solve "send more money" in SML
(*
* "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
(*
* "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