{"id":365847,"date":"2024-05-21T02:46:47","date_gmt":"2024-05-21T02:46:47","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=365847"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-05-21T02:46:47","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=365847","title":{"rendered":"<span>\u0418\u0437 \u043f\u0443\u0448\u0435\u043a \u043f\u043e \u0432\u043e\u0440\u043e\u0431\u044c\u044f\u043c. \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430\u00a0\u0443\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435\u00a0\u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438\u2011\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430\u00a0\u0414\u0437\u0435\u043d\u2011\u043a\u0430\u043d\u0430\u043b\u0435 <a href=\"https:\/\/dzen.ru\/zdgzdgzdg\" rel=\"noopener noreferrer nofollow\">@zdgzdgzdg<\/a> \u043f\u0440\u043e\u00a0\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u00ab<a href=\"https:\/\/dzen.ru\/a\/YshmTeVn9lbK7V3r\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a>\u00bb. \u041f\u043e\u043a\u0430 \u044f \u0447\u0438\u0442\u0430\u043b \u044d\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0441\u00a0\u043a\u043e\u0434\u043e\u043c, \u043c\u0435\u043d\u044f \u043e\u0441\u0435\u043d\u0438\u043b\u043e: \u0432\u0435\u0434\u044c \u044d\u0442\u043e\u00a0\u0436\u0435 <strong>\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u00a0\u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0435, \u043f\u043e\u0433\u0440\u0443\u0436\u0451\u043d\u043d\u044b\u0435 \u0432\u00a0\u043c\u043e\u043d\u0430\u0434\u0443<\/strong>! \u042f \u043d\u0435\u00a0\u0438\u0437\u0434\u0435\u0432\u0430\u044e\u0441\u044c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043e\u00a0\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u0432\u0443\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u044b  <code>Zipper<\/code>, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438 \u043c\u043e\u043d\u0430\u0434\u044b  <code>Random<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<p>\u0418 \u0432\u043e\u0442, \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u043b\u043e\u0432\u0441\u0442\u0432\u0430 \u043d\u0430\u00a0\u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445, \u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u00ab\u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439\u00bb \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u043e\u0432 \u043d\u0430\u00a0Haskell, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u044b \u0438 \u043c\u043e\u043d\u0430\u0434\u044b, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435, \u043d\u0438 \u0432\u00a0\u0447\u00eb\u043c \u0441\u0435\u0431\u0435 \u043d\u0435\u00a0\u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044f. \u0418 \u0445\u043e\u0442\u044f \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Haskell \u043d\u0443\u0436\u0435\u043d \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439, \u043d\u043e\u00a0\u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f\u00a0\u043d\u0438\u0445 \u043e\u043d \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e! <\/p>\n<p>\u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435 <em>code\u2011golf<\/em> (\u0442\u043e \u0435\u0441\u0442\u044c, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430) \u0438 \u043d\u0435\u00a0\u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0430 <em>proof of concept<\/em>: \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u0438 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u044b.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043b\u0435\u043d\u044c \u0447\u0438\u0442\u0430\u0442\u044c, \u0438\u043b\u0438\u00a0\u0441\u0442\u0440\u0430\u0448\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0434 \u043d\u0430\u00a0Haskell, \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0432\u00a0\u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u0441\u0443\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u041c\u044b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u00eb, \u0447\u0442\u043e\u00a0\u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u00ab\u0432\u043e\u043b\u0448\u0435\u0431\u0441\u0442\u0432\u043e\u00bb \u043a\u043e\u043c\u043e\u043d\u0430\u0434 \u0438 \u043c\u043e\u043d\u0430\u0434 \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439, \u0442\u043e \u0435\u0441\u0442\u044c, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u0432\u0435\u0441\u044c, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442, \u0430\u00a0\u0432\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0433\u043b\u0430\u0434\u043a\u043e \u043f\u0440\u043e\u0442\u0430\u0449\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0438 \u043a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u044b\u0441\u043a\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u0438\u0437\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442<\/h2>\n<p>\u041a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043d\u0435\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u044f\u0447\u0435\u0435\u043a, \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u00a0\u0443\u0447\u0451\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438. \u041e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0441\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u043e\u043f\u0438\u0441\u0430\u043d \u0432\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u0438 \u0435\u0433\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u044b\u0441\u043a\u0430\u0442\u044c \u0432\u00a0YouTube. \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c&#8230; \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e \u0447\u0438\u0441\u0442\u043e\u0435 \u0438\u0437\u0434\u0435\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0438 \u043f\u043e\u0432\u043e\u0434 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u00a0\u043b\u0438\u0431\u043e \u044f\u0437\u044b\u043a,\u00a0\u043b\u0438\u0431\u043e \u0437\u0430\u0434\u0430\u0447\u0443. \u041d\u043e\u00a0\u043d\u0435\u00a0\u0442\u0443\u0442\u2011\u0442\u043e\u00a0\u0431\u044b\u043b\u043e! \u0412\u044b\u0437\u043e\u0432 \u043f\u0440\u0438\u043d\u044f\u0442!<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u043c\u043d\u043e\u0439 \u0437\u0430\u0443\u043c\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (DDD), \u0442\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0445 \u0442\u0438\u043f\u043e\u0432. <\/p>\n<p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0447\u0435\u0442\u0432\u00eb\u0440\u043a\u043e\u0439 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u044f\u0447\u0435\u0439\u043a\u0438. \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u043e\u00a0\u044f \u0438\u043c\u0435\u044e \u0432\u00a0\u0432\u0438\u0434\u0443:<\/p>\n<pre><code class=\"haskell\">-- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 type Cell = ( Int, Int             , Int, Int )   showCell :: Cell -> String showCell = \\case   (1,0,0,0) -> \"\u2580 \"   (0,1,0,0) -> \" \u2580\"   (0,0,1,0) -> \"\u2584 \"   (0,0,0,1) -> \" \u2584\"   (1,1,0,0) -> \"\u2580\u2580\"   (0,1,0,1) -> \" \u2588\"   (1,0,1,0) -> \"\u2588 \"   (0,0,1,1) -> \"\u2584\u2584\"   _         -> \"  \"<\/code><\/pre>\n<p>\u0412\u0441\u044f \u0441\u043e\u043b\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430  \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"haskell\">-- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044f\u0447\u0435\u0439\u043a\u0438 type State = [Cell]       -- | \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043b\u0435\u0442\u043e\u043a \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430. states :: State states = [ (0,0,0,1), (0,0,1,0)          , (0,1,0,0), (1,0,0,0)          , (0,0,1,1), (0,1,0,1)          , (1,0,1,0), (1,1,0,0) ]  showState :: State -> String showState = \\case   []  -> \"\u2591\u2591\"   [x] -> showCell x   xs  -> show (length xs) &lt;> \" \"<\/code><\/pre>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c. \u0412 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0432\u044b\u0448\u0435 \u0441\u0442\u0430\u0442\u044c\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u043c\u044b \u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442:<\/p>\n<pre><code class=\"haskell\">-- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f data Dir = R | L | U | D    deriving (Eq, Show)  -- | \u041f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u043b\u0435\u0442\u043e\u043a \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c adjacent :: Dir -> Cell -> Cell -> Bool adjacent R (_,a,_,b) (c,_,d,_) = a*c + b*d \/= 0 adjacent D (_,_,a,b) (c,d,_,_) = a*c + b*d \/= 0 adjacent L a b = adjacent R b a adjacent U a b = adjacent D b a<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432\u0434\u043e\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0430 \u044f\u0447\u0435\u0435\u043a. \u0414\u043b\u044f\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u00eb\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f\u2011\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code>Dir<\/code>.<\/p>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438 \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0442\u043e \u0435\u0441\u0442\u044c, \u0438\u043c\u0435\u044e\u0449\u0435\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0435\u00eb \u0441\u043e\u0441\u0435\u0434\u0435\u0439. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0447\u0430\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438.<\/p>\n<pre><code class=\"haskell\">-- | \u0414\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439 adjust :: State -> [(Dir, State)] -> State adjust = \\cases {-1-} []    []  -> [] {-2-} [x]   _   -> [x] {-3-} []    nbs -> adjust states nbs {-4-} state nbs -> let         res = nub [ s | s &lt;- state                   , (d, nb) &lt;- nbs                   , any (adjacent d s) nb ]         in if length res == 8 then [] else res<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439, \u0441\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u00a0\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437\u00a0\u043d\u0438\u0445. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0441\u043e\u0441\u0435\u0434\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e. \u0412\u00a0\u0442\u0435\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043b\u0435\u0442\u043a\u0438 \u0438 \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439.<\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0438 \u044f\u0447\u0435\u0439\u043a\u0430, \u043d\u0438 \u0435\u0451 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u00a0\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u0441\u043e\u0441\u0435\u0434\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u043d\u0435\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e, \u043d\u043e\u00a0\u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0438\u0437\u00a0\u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u0443\u0436\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0438\u043b\u0438\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0442\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0430\u043a\u00a0\u0441\u0443\u043f\u0435\u0440\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0449\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0443\u044e\u0442\u0441\u044f \u0441\u00a0\u0441\u043e\u0441\u0435\u0434\u044f\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u043a\u0430\u043a\u00a0\u0432\u00a0Python. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0435\u0441\u043b\u0438 \u0432\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u0442\u043e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u043e\u0441\u044c, \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u042d\u0442\u0438\u043c \u0437\u0430\u0439\u043c\u0451\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>collapse<\/code>:<\/p>\n<pre><code class=\"haskell\">-- | \u0421\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 collapse :: Rational -> State -> Random State collapse p = \\case {-1-} [x]   -> return [x] {-2-} []    -> do x &lt;- uniform states                   fromList [([x], p), ([], 1)] {-3-} state -> do x &lt;- uniform state                   return [x]<\/code><\/pre>\n<p>\u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c <code>p<\/code> \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u00a0\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u00a0\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e <img loading=\"lazy\" decoding=\"async\" class=\"formula inline\" source=\"p\" alt=\"p\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cc5\/0ce\/fd4\/cc50cefd4431d8c8a21e9b4bba901874.svg\" width=\"11\" height=\"15\"\/>\u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u044c\u0441\u044f \u0432\u00a0\u043e\u0434\u043d\u043e \u0438\u0437\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u041e\u00a0\u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u044f \u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f\u00a0\u0441\u0443\u043f\u0435\u0440\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0434\u043d\u043e \u0438\u0437\u00a0\u043d\u0438\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0438\u043f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0435\u0451 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u00a0\u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0430\u00a0\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>uniform<\/code>  \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437\u00a0\u0441\u043f\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0441\u0447\u0438\u0442\u0430\u044f, \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e. \u0410\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>fromList<\/code>  \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0441\u0442\u0435\u043d\u043e\u043a \u0432\u00a0\u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0440\u043e\u0441\u0442, \u043e\u043a\u0440\u0443\u0436\u0430\u044f \u0441\u0435\u0431\u044f \u043a\u043b\u0435\u0442\u043a\u0430\u043c\u0438, \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430, \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>fromList<\/code>.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0432\u0441\u00eb \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435\u00a0\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u044f\u0437\u044b\u043a\u0430 Haskell. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0443\u0442 \u043f\u043e\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c. \u041f\u043e\u0440\u0430, \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0435\u0433\u043e \u043f\u0440\u0438\u0447\u0443\u0434\u043b\u0438\u0432\u044b\u0439 \u043c\u0438\u0440!<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>adjust<\/code> \u0438 <code>collapse<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 <em>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b<\/em>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0435\u0451 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439. \u042d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0435\u043d \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447:<\/p>\n<ul>\n<li>\n<p>\u043a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0441\u0432\u00eb\u0440\u0442\u043a\u0438 \u0438 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u044f\u0434\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u0430\u0442\u0444\u0438\u0437\u0438\u043a\u0438 (\u0442\u0438\u043f\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0435\u0439),<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 (spreadsheets, \u043a\u0430\u043a \u0432 Lotus \u0438\u043b\u0438 Excell) \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430\u0434\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0<code>adjust<\/code>\u00a0\u043d\u0430 \u0432\u0441\u00eb \u043f\u043e\u043b\u0435. \u041e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u044f\u0447\u0435\u0435\u043a \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043c, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043d\u0443\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043e\u0441\u0435\u0434\u044f\u043c.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<em>\u0437\u0438\u043f\u043f\u0435\u0440\u043e\u043c<\/em>\u00a0\u0438\u043b\u0438\u00a0\u043b\u0435\u043d\u0442\u043e\u0439\u00a0(<code>Tape<\/code>). \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u2014 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043b\u0435\u043d\u0442\u044b. \u0412 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u043f\u043e\u0437\u0430\u0434\u0438 \u043d\u0435\u0433\u043e.<\/p>\n<pre><code class=\"haskell\">-- | \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043b\u0435\u043d\u0442\u0430 \u0441 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c. data Tape a = Tape [a] a [a]  -- |  \u041a\u0443\u0440\u0441\u043e\u0440 \u0438 \u0435\u0433\u043e \u0441\u043e\u0441\u0435\u0434\u0438 cursor (Tape _ x _) = x viscinity (Tape (b:_) _ (f:_)) = (b, f)  -- | \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043b\u0435\u043d\u0442\u0435 back (Tape (a:as) x bs    ) = Tape as     a (x:bs) forw (Tape as     x (b:bs)) = Tape (x:as) b bs<\/code><\/pre>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u043d\u0442\u044b, \u0434\u043b\u044f \u043d\u0435\u0451 \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439: \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0443\u0440\u0441\u043e\u0440\u0443 \u0438 \u043a \u0435\u0433\u043e \u0441\u043e\u0441\u0435\u0434\u044f\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0432\u0438\u0433 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432\u043f\u0435\u0440\u00eb\u0434 \u0438 \u043d\u0430\u0437\u0430\u0434. \u0412 \u044d\u0442\u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u043d\u0442\u044b. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u0435\u0449\u0451 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043b\u0435\u043d\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<pre><code class=\"haskell\">-- | \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043b\u0435\u043d\u0442\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 tape :: a -> [a] -> Tape a tape d xs =   forw $ Tape (repeat d) d (xs ++ repeat d)  -- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043b\u0435\u043d\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 takeT :: Int -> Tape a -> [a] takeT n (Tape _ x xs) = take n (x:xs)<\/code><\/pre>\n<p>\u041d\u0430 \u0431\u0430\u0437\u0435 \u043b\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u043c \u0438\u043b\u0438 \u0440\u0435\u0448\u0451\u0442\u043a\u043e\u0439 (<code>Grid<\/code>). \u042d\u0442\u043e \u043b\u0435\u043d\u0442\u0430, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043b\u0435\u043d\u0442\u044b:<\/p>\n<pre><code class=\"haskell\">-- | \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. data Grid a = Grid { pos     :: (Int, Int)                    , getGrid :: Tape (Tape a) }  -- | \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u043c  \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. grid :: a -> [[a]] -> Grid a grid d = Grid (0,0) . tape (tape d []) . fmap (tape d)  -- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043f\u043e\u043b\u044f. takeG :: Int -> Grid a -> [[a]] takeG n (Grid _ g) = takeT n $ takeT n &lt;$> g <\/code><\/pre>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <code>Grid<\/code> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u0435\u0433\u043a\u043e \u0438\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0443\u044e \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u043c \u0434\u043b\u044f\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>adjust<\/code>:<\/p>\n<pre><code class=\"haskell\">-- | \u0421\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u043a\u0443\u0440\u0441\u043e\u0440\u0430, \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438 neigbours :: Grid a -> [(Dir, a)] neigbours (Grid _ m) =    [(L, l),(R, r), (D, cursor d), (U, cursor u)]   where     (u,d) = viscinity m     (l,r) = viscinity $ cursor m<\/code><\/pre>\n<p>\u041e\u0431\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b\u00a0<code>Tape<\/code>\u00a0 \u0438 \u00a0<code>Grid<\/code>\u00a0 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <em>\u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438<\/em>. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430, \u044d\u0442\u043e \u043d\u0435\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0439\u0441\u044f \u043a \u0442\u0438\u043f\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u043e \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443.<\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: <code>extract<\/code> \u0438 <code>duplicate<\/code> c \u0442\u0430\u043a\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438:<\/p>\n<pre><code class=\"haskell\">class Functor w => Comonad w where   extract :: w a -> a   duplicate :: w a -> w (w a)  class Functor f where   fmap :: (a -> b) -> f a -> f b<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c\u00a0<code>Functor<\/code>\u00a0\u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0436\u0435 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e \u0432\u0441\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0412\u043e\u0442 \u043a\u0430\u043a\u00a0\u0442\u0438\u043f\u044b <code>Tape<\/code> \u0438 <code>Grid<\/code> \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0442 \u043a\u043b\u0430\u0441\u0441 <code>Comonad<\/code>:<\/p>\n<pre><code class=\"haskell\">deriving instance Functor Tape deriving instance Functor Grid  instance Comonad Tape where   extract = cursor   duplicate = iterateT back forw  instance Comonad Grid where   extract (Grid _ g) = cursor $ cursor g   duplicate (Grid p g) =     fmap (Grid p) $ Grid p $ shift $ shift g     where       shift = iterateT (fmap back) (fmap forw)  -- | \u0418\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440 \u043b\u0435\u043d\u0442\u044b iterateT :: (a -> a) -> (a -> a) -> a -> Tape a iterateT l r x =   Tape (iterate l (l x)) x (iterate r (r x))<\/code><\/pre>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>duplicate<\/code> \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043f\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 (\u043b\u0435\u043d\u0442\u044b \u0438\u043b\u0438 \u0440\u0435\u0448\u0451\u0442\u043a\u0438) \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u0434\u0432\u0438\u0433\u0430\u043c\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a \u043a\u043e\u043f\u0438\u044f\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043a\u043e\u043f\u0438\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b, \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u0440\u044f\u0436\u0435\u043d\u0438\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043e\u043d\u0430\u0434. \u041e\u0434\u043d\u0430 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0441 \u0442\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u043e\u043c:<\/p>\n<pre><code>(&lt;&lt;=) :: (w a -> a) -> w a -> w a<\/code><\/pre>\n<p>\u042d\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0442\u0430\u043c \u043d\u0443\u0436\u043d\u043e: \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e. \u0412\u00a0\u043b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u0435 \u0435\u00eb \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <code>extend<\/code>. \u0412\u043e\u0442 \u043a\u0430\u043a\u00a0\u0441\u00a0\u0435\u0451 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>adjust<\/code> \u0434\u043e\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u043e\u043b\u044f.<\/p>\n<pre><code class=\"haskell\">-- | \u041a\u043e\u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 adjust adjustG :: Grid State -> State adjustG x = adjust (extract x) (neigbours x)<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 <code>m<\/code> \u0441\u00a0\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u043a\u043b\u0435\u0442\u043a\u043e\u0439 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u043c \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <code>adjustG &lt;&lt;= m<\/code> \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043a\u043b\u0435\u0442\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0430\u044e\u0449\u0438\u0435 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u044f\u0447\u0435\u0439\u043a\u0443 \u0441\u0442\u0430\u043b\u0438 \u043c\u0435\u043d\u0435\u0435 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4ab\/826\/b46\/4ab826b468b00db9298d6de59f493985.png\" alt=\"\u041d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438-\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 @zdgzdgzdg \u043f\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c &quot;\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&quot;.-14\" title=\"\" width=\"564\" height=\"575\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4ab\/826\/b46\/4ab826b468b00db9298d6de59f493985.png\"\/><\/figure>\n<p> \u0426\u0438\u0444\u0440\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432 \u044f\u0447\u0435\u0439\u043a\u0430\u0445. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0435 \u043f\u043e \u043f\u043e\u043b\u044e.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b3d\/0a2\/466\/b3d0a246663bee5965e124f1f2e41687.png\" alt=\"\u041d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438-\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 @zdgzdgzdg \u043f\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c &quot;\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&quot;.-15\" title=\"\u041d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u043f\u0430\u043b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 (=>>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. &#187; width=&#187;562&#8243; height=&#187;540&#8243; data-src=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b3d\/0a2\/466\/b3d0a246663bee5965e124f1f2e41687.png&#187;\/><\/p>\n<div><figcaption>\u041d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u043e\u043f\u0430\u043b \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 (=>>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0433\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432. <\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442 \u0442\u0430\u043a \u043d\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0448\u044c, \u0440\u0430\u043d\u043e \u0438\u043b\u0438\u00a0\u043f\u043e\u0437\u0434\u043d\u043e, \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c\u0441\u044f \u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437\u00a0\u0441\u0443\u043f\u0435\u0440\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>collapse<\/code>. \u041c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c, \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u043a\u043e \u0432\u0441\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u043f\u043e\u043b\u044f \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>fmap<\/code>?<\/p>\n<p>\u0423\u0432\u044b, \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b Haskell\u00a0\u2014 <em>\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/em>\u00a0\u0438\u00a0<em>\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c<\/em>\u00a0<em>\u043f\u043e<\/em>\u00a0<em>\u0441\u0441\u044b\u043b\u043a\u0430\u043c<\/em>. \u041f\u0435\u0440\u0432\u044b\u0439 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0410 \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0435\u00eb \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0443, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e, \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c12\/0f9\/cd7\/c120f9cd7e0da443c4b6b8dc7093252d.png\" alt=\"\u041d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438-\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 @zdgzdgzdg \u043f\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c &quot;\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&quot;.-16\" title=\"\" width=\"400\" height=\"144\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c12\/0f9\/cd7\/c120f9cd7e0da443c4b6b8dc7093252d.png\"\/><\/figure>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u044d\u0442\u043e \u043d\u0435\u00a0\u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u00a0\u0447\u0438\u0441\u0442\u043e\u043c \u0424\u041f \u043e\u0431\u0440\u0435\u0447\u0435\u043d\u044b \u043d\u0430\u00a0\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0437\u043c. \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0435\u0433\u043e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 <code>g<\/code> \u043f\u0440\u0438\u00a0\u0432\u044b\u0437\u043e\u0432\u0435 \u0432\u0441\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0430\u00a0\u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u00eb \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u043f\u0430\u0440\u0443 <code>(g',\u00a0x)<\/code>. \u0412\u00a0\u044d\u0442\u043e\u0439 \u043f\u0430\u0440\u0435 <em>x<\/em> \u044d\u0442\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0430 <code>g'<\/code><em> <\/em>\u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u00a0\u043d\u043e\u0432\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u043c \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e. \u0415\u043b\u0438 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u00a0\u043e\u0434\u043d\u043e, \u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u00a0\u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>\u042d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u043e \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u043e \u044d\u0441\u0442\u0430\u0444\u0435\u0442\u0435 \u043e\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043a \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0447\u0442\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043c\u0443\u0441\u043e\u0440\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0434, \u043d\u043e \u0438 \u043d\u0430\u0440\u0443\u0448\u0430\u0435\u0442 \u0435\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u2014 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0434\u043d\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445.<\/p>\n<p>\u041d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f\u00a0<strong>\u043c\u043e\u043d\u0430\u0434\u044b<\/strong>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u043e\u0442\u0435\u0440\u044f\u043c\u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u0438, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u044f\u0432\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0432\u0430 \u043c\u0438\u0440\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439: \u0442\u043e\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u044d\u0441\u0442\u0430\u0444\u0435\u0442\u0435 \u0438 \u0442\u043e\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0438 \u0441\u0430\u043c\u0443 \u044d\u0441\u0442\u0430\u0444\u0435\u0442\u0443 \u043c\u043e\u043d\u0430\u0434\u044b \u043d\u0430\u0434\u0451\u0436\u043d\u043e \u043f\u0440\u044f\u0447\u0443\u0442 \u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u043a\u043e\u0434\u0430, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u0435\u00eb \u043d\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c.<\/p>\n<p>\u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u0435\u0449\u0451 \u0440\u0430\u0437 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e\u00a0<code>collapse<\/code>:<\/p>\n<pre><code class=\"haskell\">-- | \u0421\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 collapse :: Rational -> State -> Random State collapse p = \\case {-1-} [x]   -> return [x] {-2-} []    -> do x &lt;- uniform states                   fromList [([x], p), ([], 1)] {-3-} state -> do x &lt;- uniform state                   return [x]<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>do<\/code> \u0438 \u043b\u0435\u0432\u0430\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0430 <code>&lt;-<\/code> , \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u00a0Haskell \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0444\u043e\u0440\u043c\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>uniform<\/code> \u0434\u043b\u044f\u00a0\u0441\u043f\u0438\u0441\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0434\u043d\u043e, \u043d\u043e \u00ab\u0437\u0430\u0432\u0451\u0440\u043d\u0443\u0442\u043e\u0435\u00bb \u0432\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438. \u0414\u0430\u043b\u0435\u0435 \u0441\u00a0\u044d\u0442\u0438\u043c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0441 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u043e\u0439, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u043e\u043d\u0430\u0434\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b), \u0430 \u043f\u043e\u0442\u043e\u043c \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 \u044d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435. \u041f\u043e\u0431\u043e\u0447\u043d\u044b\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0442\u0430\u043a\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0438\u043b\u0438 \u0438\u043d\u043e\u0439\u00a0<em>\u044d\u0444\u0444\u0435\u043a\u0442<\/em>\u00a0\u0438\u043b\u0438\u00a0<em>\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/em>. \u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0439 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0438\u043b\u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c<\/p>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0438\u043b\u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0434\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0438\u0441\u043a\u043e\u0432);<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u043b\u043e\u0433 \u0438\u043b\u0438 \u0436\u0443\u0440\u043d\u0430\u043b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u043f\u0441\u0435\u0432\u0434\u043e\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0434\u043e\u0431\u043d\u043e \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0435, \u043c\u043e\u043d\u0430\u0434\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c: \u043a\u043b\u0430\u0441\u0441\u043e\u043c\u00a0<code>Monad<\/code>. \u042d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u0432\u0443\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u00a0<code>return<\/code>\u00a0 \u0438 \u00a0<code>join<\/code>\u00a0\u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438:<\/p>\n<pre><code class=\"haskell\">-- \u043c\u043e\u043d\u0430\u0434\u0430 return :: a -> m a join :: m (m a) -> m a<\/code><\/pre>\n<p>\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u0435 \u044d\u0442\u0438 \u0442\u0440\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0443:<\/p>\n<pre><code class=\"haskell\">-- \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0430 extract :: w a -> a duplicate :: w a -> w (w a)<\/code><\/pre>\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0443\u044e \u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u044e \u0432 \u044d\u0442\u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u2014 \u043e\u043d\u0438 \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443. \u042d\u0442\u0430 \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0432\u0430\u0442\u044b\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u044b \u0441 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u043e\u0439 \u00ab\u043a\u043e\u2011\u00bb.<\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432, \u0447\u0442\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u043e\u043d\u0430\u0434\u043e\u0439 (\u0434\u043b\u044f\u00a0<code>Random<\/code>, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u044d\u0442\u043e \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e), \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0449\u0438\u0435 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0412\u043e\u0442 \u0434\u0432\u0435 \u0438\u0437 \u043d\u0438\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f:<\/p>\n<pre><code>(=&lt;&lt;) :: (a -> m a) -> m a -> m a mapM  :: (a -> m b) -> [a] -> m [a]<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f, \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0443 <code>(&lt;&lt;=)<\/code>, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0430\u0434 \u0432\u0441\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u0430 \u0432\u0442\u043e\u0440\u0430\u044f (\u0435\u0451 \u0442\u0438\u043f \u044f \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u043b) \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0441\u043f\u0438\u0441\u043a\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432, \u043d\u043e \u0443\u0436\u0435 \u0432 \u043c\u043e\u043d\u0430\u0434\u0435.<\/p>\n<p>\u041d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e\u00a0<code>collapse<\/code>\u00a0\u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e, \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0434\u0438\u043d \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u043e\u0432:<\/p>\n<pre><code class=\"haskell\">-- | \u041c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 collapse collapseM :: Rational -> Maze -> Random Maze collapseM p = mapM $ mapM (collapse p)  -- | \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0433\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 buildMaze :: Int  -- ^ \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430            -> Int  -- ^ \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439            -> Int  -- ^ \u0413\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438           -> IO Maze buildMaze size n k =   evalRandIO $ do c &lt;- uniform states                   build [[[c]]]   where     build x = iterate (stepM =&lt;&lt;) (return x) !! n     recur x = iterate (stepW &lt;&lt;=) (toGrid x) !! k     stepM x = collapseM p $ toMaze $ recur x     stepW x = adjust (extract x) (nonempty $ neigbours x)     nonempty = filter (not . null . snd)     p = 1\/fromIntegral (size^2)     toGrid = grid []     toMaze = takeG size<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u00a0<code>buildMaze<\/code>\u00a0 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0440\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430: \u0440\u0430\u0437\u043c\u0435\u0440 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0448\u0430\u0433\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043f\u0440\u0438 \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u043d\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0447\u0438\u0441\u043b\u043e \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0435.<\/p>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u043f\u043e\u043b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u0432\u00a0\u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0443 <code>Grid<\/code>, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u00a0\u043d\u0435\u0439, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u00eb\u043c \u043f\u043e\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0432\u00a0\u043c\u043e\u043d\u0430\u0434\u0443 <code>Random<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442. \u0414\u043b\u044f\u00a0\u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043c\u044b \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 <code>(&lt;&lt;=)<\/code> \u0438 <code>(=&lt;&lt;)<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>evalRandomIO<\/code> \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u043e\u0439 \u0434\u043b\u044f\u00a0\u0413\u041f\u0421\u0427 \u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u00a0\u043c\u043e\u043d\u0430\u0434\u0443 <code>IO<\/code>, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u0432\u043e\u0434\/\u0432\u044b\u0432\u043e\u0434 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0438\u0441\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c.<\/p>\n<p>\u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u044b \u0440\u0430\u0437\u043d\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u0438 \u0434\u0440\u0435\u0432\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b48\/01e\/95a\/b4801e95aa0d24ab2ed6de3933bdae2b.png\" alt=\"\u041d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438-\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 @zdgzdgzdg \u043f\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c &quot;\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&quot;.-22\" title=\"\" width=\"525\" height=\"567\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b48\/01e\/95a\/b4801e95aa0d24ab2ed6de3933bdae2b.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/899\/a6f\/2be\/899a6f2be9367fc3a129bc22e5d27e02.png\" alt=\"\u041d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438-\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 @zdgzdgzdg \u043f\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c &quot;\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&quot;.-22-2\" title=\"\" width=\"523\" height=\"557\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/899\/a6f\/2be\/899a6f2be9367fc3a129bc22e5d27e02.png\"\/><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/70e\/01c\/655\/70e01c6552cf46ccccdac5e065f9b4e8.png\" alt=\"\u041d\u0430 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435 \u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438-\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 @zdgzdgzdg \u043f\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c &quot;\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438&quot;.-22-3\" title=\"\" width=\"525\" height=\"572\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/70e\/01c\/655\/70e01c6552cf46ccccdac5e065f9b4e8.png\"\/><\/figure>\n<p>\u0428\u0430\u043b\u043e\u0441\u0442\u044c \u0443\u0434\u0430\u043b\u0430\u0441\u044c! \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 100\u00d7100 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0430 \u043c\u043e\u0451\u043c \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u043e\u0442 600 \u043c\u0441\u0435\u043a \u0434\u043e 2.5 \u0441\u0435\u043a \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438, \u0447\u0442\u043e, \u0432 \u043e\u0431\u0449\u0435\u043c, \u0432\u043f\u043e\u043b\u043d\u0435 \u043d\u0435\u043f\u043b\u043e\u0445\u043e, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0440\u0430\u0437, \u0430 \u043f\u043e\u0442\u043e\u043c \u043b\u0438\u0431\u043e \u0434\u043e\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043b\u0438\u0431\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0430\u0440\u044f\u0434\u0443 \u0441 \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438, \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043a\u043e\u043c\u043e\u043d\u0430\u0434 \u043d\u0430\u0448\u043b\u0430 \u0441\u0432\u043e\u0451 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u0434\u0440\u0435\u0432\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c, \u0442\u0430\u043a\u0438\u043c \u043a\u0430\u043a \u043c\u0435\u043d\u044e, \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u043b\u0438 \u0433\u0438\u043f\u0435\u0440\u0442\u0435\u043a\u0441\u0442\u044b \u0442\u0438\u043f\u0430 XML. \u041d\u0430 \u043d\u0438\u0445 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0430 \u0438\u0437 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0445\u00a0<strong>\u043b\u0438\u043d\u0437\u00a0<\/strong>\u2014 \u0442\u0430\u043a\u0438\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439.<\/p>\n<h2>\u0420\u0435\u0448\u0430\u0435\u043c \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442<\/h2>\n<p>\u041b\u0430\u0431\u0438\u0440\u0438\u043d\u0442 \u043c\u044b \u0437\u0430\u043f\u0443\u0442\u0430\u043b\u0438 \u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438 \u0438 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0430\u043c\u0438, \u0430 \u0447\u0435\u043c \u0431\u044b \u0442\u0430\u043a\u0438\u043c \u043f\u043e\u043c\u0443\u0434\u0440\u00eb\u043d\u0435\u0435 \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u0443\u0442\u0430\u0442\u044c? \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0430\u0440\u043e\u0439 \u0432\u0437\u0430\u0438\u043c\u043d\u043e \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432: <strong>\u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c<\/strong> \u0438 <strong>\u043a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u043c<\/strong> (\u043a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u044f \u043b\u044e\u0431\u043b\u044e \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c). \u0410 \u0437\u0430\u043e\u0434\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u044b\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0432 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u044b, \u043d\u0435 \u0437\u0430\u0431\u043e\u0442\u044f\u0441\u044c \u043e\u0431 \u0438\u0445 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438. \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u043f\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0443 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432 \u043d\u0451\u043c \u043f\u0440\u0438\u043c\u0430\u043d\u043e\u043a, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u0412 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u043c\u0443 \u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0440\u044f\u0434 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412-\u043f\u0435\u0440\u0432\u044b\u0445, \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442 \u043d\u0430\u0434\u043e  \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u00ab\u043f\u043b\u043e\u0441\u043a\u0438\u043c\u00bb, \u0430\u00a0\u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a:<\/p>\n<pre><code class=\"haskell\">-- | \u0420\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442 \u043d\u0430 \u043d\u0430\u0431\u043e\u0440 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a flatten :: Maze -> Grid Int flatten = grid 1 . foldMap mkRow   where     mkRow =       map concat . transpose .       map \\case [(a,b,c,d)] -> [[a,b],[c,d]]                 _           -> [[1,1],[1,1]]<\/code><\/pre>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"haskell\">-- | \u0421\u043c\u0435\u0449\u0430\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 move :: Int -> Dir -> Grid a -> Grid a move n dir (Grid (a,b) g) =   Grid p' $ iterate go g !! n   where     (p', go) = case dir of       D -> ((a, b+n), forw)       U -> ((a, b-n), back)       R -> ((a+n, b), fmap forw)       L -> ((a-n, b), fmap back)  -- | \u0421\u043c\u0435\u0449\u0430\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e moveTo (a, b) = move (abs a) x . move (abs b) y   where     x = if a > 0 then R else L     y = if b > 0 then D else U  -- | \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 set :: a -> Grid a -> Grid a set x g = Grid p (Tape u (Tape l x r) d)   where Grid p (Tape u (Tape l _ r) d) = g  -- | \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u0445 setAt :: (Int, Int) -> a -> Grid a -> Grid a setAt p x = rewind . set x . moveTo p  -- | \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 rewind :: Grid a -> Grid a rewind m = moveTo (-a,-b) m   where (a,b) = pos m<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043f\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0443 \u0432\u0441\u044f\u043a\u0438\u0435 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u043c\u0435\u0447\u0430\u044f \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438, \u0438 \u0431\u0440\u043e\u0434\u0438\u0442\u044c, \u043e\u0431\u043e\u0437\u0440\u0435\u0432\u0430\u044f \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438. \u041c\u043e\u0436\u043d\u043e \u0438 \u043e \u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430\u0445 \u043f\u043e\u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u0442\u044c. <\/p>\n<p>\u0417\u0430\u0434\u0443\u043c\u043a\u0430 \u0442\u0430\u043a\u0430\u044f. \u041c\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442 \u0432 \u0434\u0435\u0440\u0435\u0432\u043e, \u0430 \u043f\u043e\u0442\u043e\u043c \u0441\u0432\u0435\u0440\u043d\u00eb\u043c \u0435\u0433\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0442\u0435\u0439, \u0432\u0435\u0434\u0443\u0449\u0438\u0445 \u043a \u043f\u0440\u0438\u043c\u0430\u043d\u043a\u0435. \u0421\u0440\u0435\u0434\u0438 \u043d\u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u044b\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439, \u0438\u043b\u0438 \u0442\u0435, \u0447\u0442\u043e \u043f\u043e \u043f\u0443\u0442\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438\u043b\u0438 \u0438\u0437\u0431\u0435\u0433\u0430\u044e\u0442 \u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0448\u0442\u0443\u043a\u0430 \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430. <\/p>\n<p>\u0414\u0435\u0440\u0435\u0432\u043e \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435, \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>Data.Tree<\/code>. \u041e\u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u00ab\u0440\u043e\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u0443\u0441\u0442\u0430\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0437 \u0443\u0437\u043b\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0446\u0435\u043b\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0435\u0442\u043e\u043a, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b, \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c. <\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e, \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0441\u0442\u0440\u043e\u044f\u0442 \u0438 \u043e\u0431\u0445\u043e\u0434\u044f\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u041d\u043e \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044d\u0442\u043e \u043d\u0435 \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434. \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u044e \u0432\u043e\u0437\u044c\u043c\u0451\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0438 \u0441\u043f\u0440\u044f\u0447\u0435\u0442 <strong>\u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c<\/strong>: \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 <em>\u043c\u0430\u043b\u043e\u0433\u043e<\/em> (\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u043e\u0433\u043e, \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e) \u0432 <em>\u0431\u043e\u043b\u044c\u0448\u043e\u0435<\/em> (\u0441\u043b\u043e\u0436\u043d\u043e\u0435, \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u043e\u0435, \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439). <\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e  \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u041e\u043d\u0430 \u0437\u0430\u0434\u0430\u00eb\u0442\u0441\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u043e\u0432, \u043c\u043d\u043e\u0433\u043e:<\/p>\n<ul>\n<li>\n<p>\u0418\u043d\u0434\u0443\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445: \u043d\u0430\u0442\u0443\u0440\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u0430, \u0441\u043f\u0438\u0441\u043a\u0438 (\u0440\u044f\u0434\u044b, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438), \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0438 \u0442. \u043f. <\/p>\n<\/li>\n<li>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u043a\u0430\u043c\u0438;<\/p>\n<\/li>\n<li>\n<p>\u041c\u0430\u0440\u043a\u043e\u0432\u0441\u043a\u0438\u0435 \u0446\u0435\u043f\u0438 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0442\u0438, <\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u044b, \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0432\u044b\u0448\u0435. <\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u0442\u0435, \u0432 \u044d\u0442\u043e\u0442 \u0448\u0438\u0440\u043e\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432\u0445\u043e\u0434\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0447\u0435\u0433\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0433\u043e. <\/p>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e. \u0414\u043b\u044f\u00a0\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u044b\u0445 \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432 \u0435\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>unfoldTree<\/code> \u0441\u00a0\u0442\u0430\u043a\u0438\u043c \u0442\u0438\u043f\u043e\u043c:<\/p>\n<pre><code class=\"haskell\">unfoldTree :: (b -> (a, [b])) -> b -> Tree a<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430-\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>b<\/code> \u0441\u0442\u0440\u043e\u0438\u0442 \u0443\u0437\u0435\u043b \u0434\u0435\u0440\u0435\u0432\u0430 \u0442\u0438\u043f\u0430 <code>a<\/code>, \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u043e\u0432\u044b\u0445 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432. \u0417\u0430\u0434\u0430\u0447\u0430 \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 <code>unfoldTree<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u00a0\u0446\u0435\u043b\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u00a0\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0439, \u0432\u0441\u044e \u043c\u0430\u0448\u0438\u043d\u0435\u0440\u0438\u044e \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044e \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430 (\u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438\u043b\u0438 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443) \u0431\u0435\u0440\u00eb\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f. <\/p>\n<p>\u041f\u043e\u0438\u0441\u043a \u0438\u0433\u043e\u043b\u043a\u0438 \u0432 \u0441\u0442\u043e\u0433\u0435 \u0441\u0435\u043d\u0430 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043e\u0431\u0445\u043e\u0434\u0430 \u0441\u0442\u043e\u0433\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443, \u0441\u043d\u0438\u043c\u0430\u044f \u0441\u043b\u043e\u0439 \u0437\u0430 \u0441\u043b\u043e\u0435\u043c. \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u0438 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>unfoldTree<\/code>.  \u0412\u043e\u0442 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0448\u0435 \u0434\u0435\u0440\u0435\u0432\u043e:<\/p>\n<pre><code class=\"haskell\">-- | \u0410\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0442\u0435\u0439 mkTree' :: Grid Int -> Tree ([Dir], Int) mkTree' m = unfoldTree step (m, [], empty)  step (m, ds, visited) =   let res = [ (m', d':ds, insert (pos m) visited)             | (d', n) &lt;- neigbours m             , n \/= 1             , let m' = move 1 d' m             , notMember (pos m') visited ]   in ((ds, extract m), res)<\/code><\/pre>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442,  \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0441\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439. \u041f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u0438\u0442 \u043d\u0430 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043f\u0438\u0441\u043e\u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c \u043f\u043e\u0438\u0441\u043a\u0430. <\/p>\n<p>\u0428\u0442\u0440\u0438\u0445 \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u043e\u043c, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u00eb \u043c\u044b \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c\u0441\u044f. \u042d\u0442\u043e \u0432\u0435\u0440\u043d\u043e\u0435, \u043d\u043e \u043f\u043b\u043e\u0445\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443\u0447\u0451\u0442 \u043f\u043e\u0441\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0435\u0442\u043a\u0430 \u0432\u0435\u0434\u0451\u0442 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435, \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044f\u0441\u044c \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u0414\u0430\u0436\u0435 \u043d\u0430 \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430\u0445 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0442\u043e\u0440\u043d\u043e\u043c\u0443 \u0432\u0437\u0440\u044b\u0432\u0443 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u0434\u043e \u043a\u0430\u043a-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0441\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u043a\u043b\u0435\u0442\u043e\u043a \u043e\u0431\u0449\u0438\u043c. <\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043c\u043e\u043d\u0430\u0434\u043e\u0439 <code>State<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u0445 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0431\u0435\u0437 \u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u042d\u0442\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 <code>unfoldTree<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>unfoldTreeM<\/code> \u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"haskell\">-- | \u041c\u043e\u043d\u0430\u0434\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u0432 \u0434\u0435\u0440\u0435\u0432\u043e \u043f\u0443\u0442\u0435\u0439 mkTree :: Grid Int -> Tree ([Dir], Int) mkTree m = unfoldTreeM_BF stepM (m, []) `evalState` empty  stepM (m, ds) = do   visited &lt;- get  -- ^ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0441\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430   let res = [ (m', d':ds)             | (d', n) &lt;- neigbours m             , n \/= 1             , let m' = move 1 d' m             , notMember (pos m') visited ]   modify $ insert (pos m)  -- ^ \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442   return ((ds, extract m), res)<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u044f\u0432\u043d\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u00a0\u0443\u0436\u0435 \u043f\u043e\u0441\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u044f\u0447\u0435\u0435\u043a \u0432\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>stepM<\/code>, \u0430\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e, \u043a\u0430\u043a\u00a0\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044f \u0435\u0433\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>get<\/code> \u0438 \u043c\u0435\u043d\u044f\u044f \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>modify<\/code>. \u041d\u0430\u00a0\u0441\u0430\u043c\u043e\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0443\u0441\u0442\u043e\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0443 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>runState<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u043d\u0430\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438\u0437 \u043c\u043e\u043d\u0430\u0434\u044b.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u043e\u0432. \u041d\u043e \u0447\u0442\u043e \u043d\u0430\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c\u0438 \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c\u0438? \u0415\u0441\u043b\u0438 \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u043b \u043c\u0430\u043b\u043e\u0435 \u0432 \u0431\u043e\u043b\u044c\u0448\u043e\u0435, \u0442\u043e \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0435\u043c\u0443 \u043a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0432 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0441\u0443\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430 \u0447\u0438\u0441\u0435\u043b \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 (\u0441\u043f\u0438\u0441\u043e\u043a) \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0447\u0438\u0441\u043b\u043e. \u0422\u0430\u043a\u0436\u0435 \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0430, \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0438\u0441\u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438\u043d\u0430\u0447\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 <em>\u0441\u0432\u00eb\u0440\u0442\u043a\u043e\u0439<\/em>. <\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0434\u0438\u043d \u044f\u0440\u043a\u0438\u0439, \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u0432\u0441\u0451\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u0438 \u0434\u0432\u043e\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0435\u043c\u0443 \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0447\u0438\u0441\u0435\u043b. \u0427\u0438\u0441\u043b\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0432\u0435\u0449\u044c \u0432 \u0441\u0435\u0431\u0435, \u0442\u043e\u0433\u0434\u0430 \u043a\u0430\u043a \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u0446\u0438\u0444\u0440 \u0432 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430: \u043c\u043e\u0434\u0443\u043b\u044f \u043d\u0430\u0434 \u043a\u043e\u043b\u044c\u0446\u043e\u043c \u0432\u044b\u0447\u0435\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0446\u0438\u0444\u0440. \u0412\u043e\u0442 \u0434\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0449\u0438\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0446\u0438\u0444\u0440\u044b (\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u043c\u0443) \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442:<\/p>\n<pre><code class=\"haskell\">toDigits :: Int -> Int -> [Int] toDigits base = unfoldr step   where     step n = case divMod n base of       (0, 0) -> Nothing       (r, q) -> Just (q, r)  fromDigits :: Int -> [Int] -> Int fromDigits base = foldr (\\d n -> d + base*n) 0<\/code><\/pre>\n<p>\u041d\u043e \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0430\u0448\u0438\u043c \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u043c. \u041a\u0430\u043a \u0438 \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0445 \u0441\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c? \u0417\u0434\u0435\u0441\u044c \u044f \u043c\u0435\u043b\u044c\u043a\u043e\u043c \u0443\u043f\u043e\u043c\u044f\u043d\u0443 \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u2014 <em>\u043f\u043e\u043b\u0443\u0433\u0440\u0443\u043f\u043f\u0443 \u0441 \u0435\u0434\u0438\u043d\u0438\u0446\u0435\u0439<\/em> \u0438\u043b\u0438 <strong>\u043c\u043e\u043d\u043e\u0438\u0434<\/strong>. <\/p>\n<p>\u042d\u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e (\u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445), \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <code>(&lt;>)<\/code> \u0438 \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u0435\u0434\u0438\u043d\u0438\u0446\u0430, \u0438\u043b\u0438 <code>mempty<\/code>). \u0410\u0441\u0441\u043e\u0446\u0438\u0430\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u00eb\u0442 \u043d\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0435 \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 (\u043d\u043e \u043d\u0435 \u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432), \u0430 \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0440\u0435\u0448\u0430\u0435\u043c\u043e\u0439 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f\u043c\u0438. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043a\u0438\u0439 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0438\u0437 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u043e\u043d\u043e\u0438\u0434 \u0438 \u0441 \u0435\u0433\u043e \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0435\u0448\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0430\u0434\u0440\u0435\u0441\u0443\u044f \u0438\u0445 \u0442\u0438\u043f\u0430\u043c \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u0412\u043e\u0442 \u0447\u0442\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443. <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0447\u0438\u0441\u0435\u043b. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c <code>foldMap<\/code>  \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b-\u043c\u043e\u043d\u043e\u0438\u0434\u044b \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0439\u0442\u0438 \u0440\u044f\u0434 \u0435\u0433\u043e \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a:<\/p>\n<pre><code class=\"haskell\">\u03bb> a = [2,3,1,5,13,2,6,8,4] :: [Int] \u03bb> foldMap Sum a Sum {getSum = 44} \u03bb> foldMap Product a Product {getProduct = 149760} \u03bb> foldMap Min a Min {getMin = 1} \u03bb> foldMap (Any . odd) a Any {getAny = True} \u03bb> foldMap (First . (\\x -> if odd x then Just x else Nothing)) a First {getFirst = Just 3} \u03bb> foldMap (Last . (\\x -> if odd x then Just x else Nothing)) a Last {getLast = Just 13}<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0438 \u0442\u0438\u043f\u044b <code>Sum<\/code>, <code>Product<\/code>, <code>Min<\/code>, <code>Any<\/code>, <code>First<\/code> \u0438 <code>Last<\/code> \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442. \u041e\u043d\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043c\u0435\u0447\u0430\u044e\u0442 \u0447\u0438\u0441\u043b\u0430, \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044f \u0432\u00a0\u043a\u0430\u043a\u043e\u043c \u043c\u043e\u043d\u043e\u0438\u0434\u0435 \u043c\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c \u0441\u0432\u0451\u0440\u0442\u043a\u0443. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0432\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 <code>Semigroup<\/code> \u0438 <code>Monoid<\/code> \u0434\u043b\u044f\u00a0\u044d\u0442\u0438\u0445 \u0442\u0438\u043f\u043e\u0432. \u0422\u043e\u0447\u043d\u043e \u0442\u0430\u043a\u043e\u0439\u00a0\u0436\u0435 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043b\u044f\u00a0\u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430. \u0412\u043e\u0442 \u043a\u0430\u043a\u00a0\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u00a0\u043d\u0430\u0448\u0435\u0433\u043e \u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0443\u0442\u0438 \u0434\u043e\u00a0\u0446\u0435\u043b\u0438:<\/p>\n<pre><code class=\"haskell\">-- | \u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430 \u043f\u0443\u0442\u0435\u0439 \u043a \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043b\u0438 pathTo :: Int -> Grid Int -> Tree (Maybe [Dir]) pathTo s =   fmap (\\(p, x) -> if x == s then Just p else Nothing) . mkTree  -- | \u041a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0443\u0442\u0435\u0439 (\u043c\u043e\u043d\u043e\u0438\u0434 []) allPaths :: Int -> Grid Int -> [[Dir]] allPaths s = foldMap maybeToList . pathTo s  -- | \u041a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043f\u0435\u0440\u0432\u044b\u0439 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c (\u043c\u043e\u043d\u043e\u0438\u0434 First) firstPath :: Int -> Grid Int -> Maybe [Dir] firstPath s = getFirst . foldMap First . pathTo s<\/code><\/pre>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0432 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f  <code>Path<\/code>  \u0434\u043b\u044f \u043f\u0443\u0442\u0435\u0439 \u0432 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0435, \u0438 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0434\u043b\u044f \u043f\u0443\u0442\u0435\u0439, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439 \u043f\u0443\u0442\u044c:<\/p>\n<pre><code class=\"haskell\">newtype Path = Path {getPath :: [Dir]}   deriving (Eq, Show)  instance Ord Path where   compare (Path a) (Path b) = comparing length a b  -- | \u041a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0434\u0435\u0440\u0435\u0432\u0430 \u0432 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0438\u0439 \u043f\u0443\u0442\u044c (\u043c\u043e\u043d\u043e\u0438\u0434 Min) shortestPath :: Int -> Grid Int -> Maybe [Dir] shortestPath s =    fmap (getPath . getMin) . foldMap (Min . Path &lt;$>) . pathTo s<\/code><\/pre>\n<p>\u0412\u043f\u0440\u043e\u0447\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0435\u0439 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, <code>firstPath<\/code>  \u0432\u0435\u0440\u043d\u0451\u0442 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0443\u0442\u0435\u0439 \u043f\u043e \u0434\u043b\u0438\u043d\u0435.<\/p>\n<p>\u041a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u0435\u043d \u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0439\u0442\u0438 \u043f\u043e \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0443\u0442\u0438 \u0432 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0435, \u043f\u043e\u043c\u0435\u0447\u0430\u044f \u0435\u0433\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<pre><code class=\"haskell\">markPath :: Int -> Grid Int -> [Dir] -> Grid Int markPath x m =   rewind . foldr (\\d -> move 1 d . set x) m<\/code><\/pre>\n<p>\u041d\u0443 \u0447\u0442\u043e, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a \u043e\u043d \u0440\u0435\u0448\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"haskell\">main = do   maze &lt;- flatten &lt;$> buildMaze n 400 1   let m = set 0 $ moveTo (-1,0) $ setAt (2*n-1,2*n-1) 2 maze       path = fromMaybe [] $ firstPath 2 m       m' = moveTo (-1,-1) $ markPath 3 m path   mapM_ (putStrLn . concat) $ takeG (2*n+2) $ toChar m'   where     n = 12     toChar = fmap \\case       1 -> \"\u2591\u2591\"       2 -> \"\\ESC[93m\u2588\u2588\\ESC[0m\"       3 -> \"\\ESC[31m**\\ESC[0m\"       _ -> \"  \"<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bdd\/9e6\/b90\/bdd9e6b9051a07f9de2ff43aaea6f489.png\" width=\"704\" height=\"824\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bdd\/9e6\/b90\/bdd9e6b9051a07f9de2ff43aaea6f489.png\"\/><\/figure>\n<p>\u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 <a href=\"https:\/\/hub.darcs.net\/samsergey\/maze\" rel=\"noopener noreferrer nofollow\">https:\/\/hub.darcs.net\/samsergey\/maze<\/a><\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/787718\/\"> https:\/\/habr.com\/ru\/articles\/787718\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0430\u00a0\u0443\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u043d\u0435\u0434\u0435\u043b\u0435 \u043c\u043d\u0435 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u0430\u044f, \u0445\u043e\u0442\u044c \u0438 \u043d\u0435\u00a0\u043d\u043e\u0432\u0430\u044f \u043c\u0438\u043d\u0438\u2011\u0441\u0435\u0440\u0438\u044f \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430\u00a0\u0414\u0437\u0435\u043d\u2011\u043a\u0430\u043d\u0430\u043b\u0435 <a href=\"https:\/\/dzen.ru\/zdgzdgzdg\" rel=\"noopener noreferrer nofollow\">@zdgzdgzdg<\/a> \u043f\u0440\u043e\u00a0\u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u043d\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u00ab<a href=\"https:\/\/dzen.ru\/a\/YshmTeVn9lbK7V3r\" rel=\"noopener noreferrer nofollow\">\u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0430 \u0432\u043e\u043b\u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438<\/a>\u00bb. \u041f\u043e\u043a\u0430 \u044f \u0447\u0438\u0442\u0430\u043b \u044d\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u0438\u043b\u0441\u044f \u0441\u00a0\u043a\u043e\u0434\u043e\u043c, \u043c\u0435\u043d\u044f \u043e\u0441\u0435\u043d\u0438\u043b\u043e: \u0432\u0435\u0434\u044c \u044d\u0442\u043e\u00a0\u0436\u0435 <strong>\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0432\u00a0\u043a\u043e\u043c\u043e\u043d\u0430\u0434\u0435, \u043f\u043e\u0433\u0440\u0443\u0436\u0451\u043d\u043d\u044b\u0435 \u0432\u00a0\u043c\u043e\u043d\u0430\u0434\u0443<\/strong>! \u042f \u043d\u0435\u00a0\u0438\u0437\u0434\u0435\u0432\u0430\u044e\u0441\u044c, \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043e\u00a0\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0434\u0432\u0443\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u044b  <code>Zipper<\/code>, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0439 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438 \u043c\u043e\u043d\u0430\u0434\u044b  <code>Random<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0435\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b.<\/p>\n<p>\u0418 \u0432\u043e\u0442, \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u043b\u043e\u0432\u0441\u0442\u0432\u0430 \u043d\u0430\u00a0\u0432\u044b\u0445\u043e\u0434\u043d\u044b\u0445, \u044f \u0440\u0435\u0448\u0438\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u00ab\u043a\u0432\u0430\u043d\u0442\u043e\u0432\u044b\u0439\u00bb \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u043e\u0432 \u043d\u0430\u00a0Haskell, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u044b \u0438 \u043c\u043e\u043d\u0430\u0434\u044b, \u0438 \u0432\u043e\u043e\u0431\u0449\u0435, \u043d\u0438 \u0432\u00a0\u0447\u00eb\u043c \u0441\u0435\u0431\u0435 \u043d\u0435\u00a0\u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044f. \u0418 \u0445\u043e\u0442\u044f \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f Haskell \u043d\u0443\u0436\u0435\u043d \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0439, \u043d\u043e\u00a0\u0438\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f\u00a0\u043d\u0438\u0445 \u043e\u043d \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e! <\/p>\n<p>\u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u2011\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435 <em>code\u2011golf<\/em> (\u0442\u043e \u0435\u0441\u0442\u044c, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430) \u0438 \u043d\u0435\u00a0\u043f\u043e\u0438\u0441\u043a \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0430 <em>proof of concept<\/em>: \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0446\u0438\u0435\u0439 \u043c\u043e\u043d\u0430\u0434\u044b \u0438 \u043a\u043e\u043c\u043e\u043d\u0430\u0434\u044b.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043b\u0435\u043d\u044c \u0447\u0438\u0442\u0430\u0442\u044c, \u0438\u043b\u0438\u00a0\u0441\u0442\u0440\u0430\u0448\u043d\u043e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0434 \u043d\u0430\u00a0Haskell, \u043e\u0431\u044a\u044f\u0441\u043d\u044e \u0432\u00a0\u0434\u0432\u0443\u0445 \u0441\u043b\u043e\u0432\u0430\u0445 \u0441\u0443\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u041c\u044b \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0441\u00eb, \u0447\u0442\u043e\u00a0\u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430, \u0430\u00a0\u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u00ab\u0432\u043e\u043b\u0448\u0435\u0431\u0441\u0442\u0432\u043e\u00bb \u043a\u043e\u043c\u043e\u043d\u0430\u0434 \u0438 \u043c\u043e\u043d\u0430\u0434 \u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u2011\u043f\u0435\u0440\u0432\u044b\u0445, \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u00a0\u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439, \u0442\u043e \u0435\u0441\u0442\u044c, \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u00a0\u0432\u0435\u0441\u044c, \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442, \u0430\u00a0\u0432\u043e\u2011\u0432\u0442\u043e\u0440\u044b\u0445, \u0433\u043b\u0430\u0434\u043a\u043e \u043f\u0440\u043e\u0442\u0430\u0449\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u044d\u0442\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0430\u043d\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0438 \u043a\u0430\u0442\u0430\u043c\u043e\u0440\u0444\u0438\u0437\u043c\u044b \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u044b\u0441\u043a\u0430\u0442\u044c \u0432\u044b\u0445\u043e\u0434 \u0438\u0437\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430.<\/p>\n<h2>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442<\/h2>\n<p>\u041a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043d\u0435\u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u044f\u0447\u0435\u0435\u043a, \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u00a0\u0443\u0447\u0451\u0442\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438. \u041e\u043d \u0445\u043e\u0440\u043e\u0448\u043e \u0438 \u0441\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430\u043c\u0438 \u043e\u043f\u0438\u0441\u0430\u043d \u0432\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0432\u044b\u0448\u0435 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u0438 \u0435\u0433\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0442\u044b\u0441\u043a\u0430\u0442\u044c \u0432\u00a0YouTube. \u0421\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c, \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043c\u0430\u0441\u0441\u0438\u0432 \u0441\u00a0\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c&#8230; \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u0447\u0438\u0441\u0442\u043e\u0433\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e \u0447\u0438\u0441\u0442\u043e\u0435 \u0438\u0437\u0434\u0435\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u0438 \u043f\u043e\u0432\u043e\u0434 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c\u00a0\u043b\u0438\u0431\u043e \u044f\u0437\u044b\u043a,\u00a0\u043b\u0438\u0431\u043e \u0437\u0430\u0434\u0430\u0447\u0443. \u041d\u043e\u00a0\u043d\u0435\u00a0\u0442\u0443\u0442\u2011\u0442\u043e\u00a0\u0431\u044b\u043b\u043e! \u0412\u044b\u0437\u043e\u0432 \u043f\u0440\u0438\u043d\u044f\u0442!<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u043c\u043d\u043e\u0439 \u0437\u0430\u0443\u043c\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (DDD), \u0442\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u0441\u00a0\u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0445 \u0442\u0438\u043f\u043e\u0432. <\/p>\n<p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u0443\u0434\u0443\u0449\u0435\u0433\u043e \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043c \u0447\u0435\u0442\u0432\u00eb\u0440\u043a\u043e\u0439 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u044e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u044f\u0447\u0435\u0439\u043a\u0438. \u0421\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0447\u0442\u043e\u00a0\u044f \u0438\u043c\u0435\u044e \u0432\u00a0\u0432\u0438\u0434\u0443:<\/p>\n<pre><code class=\"haskell\">-- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 type Cell = ( Int, Int             , Int, Int )   showCell :: Cell -> String showCell = \\case   (1,0,0,0) -> \"\u2580 \"   (0,1,0,0) -> \" \u2580\"   (0,0,1,0) -> \"\u2584 \"   (0,0,0,1) -> \" \u2584\"   (1,1,0,0) -> \"\u2580\u2580\"   (0,1,0,1) -> \" \u2588\"   (1,0,1,0) -> \"\u2588 \"   (0,0,1,1) -> \"\u2584\u2584\"   _         -> \"  \"<\/code><\/pre>\n<p>\u0412\u0441\u044f \u0441\u043e\u043b\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430  \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u044f\u0447\u0435\u0439\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0443\u043f\u0435\u0440\u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"haskell\">-- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044f\u0447\u0435\u0439\u043a\u0438 type State = [Cell]       -- | \u0421\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043b\u0435\u0442\u043e\u043a \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430. states :: State states = [ (0,0,0,1), (0,0,1,0)          , (0,1,0,0), (1,0,0,0)          , (0,0,1,1), (0,1,0,1)          , (1,0,1,0), (1,1,0,0) ]  showState :: State -> String showState = \\case   []  -> \"\u2591\u2591\"   [x] -> showCell x   xs  -> show (length xs) &lt;> \" \"<\/code><\/pre>\n<p>\u041e\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u043a\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u043e\u0447\u0435\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c. \u0412 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u043e\u0439 \u0432\u044b\u0448\u0435 \u0441\u0442\u0430\u0442\u044c\u0435 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u043c\u044b \u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e-\u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442:<\/p>\n<pre><code class=\"haskell\">-- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f data Dir = R | L | U | D    deriving (Eq, Show)  -- | \u041f\u0440\u0435\u0434\u0438\u043a\u0430\u0442 \u0441\u043c\u0435\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u043b\u0435\u0442\u043e\u043a \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c adjacent :: Dir -> Cell -> Cell -> Bool adjacent R (_,a,_,b) (c,_,d,_) = a*c + b*d \/= 0 adjacent D (_,_,a,b) (c,d,_,_) = a*c + b*d \/= 0 adjacent L a b = adjacent R b a adjacent U a b = adjacent D b a<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0440\u0435\u0434\u0438\u043a\u0430\u0442\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432\u0434\u043e\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u044b\u043a\u043e\u0432\u043a\u0430 \u044f\u0447\u0435\u0435\u043a. \u0414\u043b\u044f\u00a0\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u00eb\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u0438\u043f\u2011\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 <code>Dir<\/code>.<\/p>\n<p>\u041a\u043e\u043d\u0446\u0435\u043f\u0442\u0443\u0430\u043b\u044c\u043d\u043e, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0447\u0430\u0441\u0442\u0435\u0439: \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438 \u0441\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439, \u0442\u043e \u0435\u0441\u0442\u044c, \u0438\u043c\u0435\u044e\u0449\u0435\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u0438. \u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0435\u00eb \u0441\u043e\u0441\u0435\u0434\u0435\u0439. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0444\u0438\u043a\u0441\u0430\u0446\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043e\u0434\u043d\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445. \u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435 \u0447\u0430\u0441\u0442\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438.<\/p>\n<pre><code class=\"haskell\">-- | \u0414\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439 adjust :: State -> [(Dir, State)] -> State adjust = \\cases {-1-} []    []  -> [] {-2-} [x]   _   -> [x] {-3-} []    nbs -> adjust states nbs {-4-} state nbs -> let         res = nub [ s | s &lt;- state                   , (d, nb) &lt;- nbs                   , any (adjacent d s) nb ]         in if length res == 8 then [] else res<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439, \u0441\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u00a0\u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0437\u00a0\u043d\u0438\u0445. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0441\u043e\u0441\u0435\u0434\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e. \u0412\u00a0\u0442\u0435\u043b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043b\u0435\u0442\u043a\u0438 \u0438 \u0435\u0451 \u0441\u043e\u0441\u0435\u0434\u0435\u0439.<\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0438 \u044f\u0447\u0435\u0439\u043a\u0430, \u043d\u0438 \u0435\u0451 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u043e\u043d\u0430 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u00a0\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u0441\u043e\u0441\u0435\u0434\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438 \u043d\u0435\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e, \u043d\u043e\u00a0\u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0438\u0437\u00a0\u0441\u043e\u0441\u0435\u0434\u0435\u0439 \u0443\u0436\u0435 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0438\u043b\u0438\u00a0\u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043a\u043e\u043b\u043b\u0430\u043f\u0441\u0438\u0440\u043e\u0432\u0430\u043b\u0438, \u0442\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043a\u0430\u043a\u00a0\u0441\u0443\u043f\u0435\u0440\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0449\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442 \u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0443\u044e\u0442\u0441\u044f \u0441\u00a0\u0441\u043e\u0441\u0435\u0434\u044f\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u043a\u0430\u043a\u00a0\u0432\u00a0Python. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0435\u0441\u043b\u0438 \u0432\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u0445\u043e\u0434\u044f\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b, \u0442\u043e \u043c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0447\u0438\u0441\u043b\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043b\u0435\u0442\u043a\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u043b\u043e\u0441\u044c, \u043d\u0430\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u0437\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432. \u042d\u0442\u0438\u043c \u0437\u0430\u0439\u043c\u0451\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>collapse<\/code>:<\/p>\n<pre><code class=\"haskell\">-- | \u0421\u0442\u043e\u0445\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 collapse :: Rational -> State -> Random State collapse p = \\case {-1-} [x]   -> return [x] {-2-} []    -> do x &lt;- uniform states                   fromList [([x], p), ([], 1)] {-3-} state -> do x &lt;- uniform state                   return [x]<\/code><\/pre>\n<p>\u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c <code>p<\/code> \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438. \u041f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0442\u0440\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ol>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u00a0\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438, \u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u00a0\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0445\u043b\u043e\u043f\u043d\u0443\u0442\u044c\u0441\u044f \u0432\u00a0\u043e\u0434\u043d\u043e \u0438\u0437\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u041e\u00a0\u0442\u043e\u043c, \u0437\u0430\u0447\u0435\u043c \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u044f \u0441\u043a\u0430\u0436\u0443 \u043f\u043e\u0437\u0436\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f\u00a0\u0441\u0443\u043f\u0435\u0440\u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043e\u0434\u043d\u043e \u0438\u0437\u00a0\u043d\u0438\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u0422\u0438\u043f \u044d\u0442\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0435\u0451 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u00a0\u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044f\u0447\u0435\u0439\u043a\u0438, \u0430\u00a0\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>uniform<\/code>  \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0438\u0437\u00a0\u0441\u043f\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0441\u0447\u0438\u0442\u0430\u044f, \u0447\u0442\u043e\u00a0\u0432\u0441\u0435 \u043e\u043d\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e. \u0410\u00a0\u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>fromList<\/code>  \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u00a0\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044f\u043c\u0438.<\/p>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0441\u0442\u0435\u043d\u043e\u043a \u0432\u00a0\u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0440\u043e\u0441\u0442, \u043e\u043a\u0440\u0443\u0436\u0430\u044f \u0441\u0435\u0431\u044f \u043a\u043b\u0435\u0442\u043a\u0430\u043c\u0438, \u043d\u0435\u00a0\u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0439. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430, \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u044f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c\u044e, \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430. \u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>fromList<\/code>.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0432\u0441\u00eb \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435\u00a0\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u044f\u0437\u044b\u043a\u0430 Haskell. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0443\u0442 \u043f\u043e\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435\u00a0\u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c. \u041f\u043e\u0440\u0430, \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u0435\u0433\u043e \u043f\u0440\u0438\u0447\u0443\u0434\u043b\u0438\u0432\u044b\u0439 \u043c\u0438\u0440!<\/p>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>adjust<\/code> \u0438 <code>collapse<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 <em>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b<\/em>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043e\u043d\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043e\u0434\u043d\u043e\u0439 \u044f\u0447\u0435\u0439\u043a\u0438 \u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0435\u0451 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0435\u0434\u0435\u0439. \u042d\u0442\u043e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0435\u043d \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0430\u0434\u0430\u0447:<\/p>\n<ul>\n<li>\n<p>\u043a\u043b\u0435\u0442\u043e\u0447\u043d\u044b\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u043e\u0432 \u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439,<\/p>\n<\/li>\n<li>\n<p>\u0441\u0432\u00eb\u0440\u0442\u043a\u0438 \u0438 \u043a\u043e\u0440\u0440\u0435\u043b\u044f\u0446\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u044f\u0434\u043e\u0432,<\/p>\n<\/li>\n<li>\n<p>\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043c\u0430\u0442\u0444\u0438\u0437\u0438\u043a\u0438 (\u0442\u0438\u043f\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0435\u0439),<\/p>\n<\/li>\n<li>\n<p>\u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u0441 \u0432\u0437\u0430\u0438\u043c\u043d\u044b\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 (spreadsheets, \u043a\u0430\u043a \u0432 Lotus \u0438\u043b\u0438 Excell) \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430\u0434\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0<code>adjust<\/code>\u00a0\u043d\u0430 \u0432\u0441\u00eb \u043f\u043e\u043b\u0435. \u041e\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432\u0435\u0441\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u044f\u0447\u0435\u0435\u043a \u043b\u0430\u0431\u0438\u0440\u0438\u043d\u0442\u0430 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438, \u043d\u0430\u043c, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043d\u0443\u0436\u0435\u043d \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043e\u0441\u0435\u0434\u044f\u043c.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043d\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f\u00a0<em>\u0437\u0438\u043f\u043f\u0435\u0440\u043e\u043c<\/em>\u00a0\u0438\u043b\u0438\u00a0\u043b\u0435\u043d\u0442\u043e\u0439\u00a0(<code>Tape<\/code>). \u041e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u0440\u0430\u0437\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043d\u0430 \u0447\u0430\u0441\u0442\u0438, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u2014 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043b\u0435\u043d\u0442\u044b. \u0412 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0435 \u044d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0438 \u043f\u043e\u0437\u0430\u0434\u0438 \u043d\u0435\u0433\u043e.<\/p>\n<pre><code class=\"haskell\">-- | \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u043b\u0435\u043d\u0442\u0430 \u0441 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c. data Tape a = Tape [a] a [a]  -- |  \u041a\u0443\u0440\u0441\u043e\u0440 \u0438 \u0435\u0433\u043e \u0441\u043e\u0441\u0435\u0434\u0438 cursor (Tape _ x _) = x viscinity (Tape (b:_) _ (f:_)) = (b, f)  -- | \u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e \u043b\u0435\u043d\u0442\u0435 back (Tape (a:as) x bs    ) = Tape as     a (x:bs) forw (Tape as     x (b:bs)) = Tape (x:as) b bs<\/code><\/pre>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u043d\u0442\u044b, \u0434\u043b\u044f \u043d\u0435\u0451 \u043b\u0435\u0433\u043a\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0440\u044f\u0434 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439: \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u0443\u0440\u0441\u043e\u0440\u0443 \u0438 \u043a \u0435\u0433\u043e \u0441\u043e\u0441\u0435\u0434\u044f\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0432\u0438\u0433 \u043a\u0443\u0440\u0441\u043e\u0440\u0430 \u0432\u043f\u0435\u0440\u00eb\u0434 \u0438 \u043d\u0430\u0437\u0430\u0434. \u0412 \u044d\u0442\u0438\u0445 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0437\u0446\u043e\u043c, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u043b\u0435\u043d\u0442\u044b. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u043c \u0435\u0449\u0451 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043b\u0435\u043d\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<pre><code class=\"haskell\">-- | \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043b\u0435\u043d\u0442\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 tape :: a -> [a] -> Tape a tape d xs =   forw $ Tape (repeat d) d (xs ++ repeat d)  -- | \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043a\u0430 \u043b\u0435\u043d\u0442\u044b \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 takeT :: Int -> Tape a -> [a] takeT n (Tape _ x xs) = take n (x:xs)<\/code><\/pre>\n<p>\u041d\u0430 \u0431\u0430\u0437\u0435 \u043b\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u043e\u0438\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u043c \u0438\u043b\u0438 \u0440\u0435\u0448\u0451\u0442\u043a\u043e\u0439 (<code>Grid<\/code>). \u042d\u0442\u043e \u043b\u0435\u043d\u0442\u0430, \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043b\u0435\u043d\u0442\u044b:<\/p>\n<pre><code class=\"haskell\">-- | \u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438. data Grid a = Grid { pos     :: (Int, Int)                    , getGrid :: Tape (Tape a) }  -- | \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u043b\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e  \u0438 \u0441\u043f\u0438\u0441\u043a\u043e\u043c  \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439. grid :: a -> [[a]] -> Grid a grid d = Grid (0,0) .<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-365847","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/365847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=365847"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/365847\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=365847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=365847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=365847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}