/* Rot 13 in Picat. See http://en.wikipedia.org/wiki/ROT13 http://rosettacode.org/wiki/Rot-13 Model created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ % import util. main => go. go => S = "Big fjords vex quick waltz nymph!", println(S), println(rot13(S)), println(rot13(rot13(S))), nl. % Rot 13 using a map rot13(S) = S2 => lower(Lower), upper(Upper), M = create_map(Lower, Upper), % If a char is not in a..zA..z then show it as it is. S2 := [M.get(C,C) : C in S]. create_map(Lower, Upper) = M => M = new_map(), Len = Lower.length, LDiv := Lower.length div 2, foreach(I in 1..Len) II = (LDiv+I) mod Len, if II == 0 then II := Len end, M.put(Upper[I],Upper[II]), M.put(Lower[I],Lower[II]) end. lower("abcdefghijklmnopqrstuvwxyz"). upper("ABCDEFGHIJKLMNOPQRSTUVWXYZ").