Compare commits
2
Commits
3e711561fa
...
d511a8cd65
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d511a8cd65 | ||
|
|
944fad0f02 |
@@ -0,0 +1,150 @@
|
|||||||
|
/----------------------\ /--------------------------\
|
||||||
|
| /+------------------------------------------------------------------------------+-------------\ |
|
||||||
|
| /--++--------------------------------------------------------\ | | |
|
||||||
|
| | /++--------------------------------------------------------+---------------------+-------\ | |
|
||||||
|
| /----------------+-+++--------\ /---------------------------------------------+---------------------+\ | | |
|
||||||
|
| | | ||| | | /+---------------------++------+-----+-----------\|
|
||||||
|
/----+-+-\ | ||| | | /----------------------------++---------------------++---\ | | ||
|
||||||
|
| | | |/-------------+-+++--------+-+---------------+--->------------------------++--\ /------------++---+--+-----+---------\ ||
|
||||||
|
| | | || /-------+-+++--------+-+---------------+----------------------------++--+-----+-----\ || | | | | ||
|
||||||
|
/+----+-+-++-----+-------+-+++--------+-+---------------+----------------------------++--+--\ | | || | | | | ||
|
||||||
|
|| |/+-++-----+-------+-+++--------+-+---------------+----------------------------++--+--+--+-----+-\ || | | | | ||
|
||||||
|
/-----++----+++\|| | | ||| | | | || | | | | | || | | /--+---------+-++----\
|
||||||
|
| || |||||| | | ||| | | /--+----------------------------++--+--+--+-----+-+----++---+--+--+--+------\ | || |
|
||||||
|
| || |||||| | | ||| | | /--------+\ | /---------------------++--+--+--+-----+-+----++---+--+--+--+------+--+-++---\|
|
||||||
|
| || ||||||/----+-------+-+++--------+-+---+--------++-+------+---------------------++--+--+--+-----+-+----++---+\ | | | | | || ||
|
||||||
|
| || |||||||/---+-------+-+++--------+-+---+--------++-+------+----------------\ || | | | | | || || | | | | | || ||
|
||||||
|
| || |||||||| | | ||| | | | || | | | || | | | | | /-++---++-+--+--+------+--+-++-\ ||
|
||||||
|
| /--++----++++++++---+-------+-+++--\ /-+-+---+--------++-+------+----------------+----++--+--+\ | | | | || || | | | | | || | ||
|
||||||
|
/+--+--++----++++++++---+-------+-+++--+---+-+-+---+--------++-+------+----------------+-\ || | || | | | | || || | | | | | || | ||
|
||||||
|
|| | || |||||||| | | ||| | | | | | || | | | | ||/-+--++-+-----+-+--+-++\ || | | | | | || | ||
|
||||||
|
|| | || |||||||| | | ||| | | | | | || | | /--------+-+--+++-+--++\| | | | ||| || | | | | | || | ||
|
||||||
|
|| | || |||||||| | | ||| | | | | | || | | | | | ||| | |||| | | | ||| || | | | | | || | ||
|
||||||
|
|| | || |||||^|| \-------+-+++--+---+-+-+---+--------++-+------+-------+--------+-+--+++-+--++++-----/ | | ||| || | | | | | || | ||
|
||||||
|
|| | \+-<--++++++++-----------+-+++--+---+-+-+---+--------++-+------+-------+--------+-+--+++-+--/||| | | ||| || | | | | | || | ||
|
||||||
|
|| | | |||||||| /----+-+++--+---+-+-+---+--------++-+----\ | | | | ||| | |||/------+--+-+++--++-+--+--+------+--+\|| | ||
|
||||||
|
|| | | |||||||| | | |||/-+---+-+-+---+--------++-+----+-+-------+--------+-+--+++-+---++++------+--+-+++--++-+--+--+------+-\|||| | ||
|
||||||
|
|| | | |||||||| | | |||| | /+-+-+---+--------++-+----+-+-------+--------+-+--+++-+---++++------+--+-+++--++-+--+--+--\ | ||||| | ||
|
||||||
|
|| | | |||||||| | | \+++-+--++-+-+---+--------++-+----+-+-------+--------+-+--+++-+---++++------+--+-+++--++-/ | | | | ||||| | ||
|
||||||
|
|| | | |||||||| | | ||| |/-++-+-+---+--------++-+----+\| | | | ||| | |||| | | ||| || | | | | ||||| | ||
|
||||||
|
|| |/--+----++++++++---->-+----+--+++-++-++-+-+---+--------++-+---\||| | | | ||| | |||| |/-+-+++--++----+--+\ | | ||||| | ||
|
||||||
|
|| || | |||||||| /+----+--+++-++-++-+-+---+--------++-+---++++-------+--------+-+--+++-+---++++------++-+-+++--++---\| || | | ||||| | ||
|
||||||
|
|| || | |||||||| || | /+++-++-++\| | | || ^ |||| | | | ||| | ||||/-----++-+-+++--++---++--++-+---+\||||| | ||
|
||||||
|
|| || |/---++++++++-----++----+-++++-++-++++-+---+--------++-+---++++-------+--------+-+--+++-+\/-+++++-----++-+-+++--++---++\ || | ||||||| | ||
|
||||||
|
|| || || |||||||| || | |||| || |||| | | || | |||| | | | ||| ||| ||||| || | ||| || ||| || | ||||||| | ||
|
||||||
|
|| || || |||||||| || | |||| || ||||/+---+--------++-+---++++-------+--------+-+\ ||| ||| ||||| || | ||| || ||| || | ||||||| | ||
|
||||||
|
|| || /++---++++++++-----++----+-++++-++-++++++---+--------++-+---++++-------+--------+-++-+++-+++-+++++\ || | ||| || ||| || | ||||||| | ||
|
||||||
|
|| || ||| |||||||| || |/++++-++-++++++---+--------++\| |||| | |/++-+++-+++-++++++--\ || | ||| || ||| || | ||||||| | ||
|
||||||
|
|| || ||| |||||||| || |||||| || |||||| | |||| |||| \--------++++-+++-+++-+/|||| | || | ||| || ||| || | ||||||| | ||
|
||||||
|
|\--++-+++---+++/|||| || |||||| || |||||| | |||| |||| /--------------++++-+++-+++-+-++++--+-++-+-+++--++---+++-++-+\ ||||||| | ||
|
||||||
|
| \+-+++---+++-++++-----++----++++++-/| |||||| | |||| |||| | |||| ||| ||| | |||| | || | ||| || ||| || || ||||||| | ||
|
||||||
|
| | ||| ||| |||| || |||||| /+-++++++---+--------++++---++++-+--------------++++-+++-+++-+-++++--+\|| | ||| || ||| || || ||||||| | ||
|
||||||
|
| | ||| |\+-++++-----++----++++++-++-++++++---+--------++++---++++-+--------------++++-+++-+++-+-++++--++/| | ||| || ||| || || ||||||| | ||
|
||||||
|
| | ||| | | |||| ||/---++++++-++-++++++---+--------++++---++++-+------------\ |||| ||| ||| | ||\+--++-+-+-+++--++---+++-++-++--+/||||| | ||
|
||||||
|
| | ||| | | |||| ||| |||||| || |||||| | /------++++---++++-+------------+-++++-+++-+++-+-++-+--++-+-+-+++--++--\||| || || | ||||| | ||
|
||||||
|
/+----+-+++---+\| |||| ||| |||||| || |||||| | | |||| |||| | | |||| ||| ||| | |\-+--++-+-+-+++--++--++++-++-++--+-++/|| | ||
|
||||||
|
|| | ||| ||| |||| ||| |||||| || |||||| \-+------+/|\---++++-+------------+-++++-+++-+++-+-+--+--++-+-+-+++--/| |||| || || | || || | ||
|
||||||
|
|| /-+-+++---+++-++++-\ ||| |||||| |\-++++++-----+------+-+----++/| | /----+-++++-+++-+++-+-+--+--++-+-+\||| | |||| || || | || || | ||
|
||||||
|
|| | | ||| ||| |||| | ||| |||||| | ||||\+-----+------+-+----++-+-+-------+----+-+++/ ||| ||| | |/-+--++-+-+++++--\| |||| || || | || || | ||
|
||||||
|
|| | | ||| ||| |||| | ||| |||||| | |||| | | | | || | | | | ||| ||| ||| | || | || | ||||| || |||| || || | || || | ||
|
||||||
|
|| |/+-+++---+++-++++-+---+++---++++++-+--++++-+-----+------+-+----++-+-+-------+---\| ||| ||\-+++-+-++-+--++-+-++++/ || |||| || || | || || | ||
|
||||||
|
|| ||| ||\---+++-++++-+---+++---++++++-+--++++-+-----+------+-+----++-+-+-------+---++-+++--++--+/| | \+-+--++-+-++++---++--++++-++-++--+-+/ || | ||
|
||||||
|
|| ||| ||/---+++-++++-+---+++---++++++-+--++++-+-----+------+-+----++-+-+-----<-+---++-+++--++-\| | | | | || | ||\+---++--++++-++-++--+-+--+/ | ||
|
||||||
|
|| ||| ||| ||| |||| | ||| |||||| | |||| | | | | || | | | || ||| ||/++-+-+--+-+--++-+-++-+---++\ |||| || || | | | | ||
|
||||||
|
|| ||| ||| \++-++++-+---+++---++++/| | ||||/+-<---+------+-+----++-+-+-------+---++-+++--+++++-+\| | | || | || | ||| |||| || || | | | | ||
|
||||||
|
|| ||| ||| || |||| | ||| |||| | | |||||| | | | /-++-+-+-------+---++-+++--+++++-+++--+-+-\|| | || | ||| |||| || || | | | | ||
|
||||||
|
|| ||| ||| || |||| | ||| |||| | | |||||| | | | | || | | | || |\+--+++++-+++--+-+-+/|/+-++-+---+++-++++-++-++--+-+\ | | ||
|
||||||
|
|| ||| ||| || |||| | ||| |||| | | |||||| | | | | || | | ^ || | | ||||| ||| | | | ||| || | ||| |||| || || | || | | ||
|
||||||
|
|| ||| ||| || |||| | ||| |||| | | |||||| /--+------+-+--+-++-+-+-------+---++-+-+--+++++-+++--+-+-+-+++-++-+---+++-++++-++-++\ | || | | ||
|
||||||
|
|| ||| ||| || |||| | ||| |||| | | |||||| | | | | | || | | \---++-+-+--+++++-+++--+-+-+-+++-+/ | ||| |||| || ||| | || | | ||
|
||||||
|
|\--+++-+++----++-++++-+---+++---++++-+-+--++++++--+--+------+-+--+-++-+-+-----------++-+-/ ||||| ||| | | | ||| | | ||| |||| || ||| | || | | ||
|
||||||
|
| ||| ||| || |||| | ||| |||| | | |||||| | /+------+\| | || | | || | ||||| ||| | | | ||| | | ||| |||| || ||| | || | | ||
|
||||||
|
| ||| ||| || |||| | ||| |||| | | |||||| | || ||| | || | |/----------++-+----+++++-+++--+-+-+-+++-+--+---+++-++++-++\||| | || | | ||
|
||||||
|
| ||\-+++----++-++++-+---+++---++++-+-+--++++++--+-++------+++--+-/| | || || | ||||| ||| | | | |||/+--+---+++-++++-++++++-+-++-+--+\||
|
||||||
|
|/--++--+++----++-++++-+\ ||| |||| | |/-++++++--+-++------+++--+--+-+-++----------++-+----+++++-+++--+-+-+-+++++--+---+++-++++<++++++-+-++-+\ ||||
|
||||||
|
|| || ||| /-++-++++-++--+++---++++-+-++-++++++--+-++------+++--+--+-+-++----------++-+----+++++-+++--+-+-+-+++++--+\ ||| |||| |||||| | || || ||||
|
||||||
|
|| || ||| | || ||||/++--+++---++++-+-++-++++++--+-++------+++--+--+-+-++----------++-+----+++++-+++--+-+-+\||||| || ||| |||| |||||| | || || ||||
|
||||||
|
||/-++--+++--+-++-+++++++--+++---++++-+\|| |||||\--+-++------+++--+--+-+-++----------++-+----+++++-+++--+-+-+++++++--/| ||| |||| |||||| | || || ||||
|
||||||
|
||| || ||| | || ||||||| ||| |||| |||| ||||| /-+-++------+++--+--+-+-++--------\ || | ||||| ||| | | ||||||| /+--+++-++++-++++++-+-++-++\||||
|
||||||
|
||| || ||| | || ||||||| ||| |||| |||| ||||| | | || ||| | | | || | || | ||||| ||| | | ||||||| || ||| |||| |||||| | || |||||||
|
||||||
|
||| || ||| | || ||||||| |\+---++++-++++-+++++-+-+-++------+++--+--/ | || /---+-++-+----+++++-+++--+-+-+++++++--++--+++-++++\|||||| | || |||||||
|
||||||
|
||| || ||| | || ||\++++--+-+---++++-++++-+++++-+-+-++------+++--+----+-++----+---+-++-+----+++++-+++--+-+-+++++++--++--+/| ||||||||||| | || |||||||
|
||||||
|
||| || ||| | || || |||| | | |||| |||| \++++-+-+-++------+++--+----+-++----+---+-++-+----+++++-+++--+-+-+++++++--++--+-+-++++++++/|| | || |||||||
|
||||||
|
||| || ||| | || || |v|| | | /++++-++++--++++-+-+-++------+++--+----+-++-\ | | || | ||||| ||| | | ||||||| || | | |||||||| || | || |||||||
|
||||||
|
||v || /+++--+-++-++-++++--+-+--+++++-++++--++++-+-+-++------+++--+----+-++-+--+---+-++-+----+++++-+++--+-+\||||||| || | | |||||||| || | || |||||||
|
||||||
|
||| || |||| | || || |||| | | ||||| |||| |||| | | || ||| |/---+-++-+-\| | || | ||||| ||| | ||||||||| || | | |||||||| || | || |||||||
|
||||||
|
||| || |||| | || || |||| | | ||||| |||| |||| | | || ||| || | || | ||/--+-++-+----+++++-+++--+-+++++++++\ || | | |||||||| || | || |||||||
|
||||||
|
||| || |||| | || || |||| | | |||\+-++++--+/|| | | || ||| || \-++-+-+++--+-++-+----+++++-+++--+-++++++++++-++--+-+-++++++++-++-+-++-+++++/|
|
||||||
|
||| || |||| | || || |||| | | ||| | |||| | || | | || ||| || || | ||| | || | ||||| ||| | |||||||||| \+--+-+-++++++++-++-+-++-++/|| |
|
||||||
|
||| || |||| \-++-++-++++--+-+--+++-+-++++--+-++-+-+-++------+++--++-----++-+-+++--+-++-+----+++++-+++--+-++++++++++--/ | | ||\+++++-++-+-++-++-++-/
|
||||||
|
||| || |||| || || |||| | | ||| | \+++--+-++-+-+-++------+++--++-----++-+-+++--+-++-+----+++++-+++--+-++++++++++-----+-+-++-+++++-++-+-/| || ||
|
||||||
|
||| || |||| ||/++-++++--+-+--+++-+--+++--+-++-+-+-++------+++--++-----++-+-+++--+-++-+----+++++-+++--+-++++++++++-----+-+\|| ||||| || | | || ||
|
||||||
|
||| || |||\----+++++-++++--+-+--+++-+--+++--+-++-+-+-++------+++--++-----++-+-+++--+-++-+----+++/| ||| | |||||||||| | |||| ||||| || | | || ||
|
||||||
|
||| || ||| ||||| |||| | | ||| | ||| | || | | || ||| || || | ||| | || | ||| | ||| \-++++++++++-----/ |||| ||||| || | | || ||
|
||||||
|
|\+-++-+++-----+++++-+++/ | | ||| | ||\--+-++-+-+-++------+++--++-----++-+-+++--+-++-+----+++-+-+++----++++++++++-------++++-+++++-++-+--+-+/ ||
|
||||||
|
| | || ||| ||||| ||| | | ||| | || | || | | || ||| || || | |||/-+-++-+----+++-+-+++----++++++++++-------++++-+++++-++-+\ | | ||
|
||||||
|
| | || ||| ||||| ||| /-+-+--+++-+--++\ | || | | || /----+++--++-----++-+-++++-+-++-+----+++-+-+++----++++++++++-------++++-+++++-++-++-+-+--++-\
|
||||||
|
| | || ||| ||||| ||| | | | ||| | ||| | || | | || | ||| || || | |||| | || | \++-+-+++----++++++++++-------++++-+++++-++-++-+-/ || |
|
||||||
|
| | || ||\-----+++/| ||| | | | ||| | ||| | || | | || | ||| || || | |||| | || | |\-+-+++----++++++++++-------/||| ||||| || || | || |
|
||||||
|
| | || || /---+++-+-+++-+-+-+--+++-+--+++--+-++-+-+-++-+----+++--++-----++-+-++++-+-++-+-----+--+-+++----++++++++++--\ ||| ||||| || || | || |
|
||||||
|
\-+-++-++--+---/|| | ||| | | | ||| | ||| | || | | || | ||| || || | |||| | || | | | \++----++++++++++--+-----+++-/|||| || || | || |
|
||||||
|
| || || | || | ||| | | | ||| | ||| | || | | || | ||| || || | |||| | || | | | || |||||||||| | ||| |||| || || | || |
|
||||||
|
| || || | \+-+-+++-+-+-+--+++-+--+++--+-/| | | || | ||| || || | |||| | || | | | ||/---++++++++++--+-----+++--++++-++-++-+\ || |
|
||||||
|
| || || /+-----+-+-+++-+-+-+--+++-+--+++--+--+-+-+-++-+----+++-\|| || | |||| | || | | | ||| |||||||||| | ||| ||^| || || || || |
|
||||||
|
| || || || | | ||| | | | ||| | ||| | | | | || | ||| ||| || | |||| | || | | | ||| |||||||||| | ||| |||| || || || || |
|
||||||
|
| || || || | | ||| | | | ||| | ||| | | | | || | ||| ||| || | ||||/+-++-+-----+--+-\||| |||||||||| | ||| |||| || || || || |
|
||||||
|
/-+-++-++-++-----+-+-+++-+-+-+--+++-+--+++--+--+-+-+-++\| ||| ||| || | |||\++-++-+-----+--+-++++---++++++++++--+-----+++--++++-++-+/ || || |
|
||||||
|
| | ||/++-++-----+-+-+++-+-+-+--+++-+--+++--+--+-+-+-++++----+++-+++\ || | ||| || || | | | |||| |||||||||| | ||| |||| || | || || |
|
||||||
|
| | ||||| || | | ||| | |/+--+++-+--+++--+--+-+-+-++++----+++-++++----++-+-+++-++-++-+-----+--+-++++---++++++++++--+-----+++-\|||| || | || || |
|
||||||
|
| | |||||/++-----+-+-+++\| ||| ||| \--+++--+--+-+-+-++++----+++-++++----++-+-+++-++-++-+-----+--+-++++---++++++++++--+-----+++-++/|| || | || || |
|
||||||
|
| | |||||||| | | ||||| ||| |\+----+++--+--+-+-+-++++----+++-++++----++-+-+++-++-++-+-----/ | |||| ||||||||\+--+-----+++-++-++-++-+--++---/| |
|
||||||
|
| | |||||||| | | ||||| ||| | | ||| | | | | |||| ||| |||| || | ||| || || | | |||| |||||||| | | ||| || || || | || | |
|
||||||
|
| | |||||||| | | ||||| ||| | | ||| | | | | |||| \++-++++--->++-+-+++-++-++-+--------+-++++---++++++++-+--+-----+++-++-++-++-/ || | |
|
||||||
|
| | |||||||| | | ||||| ||| | | /-+++--+--+-+-+-++++-----++-++++\ || | ||| || || | | |||| |||||||| | | ||| || || || || | |
|
||||||
|
| | |||||||| | | ||||| ||| | | | ||| | | | | |||| || ||||| || | ||| || || | | |||| |||||||| | | ||| || || || || | |
|
||||||
|
| | |||||||| | | ||||| ||| \-+--+-+++--+--+-+-+-++++-----++-+++++>--++-/ ||| || || | | |||| |||||||| | | ||| || || || || | |
|
||||||
|
| | |||||||| | | ||||| ||| /+--+-+++--+--+\| | |||| || ||||| || ||| || || | | |||\---++++++++-+--+-----+++-++-++-++----+/ | |
|
||||||
|
| \-++++++++-----+-+-+++++-+++---++--+-/|| | ||| | |||| || ||||| /++---+++-++-++-+--------+\||| |||||||| | | ||| || || || | | |
|
||||||
|
| |||||||| | | ||||| ||| || | || | \++-+-++++-----++-+++++--+++---+++-++-++-+--------+++/| |||||||| | | ||| || || || | | |
|
||||||
|
| ||||||\+-----+-+-+++++-+++---++--+--++--+---++-+-++++-----++-/|||| ||| ||| || ||/+--------+++-+----++++++++-+--+-----+++-++-++-++----+\ | |
|
||||||
|
| |||||| | | \-+++++-+++---++--+--++--+---++-+-++++-----++--++++--+++---+++-++-++++--------/|| | ||||||\+-+--+-----+++-++-/|/++----++\ | |
|
||||||
|
| |||||| | | ||||| ||| || | \+--+---++-+-++++-----++--++++--+++---+++-++-++++---------++-+----++++/| | | | ||| || |||| ||| | |
|
||||||
|
| |||||| | | ||||| ||| || | | | || | |||| || |||| |\+---+++-++-++++---------++-+----++++-+-+-+--+-----+++-++--++/| ||| | |
|
||||||
|
| |||||| | /+---+++++-+++---++--+---+--+---++-+-++++-----++--++++--+-+---+++-++-++++---------++-+----++++-+-+-+--+\ ||| || || | ||| | |
|
||||||
|
| |||||\-+----++---+++/| ||| || | | | || | |||| || |||| | | ||| || |||| || | |||| | | | || ||| || || | ||| | |
|
||||||
|
| ||||| | /-++---+++-+-+++---++--+---+--+---++-+-++++-----++--++++-\| \---+++-++-++++---------++-+----++++-+-+-+--++----+++-++--/| | ||| | |
|
||||||
|
| ||||| | | || ||| | ||\---++--+---+--+---++-+-++++-----++--++++-++-----+++-++-+/|| || | /-++++-+-+-+--++----+++-++---+-+----+++-\ | |
|
||||||
|
| ||||| | | || ||| | || \+--+---+--+---/| | |||| || |||| || ||| || | || || | | |||| | | | || /+++-++---+-+----+++-+-+\|
|
||||||
|
| ||||| | | || ||| | || | | | | | | |||| || |||| || ||| \+-+-++---------+/ | | |||| | | | || |||| || | | ||| | |||
|
||||||
|
| ||||| | | || ||| | |\-----+--+---+--+----+-+-++++-----++--++++-++-----+++--+-+-++---------+--+--+-++++-+-+-+--++---++++-/| | | ||| | |||
|
||||||
|
| ||||| | | || ||| | \------+--+---+--+----+-+-++++-----++--++++-++-----+++--+-+-++---------+--+--+-++++-+-+-+--++---+++/ | | | ||| | |||
|
||||||
|
| ||||| | | || \++-+--------+--+---+--+----+-+-++++-----++--++++-++-----+++--+-+-+/ | | | |||| |/+-+--++---+++---+--\| | ||| | |||
|
||||||
|
\---+++++--+--+-++----++-+--------+--+---+--+----+-+-++/| || |||| || ||| | | | | | | |||| ||| | || ||| | || | ||| | |||
|
||||||
|
||||| | | || || \--------+--+---/ | | | || | || |||| || ||| | | \----------+--+--+-++++-+++-+--++---+++---+--++-+----+/| | |||
|
||||||
|
||||| | | || /--++----------+--+--\ | | \-++-+-----++--++++-++-----+++--+-+------------+--+--+-++++-+++-+--++---+++---+--++-/ | | | |||
|
||||||
|
||||| | | || | || | | | \----+---++-+-----++--++++-++-----+++--+-+------------+--/ | |||| ||| | || ||| | || | | | |||
|
||||||
|
||||| | | || | || | | | | |\-+-----++--++++-++-----+++--+-+------------+-----+-++++-+++-+--++---++/ | || | | | |||
|
||||||
|
||||| \--+-++-+--++----------+--+--+--------+---+--+-----++--++++-++-----+++--+-+------------+-----+-++++-+++-+--/| || | || | | | |||
|
||||||
|
|\+++-----+-++-+--++----------+--+--+--------+---+--+-----++--++++-++-----+++--+-/ | | |||| ||| | | || | || | | | |||
|
||||||
|
| ||| /--+-++-+--++----------+--+--+--------+---+--+-----++--++++-++-----+++\ | | | |||| ||| | | || | || | | | |||
|
||||||
|
| ||| | | || | || | | | | | \-----++--++++-++-----++++-+--------------+-----+-++++-+++-+---+---++----+--++------+-+-+-++/
|
||||||
|
| ||| | | || |/-++----------+--+--+--------+---+----\ || |||| || |||| | | | |||| ||| | | || v || | | | ||
|
||||||
|
| ||| | | || || || | | | \---+----+---++--++++-++-----++++-/ | | |||| ||| | | || | || | | | ||
|
||||||
|
/--+-+++--+-\| || || || | | | | | || |||| || |||| | | |||| ||| | | || | || | | | ||
|
||||||
|
| | ||| | || || \+-++----------+->+--/ | | || |\++-++-----/||| | | |||| ||| | | || | || | | | ||
|
||||||
|
| | ||| | || || | || | | | | || | || || ||| /+-----+-++++-+++-+---+---++----+--++------+-+-+-++\
|
||||||
|
| | ||\--+-++-++--+-++--->------+--+---------------+----+---++--+-++-++------+++---------------++-----+-/||| ||| | | || | || | | | |||
|
||||||
|
| | || | || || | || \--+---------------+----+---+/ | || || ||| || | ||| |\+-+---+---++----+--/| | | | |||
|
||||||
|
| | || | || || | \+-------------+---------------+----+---+---+-++-++------+++---------------++-----+--++/ | | | | || | | | | | |||
|
||||||
|
| | || | |\-++--+--+-------------+---------------+----+---+---+-++-/| |\+---------------++-----+--++--+-+-/ | || | \------+-/ | |||
|
||||||
|
| | || | | || | | | | | | | || \------+-+---------------+/ | || | | | || | | | |||
|
||||||
|
| \-++---+-+--++--+--/ \---------------+----+---+---+-+/ | | | \--++--+-+-----+---++----+----------+---/ |||
|
||||||
|
| |\---+-+--++--+--------------------------------+----+---+---+-+----------+-+---------------+---------/| | \-----+---++----+----------+-----/||
|
||||||
|
\----+----+-/ || | \----+---/ | | | | | | | | || | | ||
|
||||||
|
| | || | | \-+----------+-+---------------+----------/ | | || | | ||
|
||||||
|
| | \+--+-------------------------------------+---------+----------+-+---------------+-------------+-------/ \+----+----------+------/|
|
||||||
|
| | \--+-------------------------------------+---------+----------+-+---------------+-------------+------------/ | | |
|
||||||
|
| \--------+-------------------------------------+---------+----------+-/ | | | | |
|
||||||
|
| \-------------------------------------/ | \-----------------+-------------+-----------------/ | |
|
||||||
|
| | | \----------------------------/ |
|
||||||
|
\-------------------------------------------------------------/ \--------------------------------------------------/
|
||||||
+234
-48
@@ -21,6 +21,7 @@ struct Cart: Equatable, Comparable {
|
|||||||
var loc = GridPoint(X: 0, Y: 0)
|
var loc = GridPoint(X: 0, Y: 0)
|
||||||
var dir = Direction.up
|
var dir = Direction.up
|
||||||
var intersection = Sequence.left
|
var intersection = Sequence.left
|
||||||
|
var removed = false
|
||||||
var dirValue: (Int, Int) {
|
var dirValue: (Int, Int) {
|
||||||
get {
|
get {
|
||||||
switch dir {
|
switch dir {
|
||||||
@@ -39,12 +40,10 @@ struct Cart: Equatable, Comparable {
|
|||||||
|
|
||||||
mutating func changeDirection(with map: Character) {
|
mutating func changeDirection(with map: Character) {
|
||||||
func rotateRight() { dir = Direction(rawValue: dir.rawValue + 1) ?? Direction.up }
|
func rotateRight() { dir = Direction(rawValue: dir.rawValue + 1) ?? Direction.up }
|
||||||
func rotateLeft() { dir = Direction(rawValue: dir.rawValue - 1) ?? Direction.up }
|
func rotateLeft() { dir = Direction(rawValue: dir.rawValue - 1) ?? Direction.left }
|
||||||
func increaseSequence() { intersection = Sequence(rawValue: intersection.rawValue + 1) ?? Sequence.left }
|
func increaseSequence() { intersection = Sequence(rawValue: intersection.rawValue + 1) ?? Sequence.left }
|
||||||
|
|
||||||
// No change
|
|
||||||
if map == "-" || map == "|" { return }
|
if map == "-" || map == "|" { return }
|
||||||
// Execute intersection sequence
|
|
||||||
if map == "+" {
|
if map == "+" {
|
||||||
switch intersection {
|
switch intersection {
|
||||||
case .left : rotateLeft()
|
case .left : rotateLeft()
|
||||||
@@ -54,7 +53,6 @@ struct Cart: Equatable, Comparable {
|
|||||||
increaseSequence()
|
increaseSequence()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// Turn to follow curve
|
|
||||||
switch dir {
|
switch dir {
|
||||||
case .up, .down :
|
case .up, .down :
|
||||||
if map == "/" { rotateRight() }
|
if map == "/" { rotateRight() }
|
||||||
@@ -86,21 +84,142 @@ struct Cart: Equatable, Comparable {
|
|||||||
// 1. '<' or '>' => '-'
|
// 1. '<' or '>' => '-'
|
||||||
// 2. '^' or 'v' => '|'
|
// 2. '^' or 'v' => '|'
|
||||||
class Madness {
|
class Madness {
|
||||||
|
var track: [[Character]] = []
|
||||||
|
var width = 0
|
||||||
|
var height = 0
|
||||||
var carts: [Cart] = []
|
var carts: [Cart] = []
|
||||||
|
|
||||||
|
// Supply filename for input ex: '/home/peterr/AOC2018/Sources/AOC2018/data/day13.txt'
|
||||||
|
init(withFile filename: String) {
|
||||||
|
let trackFile = Tools.readFile(fromPath: filename)
|
||||||
|
var trackStrings = trackFile.components(separatedBy: "\n")
|
||||||
|
// This gurd statement is just an excuse to use guard
|
||||||
|
// I'm assuming the last string is an empty string, if not DON'T remove the last string
|
||||||
|
guard let lastStr = trackStrings.last, lastStr.count == 0 else { return }
|
||||||
|
trackStrings.removeLast() // empty string
|
||||||
|
parseData(withStars: trackStrings)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Supply test data in the form of a String
|
||||||
|
init(withString trackFile: String) {
|
||||||
|
let trackStrings = trackFile.components(separatedBy: "\n")
|
||||||
|
parseData(withStars: trackStrings)
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseData(withStars trackArray: [String]) {
|
||||||
|
guard trackArray.count > 0 else { print("Error Parsing"); return }
|
||||||
|
width = trackArray[0].count
|
||||||
|
height = trackArray.count
|
||||||
|
for line in trackArray {
|
||||||
|
track.append(Array(line))
|
||||||
|
}
|
||||||
|
|
||||||
|
func newCart(at loc: (Int, Int), with direction: Direction) {
|
||||||
|
carts.append(Cart(loc: GridPoint(X: loc.0, Y: loc.1), dir: direction, intersection: Sequence.left, removed: false))
|
||||||
|
switch direction {
|
||||||
|
case .up, .down : track[loc.1][loc.0] = "|"
|
||||||
|
case .left, .right: track[loc.1][loc.0] = "-"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for j in 0..<height {
|
||||||
|
for i in 0..<width {
|
||||||
|
switch track[j][i] {
|
||||||
|
case "^": newCart(at: (i, j), with: Direction.up)
|
||||||
|
case "v": newCart(at: (i, j), with: Direction.down)
|
||||||
|
case "<": newCart(at: (i, j), with: Direction.left)
|
||||||
|
case ">": newCart(at: (i, j), with: Direction.right)
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTrack(at loc: GridPoint) -> Character {
|
||||||
|
guard loc.X >= 0 && loc.Y >= 0 && loc.X < width && loc.Y < height else { print("getTrack out of range"); return "#" }
|
||||||
|
return track[loc.Y][loc.X]
|
||||||
|
}
|
||||||
|
|
||||||
|
func collision(removeCrash: Bool) -> GridPoint? {
|
||||||
|
var retVal: GridPoint? = nil
|
||||||
|
var dupTest: [GridPoint : Int] = [:]
|
||||||
|
for index in 0..<carts.count {
|
||||||
|
if !carts[index].removed {
|
||||||
|
if dupTest[carts[index].loc] != nil {
|
||||||
|
if removeCrash {
|
||||||
|
carts[index].removed = true
|
||||||
|
carts[dupTest[carts[index].loc]!].removed = true
|
||||||
|
} else {
|
||||||
|
return carts[index].loc
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
dupTest[carts[index].loc] = index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let notRemoved = carts.filter { $0.removed == false }
|
||||||
|
if notRemoved.count == 1 {
|
||||||
|
retVal = notRemoved[0].loc
|
||||||
|
}
|
||||||
|
return retVal
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start of Tick:
|
||||||
|
// 1. order carts by location
|
||||||
|
// 2. move cart one step in it's direction
|
||||||
|
// 3. Look to see where we landed
|
||||||
|
// a. other cart => CRASH
|
||||||
|
// b. '-' or '|' is a straight track => do nothing
|
||||||
|
// c. '\' => rotate right
|
||||||
|
// d. '/' => rotate left
|
||||||
|
// e. '+' => [Left, Straight, Right] sequense for this cart
|
||||||
|
func tick(andRemove remove: Bool) -> GridPoint? {
|
||||||
|
var collided: GridPoint? = nil
|
||||||
|
carts.sort()
|
||||||
|
for index in 0..<carts.count {
|
||||||
|
if !carts[index].removed {
|
||||||
|
carts[index].move()
|
||||||
|
collided = collision(removeCrash: remove)
|
||||||
|
if collided != nil && !remove {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
let track = getTrack(at: carts[index].loc)
|
||||||
|
carts[index].changeDirection(with: track)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return collided
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Day13: AOCDay {
|
class Day13: AOCDay {
|
||||||
lazy var tests: (() -> ()) = day13Tests
|
lazy var tests: (() -> ()) = day13Tests
|
||||||
lazy var final: (() -> ()) = day13Final
|
lazy var final: (() -> ()) = day13Final
|
||||||
|
|
||||||
|
let testData =
|
||||||
|
"/->-\\ \n" +
|
||||||
|
"| | /----\\\n" +
|
||||||
|
"| /-+--+-\\ |\n" +
|
||||||
|
"| | | | v |\n" +
|
||||||
|
"\\-+-/ \\-+--/\n" +
|
||||||
|
" \\------/ "
|
||||||
|
|
||||||
|
let testData2 =
|
||||||
|
"/>-<\\ \n" +
|
||||||
|
"| | \n" +
|
||||||
|
"| /<+-\\\n" +
|
||||||
|
"| | | v\n" +
|
||||||
|
"\\>+</ |\n" +
|
||||||
|
" | ^\n" +
|
||||||
|
" \\<->/"
|
||||||
|
|
||||||
func testCartMove() {
|
func testCartMove() {
|
||||||
var car = Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left)
|
var car = Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left, removed: false)
|
||||||
car.move()
|
car.move()
|
||||||
XCTAssertEqual(test: "testCartMove", withExpression: (car.loc.X == 10 && car.loc.Y == 9))
|
XCTAssertEqual(test: "testCartMove", withExpression: (car.loc.X == 10 && car.loc.Y == 9))
|
||||||
}
|
}
|
||||||
|
|
||||||
func testCartChangeDirection() {
|
func testCartChangeDirection() {
|
||||||
var car = Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left)
|
var car = Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left, removed: false)
|
||||||
car.move()
|
car.move()
|
||||||
car.changeDirection(with: "-")
|
car.changeDirection(with: "-")
|
||||||
car.move()
|
car.move()
|
||||||
@@ -128,67 +247,134 @@ class Day13: AOCDay {
|
|||||||
|
|
||||||
func testCartSort() {
|
func testCartSort() {
|
||||||
var cars: [Cart] = []
|
var cars: [Cart] = []
|
||||||
cars.append(Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left))
|
cars.append(Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left, removed: false))
|
||||||
cars.append(Cart(loc: GridPoint(X: 5, Y:22), dir: Direction.up, intersection: Sequence.left))
|
cars.append(Cart(loc: GridPoint(X: 5, Y:22), dir: Direction.up, intersection: Sequence.left, removed: false))
|
||||||
cars.append(Cart(loc: GridPoint(X: 22, Y:5), dir: Direction.up, intersection: Sequence.left))
|
cars.append(Cart(loc: GridPoint(X: 22, Y:5), dir: Direction.up, intersection: Sequence.left, removed: false))
|
||||||
cars.append(Cart(loc: GridPoint(X: 2, Y:10), dir: Direction.up, intersection: Sequence.left))
|
cars.append(Cart(loc: GridPoint(X: 2, Y:10), dir: Direction.up, intersection: Sequence.left, removed: false))
|
||||||
// for car in cars { print("\(car)")}
|
|
||||||
cars.sort()
|
cars.sort()
|
||||||
// print("")
|
|
||||||
// for car in cars { print("\(car)")}
|
|
||||||
let lastCar = cars.last!
|
let lastCar = cars.last!
|
||||||
XCTAssertEqual(test: "testCartSort last", withExpression: (lastCar.loc.X == 5 && lastCar.loc.Y == 22))
|
XCTAssertEqual(test: "testCartSort last", withExpression: (lastCar.loc.X == 5 && lastCar.loc.Y == 22))
|
||||||
}
|
}
|
||||||
|
|
||||||
func testCartEquatable() {
|
func testCartEquatable() {
|
||||||
var car1 = Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left)
|
var car1 = Cart(loc: GridPoint(X: 10, Y:10), dir: Direction.up, intersection: Sequence.left, removed: false)
|
||||||
car1.move()
|
car1.move()
|
||||||
car1.changeDirection(with: "-")
|
car1.changeDirection(with: "-")
|
||||||
car1.move()
|
car1.move()
|
||||||
// XCTAssertEqual(test: "testCartChangeDirection '-'", withExpression: (car1.loc.X == 10 && car1.loc.Y == 8))
|
let car2 = Cart(loc: GridPoint(X: 10, Y:8), dir: Direction.up, intersection: Sequence.left, removed: false)
|
||||||
let car2 = Cart(loc: GridPoint(X: 10, Y:8), dir: Direction.up, intersection: Sequence.left)
|
|
||||||
XCTAssertEqual(test: "testCartEquatable", withExpression: (car1 == car2))
|
XCTAssertEqual(test: "testCartEquatable", withExpression: (car1 == car2))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func testMadnessInit() {
|
||||||
|
let mad = Madness(withString: testData)
|
||||||
|
printTrack(with: mad)
|
||||||
|
XCTAssertEqual(test: "testMadnessInit string", withExpression: (mad.width == 13 && mad.height == 6))
|
||||||
|
if mad.carts.count != 2 {
|
||||||
|
XCTAssertEqual(test: "testMadnessInit carts count", withExpression: (false))
|
||||||
|
} else {
|
||||||
|
XCTAssertEqual(test: "testMadnessInit carts count", withExpression: (mad.carts.count == 2))
|
||||||
|
XCTAssertEqual(test: "testMadnessInit cart X", withExpression: (mad.carts[0].loc.X == 2))
|
||||||
|
XCTAssertEqual(test: "testMadnessInit cart Y", withExpression: (mad.carts[0].loc.Y == 0))
|
||||||
|
XCTAssertEqual(test: "testMadnessInit cart direction", withExpression: (mad.carts[0].dir == Direction.right))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testGetTrack() {
|
||||||
|
let mad = Madness(withString: testData)
|
||||||
|
var result = mad.getTrack(at: GridPoint(X: 4, Y: 2))
|
||||||
|
XCTAssertEqual(test: "testGetTrack (5, 3)", withExpression: (result == "+"))
|
||||||
|
result = mad.getTrack(at: GridPoint(X: 2, Y: 0))
|
||||||
|
XCTAssertEqual(test: "testGetTrack (3, 1) convert cart to track", withExpression: (result == "-"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testCollision() {
|
||||||
|
let mad = Madness(withString: testData)
|
||||||
|
mad.carts[1].loc = mad.carts[0].loc
|
||||||
|
XCTAssertEqual(test: "testCollision", withExpression: (mad.collision(removeCrash: false) != nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
func testTick() {
|
||||||
|
let mad = Madness(withString: testData)
|
||||||
|
let oldcart = mad.carts[0]
|
||||||
|
let collided = mad.tick(andRemove: false)
|
||||||
|
let newcart = mad.carts[0]
|
||||||
|
XCTAssertEqual(test: "testTick", withExpression: (oldcart != newcart))
|
||||||
|
XCTAssertEqual(test: "testTick", withExpression: (collided == nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
func printTrack(with mad: Madness) {
|
||||||
|
func cartLoc(at loc: GridPoint) -> (Bool, Character) {
|
||||||
|
var retVal: (Bool, Character) = (false, " ")
|
||||||
|
for cart in mad.carts {
|
||||||
|
if cart.loc == loc && !cart.removed{
|
||||||
|
switch cart.dir {
|
||||||
|
case .up : retVal = (true, "^")
|
||||||
|
case .down : retVal = (true, "v")
|
||||||
|
case .left : retVal = (true, "<")
|
||||||
|
case .right: retVal = (true, ">")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retVal
|
||||||
|
}
|
||||||
|
|
||||||
|
for j in 0..<mad.height {
|
||||||
|
for i in 0..<mad.width {
|
||||||
|
let cartIcon = cartLoc(at: GridPoint(X: i, Y: j))
|
||||||
|
if cartIcon.0 {
|
||||||
|
print("\(cartIcon.1)", terminator: " ")
|
||||||
|
} else {
|
||||||
|
print("\(mad.getTrack(at: GridPoint(X: i, Y: j)))", terminator: " ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
print("")
|
||||||
|
}
|
||||||
|
print("")
|
||||||
|
}
|
||||||
|
|
||||||
|
func testRun() {
|
||||||
|
var mad = Madness(withString: testData)
|
||||||
|
printTrack(with: mad)
|
||||||
|
var crash: GridPoint?
|
||||||
|
repeat {
|
||||||
|
crash = mad.tick(andRemove: false)
|
||||||
|
} while crash == nil
|
||||||
|
// print("Collision location Part1: (\(crash!))")
|
||||||
|
XCTAssertEqual(test: "testRun Part 1", withExpression: (crash! == GridPoint(X: 7, Y: 3)))
|
||||||
|
|
||||||
|
mad = Madness(withString: testData2)
|
||||||
|
printTrack(with: mad)
|
||||||
|
repeat {
|
||||||
|
crash = mad.tick(andRemove: true)
|
||||||
|
} while crash == nil
|
||||||
|
// print("Last Cart location Part2: (\(crash!))")
|
||||||
|
XCTAssertEqual(test: "testRun Part 2", withExpression: (crash! == GridPoint(X: 6, Y: 4)))
|
||||||
|
}
|
||||||
|
|
||||||
func day13Tests() {
|
func day13Tests() {
|
||||||
testCartMove()
|
testCartMove()
|
||||||
testCartChangeDirection()
|
testCartChangeDirection()
|
||||||
testCartSort()
|
testCartSort()
|
||||||
testCartEquatable()
|
testCartEquatable()
|
||||||
|
testMadnessInit()
|
||||||
|
testGetTrack()
|
||||||
|
testCollision()
|
||||||
|
testTick()
|
||||||
|
testRun()
|
||||||
}
|
}
|
||||||
|
|
||||||
func day13Final() {
|
func day13Final() {
|
||||||
let retVal = "None"
|
var mad = Madness(withFile: "/home/peterr/AOC2018/Sources/AOC2018/data/day13.txt")
|
||||||
print("Answer to part 1 is: \(retVal)")
|
var crash: GridPoint?
|
||||||
print("Answer to part 2 is: \(retVal)")
|
repeat {
|
||||||
|
crash = mad.tick(andRemove: false)
|
||||||
|
} while crash == nil
|
||||||
|
print("Answer to part 1 is: \(crash!)")
|
||||||
|
|
||||||
|
mad = Madness(withFile: "/home/peterr/AOC2018/Sources/AOC2018/data/day13.txt")
|
||||||
|
repeat {
|
||||||
|
crash = mad.tick(andRemove: true)
|
||||||
|
} while crash == nil
|
||||||
|
print("Answer to part 2 is: \(crash!)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Start of Tick:
|
|
||||||
// 1. order carts by location
|
|
||||||
// 2. move cart one step in it's direction
|
|
||||||
// 3. Look to see where we landed
|
|
||||||
// a. other cart => CRASH
|
|
||||||
// b. '-' or '|' is a straight track => do nothing
|
|
||||||
// c. '\' => rotate right
|
|
||||||
// d. '/' => rotate left
|
|
||||||
// e. '+' => [Left, Straight, Right] sequense for this cart
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// We'll need to figure out the size of the grid
|
|
||||||
// - scan and find the number of carts and their locations and direction
|
|
||||||
// - convert the carts to "track"
|
|
||||||
// - At intersections, each cart executes their own "sequense"
|
|
||||||
// - Left, Straight, Right, repeat
|
|
||||||
// - move carts in order of Top, Left to Bottom, Right
|
|
||||||
// - order carts by (x,y) position, then execute moves
|
|
||||||
// Watch for first crash and report crash location
|
|
||||||
|
|
||||||
|
|||||||
@@ -19,9 +19,14 @@ func == <T:Equatable> (tuple1:(T,T),tuple2:(T,T)) -> Bool
|
|||||||
return (tuple1.0 == tuple2.0) && (tuple1.1 == tuple2.1)
|
return (tuple1.0 == tuple2.0) && (tuple1.1 == tuple2.1)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct GridPoint: Equatable, Comparable {
|
struct GridPoint: Equatable, Comparable, Hashable {
|
||||||
var X = 0
|
var X = 0
|
||||||
var Y = 0
|
var Y = 0
|
||||||
|
var hashValue: Int {
|
||||||
|
get {
|
||||||
|
return X.hashValue ^ Y.hashValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
|
static func == (lhs: GridPoint, rhs: GridPoint) -> Bool {
|
||||||
return (lhs.X == rhs.X) && (lhs.Y == rhs.Y)
|
return (lhs.X == rhs.X) && (lhs.Y == rhs.Y)
|
||||||
|
|||||||
Reference in New Issue
Block a user