(*Q); # code0.ml - Don Yang (uguu.org) # # 08/10/03 sub xor_string { $r .= chr ($_[0] ^ ord $_) foreach ($z =~ /./g); $r; } sub remove_space { ($s = $_[0]) =~ s/\s//g; $s; } sub format_text { $t = $_[1]; foreach $x ($_[0] =~ /./g) { $x = ord $x; print ( ($x > 64 && $x < 91) ? (substr $t, 0, ($x -= 64)) : ($x > 96 && $x < 123) ? (' ' x ($x - 96)) : "\n" ); ($x < 27) && ($t = substr $t, $x); } } sub data { $z = remove_space($_[1]); (remove_space($_[0]), xor_string(3) . $z); } q!*) open String;; let rec int_list_to_string lst k = match lst with a::b -> (make 1 (Char.chr (a lxor k)) ^ (int_list_to_string b k)) | [] -> "";; let rec string_to_int_list str = if str = "" then [] else Char.code (get str 0) :: string_to_int_list (sub str 1 ((length str) - 1));; let xor_string s k = int_list_to_string (string_to_int_list s) k;; let rec remove_space str = if str = "" then str else ( (let x = sub str 0 1 in if x = " " || x = "\n" then "" else x) ^ (remove_space (sub str 1 ((length str) - 1))) );; let rec format_text (template, text) = match template with x::y -> if x > 64 && x < 91 then ( let x = x - 64 in ( print_string (sub text 0 x); format_text (y, (sub text x ((length text) - x))) ) ) else ( if x > 96 && x < 123 then print_string (make (x - 96) ' ') else print_newline (); format_text (y, text) ); | [] -> ();; let data (t, s) = (string_to_int_list(remove_space(t)), (xor_string (remove_space(s)) 3) ^ (remove_space(s))) (*!#*) ;; format_text (data("K. K.", "kfool#tlqog"));;