{-# LANGUAGE NoMonomorphismRestriction #-}
main = narisavatKvadratiki
narisavatKvadratiki =
flip mapM_ [razmer
,razmer
-odin
.. -razmer
] $ \yKoordinata
-> flip mapM_ [-razmer
..razmer
] (\xKoordinata
-> putStr [if elem [xKoordinata
,yKoordinata
] kvadratiki
then chornayaTochka
else pusto
,pusto
]) >> putChar novayaLiniya
where kvadratiki = popravitj $
zaeboshitKvadratiki (dva*dva*dva) [[-razmer,razmer],[razmer,razmer],[razmer,-razmer],[-razmer,-razmer]]
zaeboshitKvadratiki kolichestvo =
zaeboshitLiniyu odin dva =
[zipWith (+) odin
[dlina
*cos ugol
,dlina
*sin ugol
] | dlina
<- [0,prirashenie
..rasstojanie
]] where ugol = vicheslitUgol odin dva
rasstojanie = vicheslitRasstoyanie odin dva
vicheslitRasstoyanie [xKoordinata1,yKoordinata1] [xKoordinata2,yKoordinata2] =
sqrt $ (xKoordinata1
-xKoordinata2
)^dva
+ (yKoordinata1
-yKoordinata2
)^dva
vicheslitUgol [xKoordinata1,yKoordinata1] [xKoordinata2,yKoordinata2] =
atan2 (yKoordinata2
-yKoordinata1
) (xKoordinata2
-xKoordinata1
) srednyaaTochka [xKoordinata1,yKoordinata1] [xKoordinata2,yKoordinata2] =
[(xKoordinata1+xKoordinata2)/dva,(yKoordinata1+yKoordinata2)/dva]
razmer = 24
prirashenie = 0.1
nolj:odin:dva:_ = [0..]
nachalo = [nolj,nolj]
[chornayaTochka,pusto,novayaLiniya] = "# \n"
ey0jIExBTkdVQUdFIE5vTW9ub21vcnBoaXNtUmVzdHJpY3Rpb24gIy19CgptYWluID0gbmFyaXNhdmF0S3ZhZHJhdGlraQoKbmFyaXNhdmF0S3ZhZHJhdGlraSA9CiAgICBmbGlwIG1hcE1fIFtyYXptZXIscmF6bWVyLW9kaW4uLiAtcmF6bWVyXSAkIFx5S29vcmRpbmF0YSAtPgogICAgICAgIGZsaXAgbWFwTV8gWy1yYXptZXIuLnJhem1lcl0gKFx4S29vcmRpbmF0YSAtPgogICAgICAgICAgICBwdXRTdHIgW2lmIGVsZW0gW3hLb29yZGluYXRhLHlLb29yZGluYXRhXSBrdmFkcmF0aWtpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBjaG9ybmF5YVRvY2hrYSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcHVzdG8KICAgICAgICAgICAgICAgICAgICAscHVzdG9dKSA+PiBwdXRDaGFyIG5vdmF5YUxpbml5YSB3aGVyZQogICAga3ZhZHJhdGlraSA9IHBvcHJhdml0aiAkIAogICAgICAgIHphZWJvc2hpdEt2YWRyYXRpa2kgKGR2YSpkdmEqZHZhKSBbWy1yYXptZXIscmF6bWVyXSxbcmF6bWVyLHJhem1lcl0sW3Jhem1lciwtcmF6bWVyXSxbLXJhem1lciwtcmF6bWVyXV0KICAgIHphZWJvc2hpdEt2YWRyYXRpa2kga29saWNoZXN0dm8gPQogICAgICAgIG1hcCAobWFwICh1bmN1cnJ5IHphZWJvc2hpdExpbml5dSkgLiBvYnptZWl0aikgLiAKICAgICAgICB0YWtlIGtvbGljaGVzdHZvIC4gCiAgICAgICAgaXRlcmF0ZSAobWFwICh1bmN1cnJ5IHNyZWRueWFhVG9jaGthKSAuIG9iem1laXRqKQogICAgCnphZWJvc2hpdExpbml5dSBvZGluIGR2YSA9IAogICAgW3ppcFdpdGggKCspIG9kaW4gW2RsaW5hKmNvcyB1Z29sLGRsaW5hKnNpbiB1Z29sXSB8IGRsaW5hIDwtIFswLHByaXJhc2hlbmllLi5yYXNzdG9qYW5pZV1dIHdoZXJlCiAgICAgICAgdWdvbCA9IHZpY2hlc2xpdFVnb2wgb2RpbiBkdmEKICAgICAgICByYXNzdG9qYW5pZSA9IHZpY2hlc2xpdFJhc3N0b3lhbmllIG9kaW4gZHZhCiAgICAKdmljaGVzbGl0UmFzc3RveWFuaWUgW3hLb29yZGluYXRhMSx5S29vcmRpbmF0YTFdIFt4S29vcmRpbmF0YTIseUtvb3JkaW5hdGEyXSA9IAogICAgc3FydCAkICh4S29vcmRpbmF0YTEteEtvb3JkaW5hdGEyKV5kdmEgKyAoeUtvb3JkaW5hdGExLXlLb29yZGluYXRhMileZHZhCnZpY2hlc2xpdFVnb2wgW3hLb29yZGluYXRhMSx5S29vcmRpbmF0YTFdIFt4S29vcmRpbmF0YTIseUtvb3JkaW5hdGEyXSA9IAogICAgYXRhbjIgKHlLb29yZGluYXRhMi15S29vcmRpbmF0YTEpICh4S29vcmRpbmF0YTIteEtvb3JkaW5hdGExKQpzcmVkbnlhYVRvY2hrYSBbeEtvb3JkaW5hdGExLHlLb29yZGluYXRhMV0gW3hLb29yZGluYXRhMix5S29vcmRpbmF0YTJdID0gCiAgICBbKHhLb29yZGluYXRhMSt4S29vcmRpbmF0YTIpL2R2YSwoeUtvb3JkaW5hdGExK3lLb29yZGluYXRhMikvZHZhXQoKb2J6bWVpdGogc3Bpc29rID0gemlwIHNwaXNvayAodGFpbCBzcGlzb2spICsrIFsoaGVhZCBzcGlzb2ssbGFzdCBzcGlzb2spXQpwb3ByYXZpdGogPSBtYXAgKG1hcCByb3VuZCkgLiBjb25jYXQgLiBjb25jYXQKICAgIApyYXptZXIgPSAyNApwcmlyYXNoZW5pZSA9IDAuMQpub2xqOm9kaW46ZHZhOl8gPSBbMC4uXQpuYWNoYWxvID0gW25vbGosbm9sal0KW2Nob3JuYXlhVG9jaGthLHB1c3RvLG5vdmF5YUxpbml5YV0gPSAiIyBcbiI=