<s> import numpy <EOL> import time <EOL> MULT = [ [ <NUM_LIT:1> , <NUM_LIT:0> , <NUM_LIT:0> , - <NUM_LIT:1> , - <NUM_LIT:1> , <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:1> ] , <EOL> [ <NUM_LIT:0> , <NUM_LIT:1> , - <NUM_LIT:1> , <NUM_LIT:0> , <NUM_LIT:0> , - <NUM_LIT:1> , <NUM_LIT:1> , <NUM_LIT:0> ] , <EOL> [ <NUM_LIT:0> , <NUM_LIT:1> , <NUM_LIT:1> , <NUM_LIT:0> , <NUM_LIT:0> , - <NUM_LIT:1> , - <NUM_LIT:1> , <NUM_LIT:0> ] , <EOL> [ <NUM_LIT:1> , <NUM_LIT:0> , <NUM_LIT:0> , <NUM_LIT:1> , - <NUM_LIT:1> , <NUM_LIT:0> , <NUM_LIT:0> , - <NUM_LIT:1> ] ] <EOL> MAP_SIZE = [ <NUM_LIT> , <NUM_LIT> ] <EOL> BUFFER_MOD = <NUM_LIT> <EOL> WORLD_INFO = { } <EOL> WORLD_INFO [ '<STR_LIT>' ] = [ ] <EOL> for x in range ( <NUM_LIT> ) : <EOL> _y = [ ] <EOL> for y in range ( <NUM_LIT> ) : <EOL> _y . append ( <NUM_LIT:0> ) <EOL> WORLD_INFO [ '<STR_LIT>' ] . append ( _y ) <EOL> for i in range ( <NUM_LIT:0> , <NUM_LIT> ) : <EOL> if i % <NUM_LIT:3> : <EOL> WORLD_INFO [ '<STR_LIT>' ] [ <NUM_LIT:10> ] [ i ] = <NUM_LIT:1> <EOL> def draw ( los_map ) : <EOL> for y in range ( <NUM_LIT> ) : <EOL> _x = '<STR_LIT>' <EOL> for x in range ( <NUM_LIT> ) : <EOL> if ( x , y ) == ( <NUM_LIT:20> , <NUM_LIT:20> ) : <EOL> _x += '<STR_LIT:X>' <EOL> elif WORLD_INFO [ '<STR_LIT>' ] [ x ] [ y ] : <EOL> _x += '<STR_LIT:#>' <EOL> else : <EOL> if los_map [ x , y ] : <EOL> _x += str ( int ( los_map [ x , y ] ) ) <EOL> else : <EOL> _x += '<STR_LIT:U+0020>' <EOL> print _x <EOL> def light ( los_map , world_pos , size , row , start_slope , end_slope , xx , xy , yx , yy ) : <EOL> if start_slope < end_slope : <EOL> return False <EOL> x , y = world_pos <EOL> _next_start_slope = start_slope <EOL> for i in range ( row , size ) : <EOL> _blocked = False <EOL> _d_x = - i <EOL> _d_y = - i <EOL> while _d_x <= <NUM_LIT:0> : <EOL> _l_slope = ( _d_x - <NUM_LIT:0.5> ) / ( _d_y + <NUM_LIT:0.5> ) <EOL> _r_slope = ( _d_x + <NUM_LIT:0.5> ) / ( _d_y - <NUM_LIT:0.5> ) <EOL> if start_slope < _r_slope : <EOL> _d_x += <NUM_LIT:1> <EOL> continue <EOL> elif end_slope > _l_slope : <EOL> break <EOL> _sax = _d_x * xx + _d_y * xy <EOL> _say = _d_x * yx + _d_y * yy <EOL> if ( _sax < <NUM_LIT:0> and abs ( _sax ) > x ) or ( _say < <NUM_LIT:0> and abs ( _say ) > y ) : <EOL> _d_x += <NUM_LIT:1> <EOL> continue <EOL> _a_x = x + _sax <EOL> _a_y = y + _say <EOL> if _a_x >= MAP_SIZE [ <NUM_LIT:0> ] or _a_y >= MAP_SIZE [ <NUM_LIT:1> ] : <EOL> _d_x += <NUM_LIT:1> <EOL> continue <EOL> _rad2 = size * size <EOL> if ( _d_x * _d_x + _d_y * _d_y ) < _rad2 : <EOL> los_map [ _a_x , _a_y ] = <NUM_LIT:1> <EOL> _solid = WORLD_INFO [ '<STR_LIT>' ] [ _a_x ] [ _a_y ] <EOL> if _blocked : <EOL> if _solid : <EOL> _next_start_slope = _r_slope <EOL> _d_x += <NUM_LIT:1> <EOL> continue <EOL> else : <EOL> _blocked = False <EOL> start_slope = _next_start_slope <EOL> elif _solid : <EOL> _blocked = True <EOL> _next_start_slope = _r_slope <EOL> light ( los_map , world_pos , size , i + <NUM_LIT:1> , start_slope , _l_slope , xx , xy , yx , yy ) <EOL> _d_x += <NUM_LIT:1> <EOL> if _blocked : <EOL> break <EOL> def los ( start_position , distance ) : <EOL> _los = numpy . zeros ( ( distance * <NUM_LIT:2> , distance * <NUM_LIT:2> ) ) <EOL> for i in range ( <NUM_LIT:8> ) : <EOL> light ( _los , start_position , distance , <NUM_LIT:1> , <NUM_LIT:1.0> , <NUM_LIT:0.0> , MULT [ <NUM_LIT:0> ] [ i ] , <EOL> MULT [ <NUM_LIT:1> ] [ i ] , MULT [ <NUM_LIT:2> ] [ i ] , MULT [ <NUM_LIT:3> ] [ i ] ) ; <EOL> return _los <EOL> _start_time = time . time ( ) <EOL> _los = los ( ( <NUM_LIT:20> , <NUM_LIT:20> ) , <NUM_LIT:20> ) <EOL> print time . time ( ) - _start_time <EOL> draw ( _los ) </s>
