Thursday, April 30, 2009

Morse Code in Factor

I am getting the hang of this. This is a string>morse code and morse code>string converter as per this programming praxis problem. My implementation ignores extra whitespace in the morse code stream.
USING: ascii lists sequences regexp ;

: ch>morse ch>upper ( char -- morse-str )
         { { CHAR: 0 [ "    " ] }
           { CHAR: 1 [ "    " ] }
           { CHAR: 2 [ "    " ] }
           { CHAR: 3 [ "    " ] }
           { CHAR: 4 [ "    " ] }
           { CHAR: 5 [ "    " ] }
           { CHAR: 6 [ "    " ] }
           { CHAR: 7 [ "    " ] }
           { CHAR: 8 [ "    " ] }
           { CHAR: 9 [ "    " ] }
           { CHAR: A [ " " ] } 
           { CHAR: B [ "   " ] }
           { CHAR: C [ "   " ] } 
           { CHAR: D [ "  " ] } 
           { CHAR: E [ "  " ] }
           { CHAR: F [ "   " ] }
           { CHAR: G [ "  " ] }
           { CHAR: H [ "   " ] } 
           { CHAR: I [ " " ] } 
           { CHAR: J [ "   " ] } 
           { CHAR: K [ "  " ] } 
           { CHAR: L [ "   " ] } 
           { CHAR: M [ " " ] } 
           { CHAR: N [ " " ] } 
           { CHAR: O [ "  " ] } 
           { CHAR: P [ "   " ] } 
           { CHAR: Q [ "   " ] } 
           { CHAR: R [ "  " ] } 
           { CHAR: S [ "  " ] } 
           { CHAR: T [ "" ] } 
           { CHAR: U [ "  " ] } 
           { CHAR: V [ "   " ] } 
           { CHAR: W [ "  " ] } 
           { CHAR: X [ "   " ] }  
           { CHAR: Y [ "   " ] }  
           { CHAR: Z [ "   " ] } [ drop " " ] } case ;

: morse>ch ( morse-substring -- char )
         { { "    " [ CHAR: 0 ] }
           { "    " [ CHAR: 1 ] }
           { "    " [ CHAR: 2 ] }
           { "    " [ CHAR: 3 ] }
           { "    " [ CHAR: 4 ] }
           { "    " [ CHAR: 5 ] }
           { "    " [ CHAR: 6 ] }
           { "    " [ CHAR: 7 ] }
           { "    " [ CHAR: 8 ] }
           { "    " [ CHAR: 9 ] }
           { " " [ CHAR: A ] } 
           { "   " [ CHAR: B ] }
           { "   " [ CHAR: C ] } 
           { "  " [ CHAR: D ] } 
           { "  " [ CHAR: E ] }
           { "   " [ CHAR: F ] }
           { "  " [ CHAR: G ] }
           { "   " [ CHAR: H ] } 
           { " " [ CHAR: I ] } 
           { "   " [ CHAR: J ] } 
           { "  " [ CHAR: K ] } 
           { "   " [ CHAR: L ] } 
           { " " [ CHAR: M ] } 
           { " " [ CHAR: N ] } 
           { "  " [ CHAR: O ] } 
           { "   " [ CHAR: P ] } 
           { "   " [ CHAR: Q ] } 
           { "  " [ CHAR: R ] } 
           { "  " [ CHAR: S ] } 
           { "" [ CHAR: T ] } 
           { "  " [ CHAR: U ] } 
           { "   " [ CHAR: V ] } 
           { "  " [ CHAR: W ] } 
           { "   " [ CHAR: X ] }  
           { "   " [ CHAR: Y ] }  
           { "   " [ CHAR: Z ] }
           [ drop 32 ] } case ;


: string>morse ( string -- morse-string )
         sequence>cons { } [ ch>morse suffix ] foldl
         "  " join ;

: morse>string ( morse-string -- string )
         R/ [ ]{2,}/ re-split
         [ >string morse>ch ] map >string ; 

No comments: