startTriangle :: Triangle
startTriangle = (1, 32, 32)
splitOneTriangle :: Triangle -> [Triangle]
splitOneTriangle (row, column, height) =
[ (row, column, halfHeight)
, (row + halfHeight, column - halfHeight, halfHeight)
, (row + halfHeight, column + halfHeight, halfHeight)
]
where halfHeight
= height `
div`
2
splitTriangles :: [Triangle] -> [Triangle]
splitTriangles ts = ts >>= splitOneTriangle
triangleSegments :: Triangle -> [Segment]
triangleSegments (row, column, height) =
[(row + i, column - i, column + i) | i <- [0 .. height - 1]]
inSegment (cellRow, cellColumn) (segmentRow, leftSegmentColumn, rightSegmentColumn) =
segmentRow == cellRow &&
leftSegmentColumn <= cellColumn &&
cellColumn <= rightSegmentColumn
inTriangle cell triangle =
inAnyTriangle cell triangles
= any (inTriangle cell
) triangles
getCellChar cell triangles
| inAnyTriangle cell triangles = '1'
renderSierpinski n
= unlines $ map (\row
-> [getCellChar
(row
, column
) triangles
| column
<- [1 .. 63]]) [1 .. 32]
CnR5cGUgVHJpYW5nbGUgPSAoSW50LCBJbnQsIEludCkKdHlwZSBTZWdtZW50ID0gKEludCwgSW50LCBJbnQpCgpzdGFydFRyaWFuZ2xlIDo6IFRyaWFuZ2xlCnN0YXJ0VHJpYW5nbGUgPSAoMSwgMzIsIDMyKQoKc3BsaXRPbmVUcmlhbmdsZSA6OiBUcmlhbmdsZSAtPiBbVHJpYW5nbGVdCnNwbGl0T25lVHJpYW5nbGUgKHJvdywgY29sdW1uLCBoZWlnaHQpID0gCiAgWyAocm93LCBjb2x1bW4sIGhhbGZIZWlnaHQpCiAgLCAocm93ICsgaGFsZkhlaWdodCwgY29sdW1uIC0gaGFsZkhlaWdodCwgaGFsZkhlaWdodCkKICAsIChyb3cgKyBoYWxmSGVpZ2h0LCBjb2x1bW4gKyBoYWxmSGVpZ2h0LCBoYWxmSGVpZ2h0KQogIF0KICB3aGVyZSBoYWxmSGVpZ2h0ID0gaGVpZ2h0IGBkaXZgIDIKCnNwbGl0VHJpYW5nbGVzIDo6IFtUcmlhbmdsZV0gLT4gW1RyaWFuZ2xlXQpzcGxpdFRyaWFuZ2xlcyB0cyA9IHRzID4+PSBzcGxpdE9uZVRyaWFuZ2xlCgp0cmlhbmdsZVNlZ21lbnRzIDo6IFRyaWFuZ2xlIC0+IFtTZWdtZW50XQp0cmlhbmdsZVNlZ21lbnRzIChyb3csIGNvbHVtbiwgaGVpZ2h0KSA9CiAgWyhyb3cgKyBpLCBjb2x1bW4gLSBpLCBjb2x1bW4gKyBpKSB8IGkgPC0gWzAgLi4gaGVpZ2h0IC0gMV1dCgppblNlZ21lbnQgOjogKEludCwgSW50KSAtPiBTZWdtZW50IC0+IEJvb2wKaW5TZWdtZW50IChjZWxsUm93LCBjZWxsQ29sdW1uKSAoc2VnbWVudFJvdywgbGVmdFNlZ21lbnRDb2x1bW4sIHJpZ2h0U2VnbWVudENvbHVtbikgPQogIHNlZ21lbnRSb3cgPT0gY2VsbFJvdyAmJiAKICBsZWZ0U2VnbWVudENvbHVtbiA8PSBjZWxsQ29sdW1uICYmIAogIGNlbGxDb2x1bW4gPD0gcmlnaHRTZWdtZW50Q29sdW1uCgppblRyaWFuZ2xlIDo6IChJbnQsIEludCkgLT4gVHJpYW5nbGUgLT4gQm9vbAppblRyaWFuZ2xlIGNlbGwgdHJpYW5nbGUgPSAKICBub3QgJCBudWxsICQgZmlsdGVyIChpblNlZ21lbnQgY2VsbCkgJCB0cmlhbmdsZVNlZ21lbnRzIHRyaWFuZ2xlCgppbkFueVRyaWFuZ2xlIDo6IChJbnQsIEludCkgLT4gW1RyaWFuZ2xlXSAtPiBCb29sCmluQW55VHJpYW5nbGUgY2VsbCB0cmlhbmdsZXMgPSBhbnkgKGluVHJpYW5nbGUgY2VsbCkgdHJpYW5nbGVzCgpnZXRDZWxsQ2hhciA6OiAoSW50LCBJbnQpIC0+IFtUcmlhbmdsZV0gLT4gQ2hhcgpnZXRDZWxsQ2hhciBjZWxsIHRyaWFuZ2xlcwogIHwgaW5BbnlUcmlhbmdsZSBjZWxsIHRyaWFuZ2xlcyA9ICcxJwogIHwgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICA9ICdfJwoKcmVuZGVyU2llcnBpbnNraSA6OiBJbnQgLT4gU3RyaW5nCnJlbmRlclNpZXJwaW5za2kgbiA9IHVubGluZXMgJCBtYXAgKFxyb3cgLT4gW2dldENlbGxDaGFyIChyb3csIGNvbHVtbikgdHJpYW5nbGVzIHwgY29sdW1uIDwtIFsxIC4uIDYzXV0pIFsxIC4uIDMyXQogIHdoZXJlIHRyaWFuZ2xlcyA9IGhlYWQgJCBkcm9wIG4gJCBpdGVyYXRlIHNwbGl0VHJpYW5nbGVzIFtzdGFydFRyaWFuZ2xlXQoKbWFpbiA9IGludGVyYWN0ICQgcmVuZGVyU2llcnBpbnNraSAuIHJlYWQK