local fn encode( string as CFStringRef) as CFStringRef CFStringRef ch, s, t Short i, rl s = @"" // Initalize the output string for i = 0 to len( string ) - 1 // Encode string char by char ch = mid( string, i, 1) // Read character at index rl = 1 // Start run-length counter while fn StringIsEqual( mid( string, i + rl, 1), ch ) rl ++ // Same char, so increase counter wend if rl == 1 then t = @"" else t = fn StringWithFormat( @"%d", rl ) // Counter as string, don't encode 1's t = fn StringByAppendingString( t, ch ) // Add character s = fn StringByAppendingString( s, t ) // Add to already encoded string i += rl - 1 // Move index next print s end fn local fn decode( string as CFStringRef ) CFStringRef ch, s, t // character, outputstring, temporary string Short i, rl // index, run length s = @"" // Initalize the output string for i = 0 to len( string ) - 1 // Decode input string char by char ch = mid( string, i, 1 ) // Read character at index if intval( ch ) == 0 // Not a digit rl = 1 else rl = intval( mid( string, i ) ) // Read run-length i += fix( log10( rl ) + 1 ) // Move index past digits ch = mid( string, i, 1 ) // Read character after run length end if t = fn StringByPaddingToLength( ch, rl, ch, 0 ) // Assemble temp string s = fn StringByAppendingString( s, t ) // Add to decoded string next print s end fn local fn decode2D( string as CFStringRef ) // For Conway's Game of Life objects Boolean a(500, 500) // Or larger to hold bigger life forms CFStringRef ch Short i, j, rl, f // Decoded char Short v = 0, w = 0, x = 0, y = 0 // Temp width, max width, array coordinates for i = 0 to len( string ) - 2 // Final char is always ! ch = mid( string, i, 1 ) if intval( ch ) == 0 rl = 1 else rl = intval( mid( string, i ) ) i += fix( log10( rl ) + 1 ) ch = mid( string, i, 1 ) end if select ch // Decode character as: case @"$" : f = -1 // - new line case @"b" : f = 0 // - dead case @"o" : f = 1 // - live case else : // Ignore end select for j = 1 to rl // Fill array with run of chars if f = -1 x = 0 : y ++ : v = 0 // New line else a(x, y) = f x ++ : v ++ : if v > w then w = v end if next next for j = 0 to y : for i = 0 to w - 1 print a(i, j); next : print : next end fn fn decode( @"12W1B12W3B24W1B14W" ) // Assignment fn encode( @"WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW" ) fn decode2D( @"bo$2bo$3o!" ) // Glider handleevents // Join Mac event loop