/* Phone code problem in Picat. From https://www.facebook.com/barry.a.osullivan/posts/10158382446364013 """ 9,44,2,8,0,2,0,4,777,33,2,8,0,7,44,666,66,33 [ The phone: 2:abc 3:def 4:ghi 5:jkl 6:mno 7:pqrs 8:tuv 9:wxyz 0:(space) ] """ I.e. "4" means "g" "44" means "h", "hhh" means "i". ['9','44','2','8'] -> w h a t ['2'] -> a ['4','777','33','2','8'] -> g r e a t ['7','44','666','66','33'] -> p h o n e This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. go ?=> % Decoding a message Message1 = "9,44,2,8,0,2,0,4,777,33,2,8,0,7,44,666,66,33", S = decode_message(Message1), println(S), nl, % Encoding a message S2 = "hello world", Encoded = encode_message(S2), println(encoded=Encoded), % And decode it back println(decoded=decode_message(Encoded)), nl. go => true. go2 => messages(Messages), foreach(Message in Messages) println(message=Message), println(decode_message(Message.strip_space())), nl end, nl. go2 => true. % decode_message1(Map2,Message1) = S => % Message = Message1.split("0"), % S = "", % foreach(Word1 in Message) % C = "", % foreach(W in Word1.strip(",").split(",")) % C := C ++ [Map2.get(W)] % end, % S := S ++ C ++ " " % end. decode_message(Message) = [ [Map2.get(W) : W in Word.strip(",").split(",")] : Word in Message.split("0") ].join(' ') => Map2 = get_map2(). % encode_message1(Map2Reversed,Message) = Encoded => % Encoded1 = "", % foreach(T in Message) % Encoded1 := Encoded1 ++ "," ++ Map2Reversed.get(T) % end, % Encoded = Encoded1.strip(","). encode_message(Message) = [Map2Reversed.get(T) : T in Message ].join(',') => Map2Reversed = get_map2_reversed(). % % The basic phone map % get_map1 = new_map(["1"="?", "2"="abc", "3"="def", "4"="ghi","5"="jkl", "6"="mno", "7"="pqrs", "8"="tuv", "9"="wxyz", "0"=" " ]). % % "Expanded" map: % 2=> a, 22=>b, 222=>c, etc % get_map2 = Map2 => Map2_1 = new_map(), foreach(K=V in get_map1()) KK = K, foreach(VV in V) Map2_1.put(KK,VV), KK := KK ++ K end end, Map2 = Map2_1. % % Reversed expanded map: % a=>2, b=>22, c=>222, etc % get_map2_reversed() = [V=K : K=V in get_map2().to_list].new_map(). strip_space(M) = M.delete_all(' '). % % From the thread: https://www.facebook.com/barry.a.osullivan/posts/10158382446364013 % messages(Messages) => Messages = [ "9,44,2,8,0,2,0,4,777,33,2,8,0,7,44,666,66,33", "999,666,88,0,222,666,88,555,3,66,8,0,22,777,33,2,55,0,444,8,0,444,333,0,999,666,88,0,8,777,444,33,3", "6,999,0,6,88,6,0,7777,8,444,555,555,0,44,2,7777,0,666,66,33", "66,0,2,66,77,3,6,3,6", "22,7777,0,7,33,666,7,555,33,0,9,444,555,555,0,9,777,444,8,33,0,2,0,7,2,777,7777,33,777,0,8,666,0,33,66,5,666,999,0,8,44,33,0,222,666,6,6,33,66,8,7777", "444,0,333,33,33,555,0,666,555,3", "22, 2, 222, 55, 0, 8, 666, 0, 8, 44, 33, 0, 8, 444, 6, 33, 0, 9, 44, 33, 66, 0, 8, 44, 33, 777, 33, 0, 9, 2, 7777, 0, 66, 666, 0, 2, 88, 8, 666, 222, 666, 6, 7, 555, 33, 8, 444, 666, 66", "4,0,44,2,3,0,444,8,0,8,666,666", "999,33,7777", "666,6,4", "666,333,0,222,666,88,777,7777,33,0,2,66,3,0,8,44,2,8,0,444,7777,0,7,2,777,8,0,666,333,0,8,44,33,0,333,88,66" % that's mine ].