34 lines
1.2 KiB
Standard ML
34 lines
1.2 KiB
Standard ML
val BLOCKS = [(#"B",#"O"), (#"X",#"K"), (#"D",#"Q"), (#"C",#"P"), (#"N",#"A"), (#"G",#"T"),
|
|
(#"R",#"E"), (#"T",#"G"), (#"Q",#"D"), (#"F",#"S"), (#"J",#"W"), (#"H",#"U"), (#"V",#"I"),
|
|
(#"A",#"N"),(#"O",#"B"), (#"E",#"R"), (#"F",#"S"), (#"L",#"Y"), (#"P",#"C"), (#"Z",#"M")];
|
|
val words = ["A","BARK","BOOK","TREaT","COMMON","SQUAD","CONFUSE"];
|
|
open List;
|
|
|
|
local
|
|
val remove = fn x => fn B => (fn (a,b) => (tl a)@b ) (partition ( fn a=> x=a) B)
|
|
in
|
|
fun cando ([] , Done, B ) = true
|
|
| cando (h::t, Done, []) = false
|
|
| cando (h::t, Done, B ) =
|
|
let
|
|
val S = find (fn (a,b) => a=h orelse b=h) B
|
|
in
|
|
if isSome S then cando (t, (h,valOf S)::Done, remove (valOf S) B)
|
|
else
|
|
let
|
|
val T = find ( fn(_,(a,b)) => a=h orelse b=h) Done
|
|
val U = if isSome T then find (fn (a,b) => a = #1 (valOf T) orelse b = #1 (valOf T) ) B else NONE
|
|
in
|
|
if isSome T andalso isSome U
|
|
then cando ( t, (#1 (valOf T),(valOf U))::(h,#2 (valOf T))::(remove (valOf T) Done), remove (valOf U) B)
|
|
else false
|
|
end
|
|
end
|
|
end;
|
|
|
|
map (fn st => cando(map Char.toUpper (String.explode st),[],BLOCKS)) words;
|
|
|
|
val BLOCKS = [(#"U",#"S"), (#"T",#"Z"), (#"A",#"O"), (#"Q",#"A")];
|
|
val words = ["A","UTAH","AutO"];
|
|
map (fn st => cando(map Char.toUpper (String.explode st),[],BLOCKS)) words;
|