{-# LANGUAGE NoMonomorphismRestriction #-}
import qualified Data.Set as S
main = narisavatKvadratiki
narisavatKvadratiki =
flip mapM_ [razmer
,razmer
-odin
.. -razmer
] $ \yKoordinata
-> flip mapM_ [-razmer
..razmer
] (\xKoordinata
-> putStr [if S
.member
[xKoordinata
,yKoordinata
] treugolnichki
then chornayaTochka
else pusto
,pusto
]) >> putChar novayaLiniya
where treugolnichki
= S
.fromList
$ popravitj
$ zaeboshitTreugolnichki
3 [[razmer
*cos ugol
,razmer
*sin ugol
] | ugol
<- [pi/2,pi/2+2*pi/3,pi/2+4*pi/3]] zaeboshitTreugolnichki glubina koordinati@[verx,levo,pravo]
| glubina==nolj = []
([[verx,verxlevo,pravoverx],
[verxlevo,levo,levopravo],
[pravoverx,levopravo,pravo]] >>= zaeboshitTreugolnichki (glubina-odin)) where
[verxlevo
,levopravo
,pravoverx
] = map (uncurry srednyaaTochka
) (obzmeitj koordinati
)
zaeboshitLiniyu odin dva =
[zipWith (+) odin
[dlina
*cos ugol
,dlina
*sin ugol
] | dlina
<- [nolj
,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 = 20
prirashenie = 0.3
nolj:odin:dva:_ = [0..]
nachalo = [nolj,nolj]
[chornayaTochka,pusto,novayaLiniya] = "# \n"
ey0jIExBTkdVQUdFIE5vTW9ub21vcnBoaXNtUmVzdHJpY3Rpb24gIy19CmltcG9ydCBxdWFsaWZpZWQgRGF0YS5TZXQgYXMgUwoKbWFpbiA9IG5hcmlzYXZhdEt2YWRyYXRpa2kKCm5hcmlzYXZhdEt2YWRyYXRpa2kgPQogICAgZmxpcCBtYXBNXyBbcmF6bWVyLHJhem1lci1vZGluLi4gLXJhem1lcl0gJCBceUtvb3JkaW5hdGEgLT4KICAgICAgICBmbGlwIG1hcE1fIFstcmF6bWVyLi5yYXptZXJdIChceEtvb3JkaW5hdGEgLT4KICAgICAgICAgICAgcHV0U3RyIFtpZiBTLm1lbWJlciBbeEtvb3JkaW5hdGEseUtvb3JkaW5hdGFdIHRyZXVnb2xuaWNoa2kKICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGNob3JuYXlhVG9jaGthIAogICAgICAgICAgICAgICAgICAgICAgIGVsc2UgcHVzdG8KICAgICAgICAgICAgICAgICAgICAscHVzdG9dKSA+PiBwdXRDaGFyIG5vdmF5YUxpbml5YSB3aGVyZQogICAgdHJldWdvbG5pY2hraSA9IFMuZnJvbUxpc3QgJCBwb3ByYXZpdGogJCB6YWVib3NoaXRUcmV1Z29sbmljaGtpIDMgW1tyYXptZXIqY29zIHVnb2wscmF6bWVyKnNpbiB1Z29sXSB8IHVnb2wgPC0gW3BpLzIscGkvMisyKnBpLzMscGkvMis0KnBpLzNdXQogICAgemFlYm9zaGl0VHJldWdvbG5pY2hraSBnbHViaW5hIGtvb3JkaW5hdGlAW3ZlcngsbGV2byxwcmF2b10KICAgICAgICB8IGdsdWJpbmE9PW5vbGogPSBbXQogICAgICAgIHwgb3RoZXJ3aXNlID0gKG9iem1laXRqIGtvb3JkaW5hdGkgPj49IHVuY3VycnkgemFlYm9zaGl0TGluaXl1KSArKyAKICAgICAgICAgICAgICAgICAgICAgIChbW3ZlcngsdmVyeGxldm8scHJhdm92ZXJ4XSwKICAgICAgICAgICAgICAgICAgICAgICAgW3ZlcnhsZXZvLGxldm8sbGV2b3ByYXZvXSwKICAgICAgICAgICAgICAgICAgICAgICAgW3ByYXZvdmVyeCxsZXZvcHJhdm8scHJhdm9dXSA+Pj0gemFlYm9zaGl0VHJldWdvbG5pY2hraSAoZ2x1YmluYS1vZGluKSkgd2hlcmUKICAgICAgICAgICAgW3ZlcnhsZXZvLGxldm9wcmF2byxwcmF2b3ZlcnhdID0gbWFwICh1bmN1cnJ5IHNyZWRueWFhVG9jaGthKSAob2J6bWVpdGoga29vcmRpbmF0aSkKICAgICAgICAKemFlYm9zaGl0TGluaXl1IG9kaW4gZHZhID0gCiAgICBbemlwV2l0aCAoKykgb2RpbiBbZGxpbmEqY29zIHVnb2wsZGxpbmEqc2luIHVnb2xdIHwgZGxpbmEgPC0gW25vbGoscHJpcmFzaGVuaWUuLnJhc3N0b2phbmllXV0gd2hlcmUKICAgICAgICB1Z29sID0gdmljaGVzbGl0VWdvbCBvZGluIGR2YQogICAgICAgIHJhc3N0b2phbmllID0gdmljaGVzbGl0UmFzc3RveWFuaWUgb2RpbiBkdmEKICAgIAp2aWNoZXNsaXRSYXNzdG95YW5pZSBbeEtvb3JkaW5hdGExLHlLb29yZGluYXRhMV0gW3hLb29yZGluYXRhMix5S29vcmRpbmF0YTJdID0gCiAgICBzcXJ0ICQgKHhLb29yZGluYXRhMS14S29vcmRpbmF0YTIpXmR2YSArICh5S29vcmRpbmF0YTEteUtvb3JkaW5hdGEyKV5kdmEKdmljaGVzbGl0VWdvbCBbeEtvb3JkaW5hdGExLHlLb29yZGluYXRhMV0gW3hLb29yZGluYXRhMix5S29vcmRpbmF0YTJdID0gCiAgICBhdGFuMiAoeUtvb3JkaW5hdGEyLXlLb29yZGluYXRhMSkgKHhLb29yZGluYXRhMi14S29vcmRpbmF0YTEpCnNyZWRueWFhVG9jaGthIFt4S29vcmRpbmF0YTEseUtvb3JkaW5hdGExXSBbeEtvb3JkaW5hdGEyLHlLb29yZGluYXRhMl0gPSAKICAgIFsoeEtvb3JkaW5hdGExK3hLb29yZGluYXRhMikvZHZhLCh5S29vcmRpbmF0YTEreUtvb3JkaW5hdGEyKS9kdmFdCgpvYnptZWl0aiBzcGlzb2sgPSB6aXAgc3Bpc29rICh0YWlsIHNwaXNvaykgKysgWyhoZWFkIHNwaXNvayxsYXN0IHNwaXNvayldCnBvcHJhdml0aiA9IG1hcCAobWFwIHJvdW5kKQogICAgCnJhem1lciA9IDIwCnByaXJhc2hlbmllID0gMC4zCm5vbGo6b2RpbjpkdmE6XyA9IFswLi5dCm5hY2hhbG8gPSBbbm9saixub2xqXQpbY2hvcm5heWFUb2Noa2EscHVzdG8sbm92YXlhTGluaXlhXSA9ICIjIFxuIg==