{"id":332645,"date":"2022-04-30T21:00:27","date_gmt":"2022-04-30T21:00:27","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=332645"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=332645","title":{"rendered":"<span>\u0418\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0440\u0443\u0442\u0444\u043e\u0440\u0441: \u043f\u0438\u0448\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443 \u0438 \u0441\u043e\u043b\u0432\u0435\u0440 \u0434\u043b\u044f \u043d\u0435\u0451<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/lr\/rs\/oi\/lrrsoigqli7_jgtiwmzpbb21z_y.png\" data-src=\"https:\/\/habrastorage.org\/webt\/lr\/rs\/oi\/lrrsoigqli7_jgtiwmzpbb21z_y.png\"\/><\/div>\n<p>  <\/p>\n<h2>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>  \u0412 \u043a\u043e\u043b\u043b\u0435\u0434\u0436\u0435 \u044f \u043c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u0430\u043b \u0432 <em>\u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438<\/em>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0434 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430\u043c\u0438 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0437\u043a\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0438\u0445 \u0438\u0433\u0440. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432:<\/p>\n<ul>\n<li><a href=\"https:\/\/store.steampowered.com\/app\/353540\/Stephens_Sausage_Roll\/\">Stephen&#8217;s Sausage Roll<\/a><\/li>\n<li><a href=\"https:\/\/store.steampowered.com\/app\/207570\/English_Country_Tune\/\">English Country Tune<\/a><\/li>\n<li><a href=\"https:\/\/store.steampowered.com\/app\/290260\/Sokobond\/\">Sokobond<\/a><\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043d\u0435 \u043f\u043e\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0438\u043b\u043e\u0441\u044c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u041f\u043e\u043b\u0438\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0435 \u0420\u0435\u043d\u0441\u0441\u0435\u043b\u0435\u0440\u0430, \u0433\u0434\u0435 \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u043e\u0440\u0430 \u041a\u0430\u0442\u043b\u0435\u0440\u0430 (\u043f\u0440\u0438\u0432\u0435\u0442, \u0411\u0430\u0440\u0431!) \u0435\u0436\u0435\u0433\u043e\u0434\u043d\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e <em>\u0441\u043e\u043b\u0432\u0435\u0440\u0430 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a<\/em>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0433\u043e\u0434 \u0438\u0433\u0440\u0430 \u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c, \u0438 \u0432 \u043c\u043e\u0439 \u0433\u043e\u0434 \u044d\u0442\u043e \u0431\u044b\u043b\u0430 <a href=\"https:\/\/www.cs.rpi.edu\/academics\/courses\/fall13\/csci1200\/hw\/06_ricochet_robots\/hw.pdf\">Ricochet Robots<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u043e\u0439 \u0441\u043e \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043b\u044c\u0434\u0443 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u041c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 (\u0438 \u044f \u043f\u043e\u0431\u0435\u0434\u0438\u043b \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0438!), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>  \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0432\u0441\u0435\u0445 \u0441 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439 \u0438 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043b\u0438 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0412 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043c\u043e\u0433\u043b\u0438 \u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c, \u0438\u043b\u0438 \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0435\u043b \u0433\u043b\u0443\u0431\u0438\u043d\u044b; \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u042f \u043c\u043d\u043e\u0433\u043e\u043c\u0443 \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043a\u0443\u0447\u0443 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0410\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u043d\u043e\u0432\u0443\u044e \u0438\u0433\u0440\u0443-\u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443 \u0438 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u0442\u0435\u0445\u043d\u0438\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u0439 \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043b\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043d\u0435\u0451. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0435\u043c\u044b: \u043f\u043e\u0438\u0441\u043a \u0432 \u0448\u0438\u0440\u0438\u043d\u0443\/\u043f\u043e\u0438\u0441\u043a A*, \u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u044f, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0438 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a NP-\u0442\u0440\u0443\u0434\u043d\u044b\u043c \u0438 NP-\u043f\u043e\u043b\u043d\u044b\u043c \u0438\u0433\u0440\u0430\u043c-\u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438\u043b\u0438 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f, \u0442\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u044c\u0442\u0435 issue \u0438\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u044c\u0442\u0435 PR <a href=\"https:\/\/github.com\/djkoloski\/davidkoloski_me\">\u043d\u0430 GitHub<\/a>. \u042f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0449\u0438\u0435 \u043c\u043e\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b. \u041f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u043e\u0447\u043d\u044b\u043c\u0438, \u0430 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u0440\u044c\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0432\u0435\u043b\u0438\u0447\u0438\u043d\u043e\u0439 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0448\u0443\u043c\u0430.<\/p>\n<p>  \u0411\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0434\u043e \u0438 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u043e\u0447\u043d\u043e\u0435 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435.<\/p>\n<h2>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u044b\u0433\u0440\u0430\u0435\u043c \u0432 \u0438\u0433\u0440\u0443<\/h2>\n<p>  \u0418\u0433\u0440\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0433\u0440\u0430\u0442\u044c, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00abAnima\u00bb. \u0412 \u043d\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u0442\u043a\u0430 \u0438\u0437 \u0442\u0430\u0439\u043b\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u0438\u043b\u0438 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0430\u0439\u043b\u044b \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u0446\u0432\u0435\u0442\u043d\u044b\u043c \u0440\u043e\u043c\u0431\u043e\u043c; \u044d\u0442\u0438 \u0442\u0430\u0439\u043b\u044b \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f <em>\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u043c\u0438 \u0442\u043e\u0447\u043a\u0430\u043c\u0438<\/em> \u0438 \u0447\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u0435 \u044d\u0442\u0438 \u0442\u0430\u0439\u043b\u044b <em>\u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438<\/em> \u0442\u043e\u0433\u043e \u0436\u0435 \u0446\u0432\u0435\u0442\u0430. \u0410\u043a\u0442\u043e\u0440\u044b \u2014 \u044d\u0442\u043e \u0431\u043b\u043e\u043a\u0438, \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0442\u0430\u0439\u043b\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0431\u043b\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043f\u043e \u0441\u0435\u0442\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0442\u0430\u0439\u043b\u044b. \u0412 \u043a\u0430\u0436\u0434\u044b\u0439 \u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f:<\/p>\n<h3>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>  [\u0412\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b \u0432 <a href=\"https:\/\/davidkoloski.me\/blog\/intelligent-brute-forcing\/\">\u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438<\/a>.]<\/p>\n<ul>\n<li><strong>\u041f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435<\/strong>: WASD\/\u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0441\u043e \u0441\u0442\u0440\u0435\u043b\u043a\u0430\u043c\u0438 (\u0434\u0435\u0441\u043a\u0442\u043e\u043f), \u0441\u0432\u0430\u0439\u043f\u044b (\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430)<\/li>\n<li><strong>\u041e\u0442\u043c\u0435\u043d\u0430<\/strong>: Space (\u0434\u0435\u0441\u043a\u0442\u043e\u043f), \u043a\u043d\u043e\u043f\u043a\u0430 \u0441\u043b\u0435\u0432\u0430 \u0432\u0432\u0435\u0440\u0445\u0443<\/li>\n<li><strong>\u0421\u0431\u0440\u043e\u0441<\/strong>: Shift + Space (\u0434\u0435\u0441\u043a\u0442\u043e\u043f), \u043a\u043d\u043e\u043f\u043a\u0430 \u0441\u043b\u0435\u0432\u0430 \u0432\u043d\u0438\u0437\u0443<\/li>\n<li><strong>\u0421\u043d\u044f\u0442\u044c \u0444\u043e\u043a\u0443\u0441<\/strong>: Escape (\u0434\u0435\u0441\u043a\u0442\u043e\u043f), \u0449\u0435\u043b\u0447\u043e\u043a \u0438\u043b\u0438 \u043a\u0430\u0441\u0430\u043d\u0438\u0435 \u0432\u043d\u0435 \u043f\u043e\u043b\u044f (\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430)<\/li>\n<\/ul>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/5_\/nj\/q_\/5_njq_qwx9k27snk7ft7wkzslqw.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/5_\/nj\/q_\/5_njq_qwx9k27snk7ft7wkzslqw.gif\"\/><\/div>\n<p>  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/yv\/gc\/v1\/yvgcv13t4rban2t1i6ttqkdra1k.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/yv\/gc\/v1\/yvgcv13t4rban2t1i6ttqkdra1k.gif\"\/><\/div>\n<p>  \u042d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u0443 \u043d\u0435\u044f\u0432\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u043c:<\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u0430\u043a\u0442\u043e\u0440 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0442\u0430\u0439\u043b, \u0442\u043e \u043e\u043d \u043d\u0435 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f.<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0430\u043a\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0430\u043a\u0442\u043e\u0440\u0430, \u0442\u043e \u043e\u043d \u043d\u0435 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  \u0418\u0437-\u0437\u0430 \u044d\u0442\u0438\u0445 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0445 \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e (\u0438\u043b\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e?) \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u0430\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d-\u0434\u0432\u0430 \u0445\u043e\u0434\u0430, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0434\u0430\u0447 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 NP-\u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/99\/nz\/yj\/99nzyjguoj5avtj7wtk29fz8myw.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/99\/nz\/yj\/99nzyjguoj5avtj7wtk29fz8myw.gif\"\/><\/div>\n<p>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043a\u0440\u0430\u0441\u043d\u044b\u0445 \u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0441\u0438\u043d\u0438\u0435 \u0430\u043a\u0442\u043e\u0440\u044b \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u0432 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u043f\u0440\u043e\u0442\u0438\u0432\u043e\u043f\u043e\u043b\u043e\u0436\u043d\u043e\u043c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0432\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0430\u0436\u043c\u0451\u0442\u0435 \u0432\u043b\u0435\u0432\u043e, \u0441\u0438\u043d\u0438\u0435 \u0430\u043a\u0442\u043e\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u0432\u043f\u0440\u0430\u0432\u043e, \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442. \u042d\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u043d\u0435\u044f\u0432\u043d\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/nu\/af\/xn\/nuafxnabp7d_7j7oxte1besrkvs.gif\" data-src=\"https:\/\/habrastorage.org\/webt\/nu\/af\/xn\/nuafxnabp7d_7j7oxte1besrkvs.gif\"\/><\/div>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0434\u0440\u0443\u0433 \u0441 \u0434\u0440\u0443\u0433\u043e\u043c, \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0438 \u0441\u0438\u043d\u0438\u0435 \u0430\u043a\u0442\u043e\u0440\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u043d\u0430\u0441\u043a\u0432\u043e\u0437\u044c, \u043c\u0435\u043d\u044f\u044f\u0441\u044c \u043c\u0435\u0441\u0442\u0430\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b \u043e\u0434\u043d\u0438\u043c \u043f\u0443\u0441\u0442\u044b\u043c \u0442\u0430\u0439\u043b\u043e\u043c, \u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043e\u0434\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0430 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0443 \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f. \u042d\u0442\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043c\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u0440\u0430\u0437\u0431\u043e\u0440\u0443, \u044f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u0430\u043c \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u043e\u0449\u0443\u0442\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u0438 \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0438\u0433\u0440\u043e\u0439. \u041d\u0435 \u0432\u043e\u043b\u043d\u0443\u0439\u0442\u0435\u0441\u044c, \u0435\u0441\u043b\u0438 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0439\u0442\u0438 \u0432\u0441\u0435, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438. \u041f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0438\u0433\u0440\u0430\u0439\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0449\u0443\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0441\u0432\u043e\u0438\u043b\u0438\u0441\u044c.<\/p>\n<p>  \u041f\u043e\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c: <a href=\"https:\/\/davidkoloski.me\/blog\/anima-puzzles\/\">Puzzles<\/a><\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0441\u043e\u043b\u0432\u0435\u0440\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043c\u0435\u0442\u043a\u0438 <code>start<\/code> \u0432 <a href=\"https:\/\/github.com\/djkoloski\/anima_solver\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442 \u0432\u0430\u0441 \u0441\u043e \u0432\u0441\u0435\u043c \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u043e\u043c:<\/p>\n<pre><code class=\"bash\">git clone --branch start https:\/\/github.com\/djkoloski\/anima_solver<\/code><\/pre>\n<p>  <\/p>\n<h2>\u041f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043e\u043b\u0432\u0435\u0440<\/h2>\n<p>  \u041d\u0430\u0448\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u043e\u043b\u0432\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d, \u043d\u0430\u0447\u0430\u0432 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0445\u043e\u0434\u0443 \u0437\u0430 \u0440\u0430\u0437 \u0441\u0442\u0430\u043d\u0435\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0451\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u0439:<\/p>\n<pre><code class=\"rust\">pub fn solve(initial_state: State, data: &amp;Data) -> Option&lt;Vec&lt;Direction>> {     let mut parents = Vec::new();     let mut queue = VecDeque::new();      \/\/ Add transitions from initial state     for (action, transition) in initial_state.transitions(data) {         match transition {             Transition::Indeterminate(state) => {                 parents.push((0, action));                 queue.push_back(state);             }             Transition::Success => return Some(vec![action]),         }     }      \/\/ Pop states in order     let mut index = 0;     while let Some(parent_node) = queue.pop_front() {         index += 1;          for (action, transition) in parent_node.transitions(data) {             match transition {                 Transition::Indeterminate(state) => {                     parents.push((index, action));                     queue.push_back(state);                 }                 Transition::Success => {                     let mut result_actions = vec![action];                     let mut current_index = index;                     while current_index != 0 {                         let (next_index, action) = parents.swap_remove(current_index - 1);                         result_actions.push(action);                         current_index = next_index;                     }                     result_actions.reverse();                     return Some(result_actions);                 }             }         }     }      None }<\/code><\/pre>\n<p>  \u042f \u0443\u0431\u0440\u0430\u043b \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0431\u043e\u0439\u043b\u0435\u0440\u043f\u043b\u0435\u0439\u0442\u0430, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u043e\u0442 \u0441\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u043e\u0435:<\/p>\n<ul>\n<li>\u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b <code>State<\/code> \u0438 <code>Data<\/code>; \u0432 <code>State<\/code> \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f, \u0430 \u0432 <code>Data<\/code> \u2014 \u0432\u0441\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. <code>State<\/code> \u2014 \u044d\u0442\u043e \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0430\u043a\u0442\u043e\u0440\u043e\u0432, \u0430 <code>Data<\/code> \u2014 \u0441\u0445\u0435\u043c\u0430 \u043f\u043e\u043b\u044f \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a. \u041e\u043d\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u044b, \u0447\u0442\u043e\u0431\u044b \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0451\u043c \u043f\u0430\u043c\u044f\u0442\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 <code>queue<\/code>.<\/li>\n<li>\u041c\u0435\u0442\u043e\u0434 <code>transitions()<\/code> \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 <code>State<\/code>, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 <code>Data<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u044b \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u043c, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u0445\u043e\u0434. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 <code>Indeterminate<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e\u0435 \u043d\u0430\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435\u0440\u0435\u0448\u0435\u043d\u043e, \u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 <code>Success<\/code> \u2014 \u0447\u0442\u043e \u0440\u0435\u0448\u0435\u043d\u043e.<\/li>\n<\/ul>\n<p>  <code>parents<\/code> \u0437\u0434\u0435\u0441\u044c \u2014 \u044d\u0442\u043e \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 <code>(usize, Direction)<\/code>, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0439, \u0438\u0437 \u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u043b\u0441\u044f \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430. \u0414\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0434\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430, \u043c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0432\u0435\u043a\u0442\u043e\u0440 <code>parents<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0433\u043e. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043d\u0430\u0448\u0443 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443!<\/p>\n<p>  \u0412\u043e\u0437\u044c\u043c\u0451\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pt\/xh\/7c\/ptxh7crtmayfdm6y6adqe2fiepk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/pt\/xh\/7c\/ptxh7crtmayfdm6y6adqe2fiepk.png\"\/><\/div>\n<p>  <\/p>\n<pre><code class=\"bash\">$ cargo run -- puzzles\/line_dance.txt puzzles\/line_dance.txt: Parse: 0.000201900s Solve: 0.000017600s Found solution of length 2: Right, Right<\/code><\/pre>\n<p>  \u0417\u0434\u043e\u0440\u043e\u0432\u043e, \u0438 \u043e\u043d\u0430 \u043d\u0430\u0448\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u0435! \u041e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u043b\u0438\u0437\u0430:<\/p>\n<pre><code class=\"bash\">$ cargo run --release -- puzzles\/line_dance.txt puzzles\/line_dance.txt: Parse: 0.000122700s Solve: 0.000009100s Found solution of length 2: Right, Right<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432\u0434\u0432\u043e\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043e\u0442\u043b\u0438\u0447\u043d\u043e! \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u043b\u0438\u0437\u0430. \u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0448\u0430\u0433 \u0432\u043f\u0435\u0440\u0451\u0434 \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443 \u043f\u043e\u0441\u043b\u043e\u0436\u043d\u0435\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ky\/ws\/b4\/kywsb4hfgfgy4sjssd98umdy5zc.png\" data-src=\"https:\/\/habrastorage.org\/webt\/ky\/ws\/b4\/kywsb4hfgfgy4sjssd98umdy5zc.png\"\/><\/div>\n<p>  <\/p>\n<pre><code class=\"bash\">$ cargo run --release -- puzzles\/u_turn.txt puzzles\/u_turn.txt: Parse: 0.005942000s Solve: 0.001093200s Found solution of length 6: Down, Down, Left, Left, Up, Up<\/code><\/pre>\n<p>  \u041f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0435, \u0438 \u0435\u0451 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0440\u0435\u0448\u0438\u043b\u0430! \u0415\u0449\u0451 \u043e\u0434\u043d\u0443, \u043e\u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0442\u0430\u043a\u0430\u044f \u0436\u0435:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/m6\/vm\/pu\/m6vmputbsjj8tzkbbtantfh8pfa.png\" data-src=\"https:\/\/habrastorage.org\/webt\/m6\/vm\/pu\/m6vmputbsjj8tzkbbtantfh8pfa.png\"\/><\/div>\n<p>  <\/p>\n<pre><code class=\"bash\">$ cargo run --release -- puzzles\/spiral.txt ...<\/code><\/pre>\n<p>  \u041e\u0439-\u0451\u0439, \u043f\u043e\u0445\u043e\u0436\u0435, \u0431\u044b\u0441\u0442\u0440\u043e \u0435\u0451 \u043c\u044b \u043d\u0435 \u0440\u0435\u0448\u0438\u043c. \u0410 \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0435 \u043f\u0440\u0438\u0431\u0438\u0442\u044c, \u0442\u043e \u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c\u0441\u044f! \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043d\u0430 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u0438, \u043c\u044b \u043f\u043e\u0439\u043c\u0451\u043c, \u043f\u043e\u0447\u0435\u043c\u0443:<\/p>\n<pre><code class=\"bash\">puzzles\/line_dance.txt Solve: 0.000009100s Found solution of length 2:  puzzles\/u_turn.txt Solve: 0.001093200s Found solution of length 6:<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0445\u043e\u0434\u043e\u0432 \u043a \u0434\u043b\u0438\u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u0432 120 \u0440\u0430\u0437! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c:<\/p>\n<pre><code class=\"rust\">println!(\"Explored {} states\", parents.len());<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"bash\">$ cargo run --release -- puzzles\/line_dance.txt Explored 3 states  $ cargo run --release -- puzzles\/u_turn.txt Explored 5364 states<\/code><\/pre>\n<p>  \u041e\u0433\u043e, \u0432\u043e\u0442 \u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0418 \u044d\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u2014 \u043a\u0430\u0436\u0434\u043e\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u043e\u0435 \u043d\u0430\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0435\u0449\u0451 \u0447\u0435\u0442\u044b\u0440\u0451\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u043e\u0439 <code>n<\/code> \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 <code>(4^n - 1) \/ 3<\/code> \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u041f\u0440\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0438 \u0432 6 \u0445\u043e\u0434\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 1365 \u0434\u043e 5461 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043f\u043e\u043f\u0430\u043b\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u0432 \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b. \u041d\u043e \u0447\u0442\u043e \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043f\u043e\u043a\u0430 \u043d\u0435\u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438? \u0414\u043b\u044f \u0435\u0451 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f 16 \u0445\u043e\u0434\u043e\u0432, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 1431655765 \u0434\u043e 5726623061 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.<\/p>\n<p>  \u041e\u0439-\u0451\u0439.<\/p>\n<p>  \u041f\u0440\u0438\u0448\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448 \u0441\u043e\u043b\u0432\u0435\u0440. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a, \u0430 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435, \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435. \u041d\u0430\u0448\u0430 \u0446\u0435\u043b\u044c \u2014 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0435\u0448\u0430\u0442\u044c \u0432\u0441\u0435 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c.<\/p>\n<h2>\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439<\/h2>\n<p>  \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0434\u043b\u044f <em>U-Turn<\/em> \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 5364, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 7 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439: \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u0442\u0430\u0439\u043b\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0430\u043a\u0442\u043e\u0440. \u0422\u043e \u0435\u0441\u0442\u044c, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u043c\u044b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0437 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0445\u044d\u0448\u0435\u0439 \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u0441\u0435\u0449\u0435\u043d\u043e:<\/p>\n<pre><code class=\"rust\">let mut states = HashSet::new(); ...  while let Some(parent_node) = queue.pop_front() {     index += 1;      if !states.contains(&amp;parent_node) {         ...          states.insert(parent_node);     } }<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u0438:<\/p>\n<pre><code class=\"bash\">$ cargo run --release -- puzzles\/u_turn.txt Explored 20 states Solve: 0.000895100s Found solution of length 6:    Down, Down, Left, Left, Up, Up<\/code><\/pre>\n<p>  \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435! \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0448\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443?<\/p>\n<pre><code class=\"bash\">$ cargo run --release -- puzzles\/spiral.txt Explored 51 states puzzles\/spiral.txt: Parse: 0.000212300s Solve: 0.001049000s Found solution of length 16: Left, Left, Up, Up, Right, Right, Right, Right, Down, Down, Down, Down, Left, Left, Left, Left<\/code><\/pre>\n<p>  \u0422\u0430\u043a \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c \u0441 \u043c\u0438\u043b\u043b\u0438\u0430\u0440\u0434\u0430 \u0441 \u043b\u0438\u0448\u043d\u0438\u043c \u0434\u043e \u0432\u0441\u0435\u0433\u043e 51. \u041e\u0434\u043d\u043e\u0439 \u044d\u0442\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a \u0441\u0442\u0430\u043b\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0448\u0430\u0442\u044c! \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0441\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0441\u043e\u043b\u0432\u0435\u0440\u0430. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u043e\u0432 \u0432\u044b\u0431\u0435\u0440\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u0435\u0439 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a:<\/p>\n<pre><code class=\"bash\">$ cargo bench solve_square_dance      time:   [16.658 ms 16.888 ms 17.125 ms] solve_fractal           time:   [44.606 ms 45.193 ms 45.806 ms] solve_antiparticle      time:   [1.8001 s 1.8308 s 1.8640 s]<\/code><\/pre>\n<p>  <\/p>\n<h2>\u0421\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438<\/h2>\n<p>  \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0438 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0430\u0448\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"rust\">enum Color {     Red,     Blue, }  pub struct Actor {     position: Vec2,     color: Color, }  pub struct State {     actors: Vec&lt;Actor>, }<\/code><\/pre>\n<p>  \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043f\u043e\u043b\u0435 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043a\u0440\u0430\u0441\u043d\u044b\u043c\u0438 \u0430\u043a\u0442\u043e\u0440\u0430\u043c\u0438 \u043d\u0430 \u043d\u0451\u043c. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0435, \u043f\u043e\u043c\u0435\u0442\u0438\u043c \u0438\u0445 \u043a\u0430\u043a A, B, C \u0438 D:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/vr\/fr\/jp\/vrfrjpeuqspykzgaqqgljlazac4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/vr\/fr\/jp\/vrfrjpeuqspykzgaqqgljlazac4.png\"\/><\/div>\n<p>  \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u044d\u0442\u0438\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 <code>4!<\/code> \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432 \u0432\u0435\u043a\u0442\u043e\u0440\u0435 <code>4!<\/code> \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0430\u043a\u0442\u043e\u0440\u043e\u0432. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e, \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0432 \u043c\u0430\u0441\u0441\u0438\u0432 <code>actors<\/code>. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u0438\u043d \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438:<\/p>\n<pre><code class=\"rust\">pub fn transition(&amp;self, data: &amp;Data, direction: &amp;Direction) -> State {     let mut result = self.clone();      ...      result.actors.sort();     result }<\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u0430\u043a \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0437 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0439 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438:<\/p>\n<pre><code class=\"bash\">$ cargo bench  solve_square_dance      time:   [4.4875 ms 4.5667 ms 4.6525 ms]                         change: [-73.527% -72.960% -72.308%] (p = 0.00 &lt; 0.05)  solve_fractal           time:   [19.518 ms 19.647 ms 19.776 ms]                         change: [-57.178% -56.527% -55.885%] (p = 0.00 &lt; 0.05)  solve_antiparticle      time:   [187.49 ms 190.53 ms 193.91 ms]                         change: [-89.835% -89.593% -89.343%] (p = 0.00 &lt; 0.05)<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 (\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f BF):  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0413\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430<\/th>\n<th align=\"right\">\u0414\u043b\u0438\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/th>\n<th align=\"right\">\u0414\u043e (BF)<\/th>\n<th align=\"right\">\u041f\u043e\u0441\u043b\u0435 (BF)<\/th>\n<th align=\"right\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Square Dance<\/td>\n<td align=\"right\">12<\/td>\n<td align=\"right\">37268 (2.292)<\/td>\n<td align=\"right\">11401 (2.061)<\/td>\n<td align=\"right\">-61.408%<\/td>\n<\/tr>\n<tr>\n<td>Fractal<\/td>\n<td align=\"right\">13<\/td>\n<td align=\"right\">86277 (2.294)<\/td>\n<td align=\"right\">46253 (2.179)<\/td>\n<td align=\"right\">-46.390%<\/td>\n<\/tr>\n<tr>\n<td>Antiparticle<\/td>\n<td align=\"right\">22<\/td>\n<td align=\"right\">2514936 (1.888)<\/td>\n<td align=\"right\">315100 (1.708)<\/td>\n<td align=\"right\">-87.471%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439. \u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0441\u043d\u0438\u0437\u0438\u0432 \u044d\u043d\u0442\u0440\u043e\u043f\u0438\u044e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043c\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043d\u0438\u0437\u0438\u043b\u0438 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0431\u044b\u0441\u0442\u0440\u043e \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0436\u0435 \u043a\u0440\u043e\u0448\u0435\u0447\u043d\u043e\u0435 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u043f\u043d\u044b\u043c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h2>\u041f\u043e\u0438\u0441\u043a A*<\/h2>\n<p>  \u041f\u043e\u043c\u043d\u044f \u043e\u0431 \u044d\u0442\u043e\u043c, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043f\u043e\u0438\u0441\u043a\u0430. A* \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u043c \u0443\u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u0438\u0441\u043a\u0430 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443, \u043e\u0442\u0434\u0430\u044e\u0449\u0438\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0438\u0445 \u0443\u0437\u043b\u043e\u0432. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c <em>\u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/em>, \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u044e\u0449\u0443\u044e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0445\u043e\u0434\u043e\u0432 \u0434\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f. \u041c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448\u0430 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u0447\u043d\u0435\u0435 \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u043b\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0435\u0435\u0441\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u0430 \u0435\u0433\u043e. \u041f\u0440\u0435\u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u0441 \u0443\u0441\u0442\u0440\u043e\u0438\u0442. \u0418\u043c\u0435\u044f \u044d\u0442\u0443 \u043e\u0446\u0435\u043d\u043a\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0445\u043e\u0434\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0446\u0435\u043d\u043e\u0447\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f (\u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0435 \u0445\u043e\u0434\u044b + \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u0445\u043e\u0434\u044b). \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0435 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u0443\u043f\u0438\u043a\u043e\u0432\u044b\u043c\u0438, \u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u044f\u0442 \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0435.<\/p>\n<p>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 A* \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u044b\u0431\u043e\u0440\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0425\u043e\u0440\u043e\u0448\u0430\u044f \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c <em>\u043b\u0435\u0433\u043a\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c\u043e\u0439<\/em> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <em>\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0432\u044b\u0441\u043e\u043a\u0443\u044e<\/em> \u043e\u0446\u0435\u043d\u043a\u0443, \u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0441\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043e\u0431 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/f8\/wg\/dd\/f8wgddaws8jclkje4ccpccjxnsk.png\" data-src=\"https:\/\/habrastorage.org\/webt\/f8\/wg\/dd\/f8wgddaws8jclkje4ccpccjxnsk.png\"\/><\/div>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443, \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0430\u043a\u0442\u043e\u0440 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u0430\u043a\u0442\u043e\u0440\u044b \u0434\u0432\u0438\u0436\u0443\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 <em>maxmin<\/em>: \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0433\u043e \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0430\u043a\u0442\u043e\u0440\u0430 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438, \u0430 \u0437\u0430\u0442\u0435\u043c \u0431\u0440\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 \u0432\u0441\u0435\u0445 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0434\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0446\u0435\u043b\u0435\u0439. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0445\u043e\u0434\u043e\u0432, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u0430\u043a\u0442\u043e\u0440\u0430 \u043a \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a. \u042d\u0442\u043e \u043a\u0440\u0430\u0439\u043d\u0435 \u0433\u0440\u0443\u0431\u0430\u044f \u043e\u0446\u0435\u043d\u043a\u0430, \u043d\u043e \u043d\u0430\u043c \u043e\u043d\u0430 \u043f\u043e\u0434\u043e\u0439\u0434\u0451\u0442. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c <a href=\"https:\/\/en.wikipedia.org\/wiki\/Linear_bottleneck_assignment_problem\">\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445<\/a>, \u043d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"rust\">pub fn heuristic(&amp;self, data: &amp;Data) -> usize {     let mut max_distance = 0;      for goal in data.goals.iter() {         let mut min_distance = usize::MAX;         for actor in self.actors.iter().filter(|a| a.color == goal.color) {             let d = (goal.position - actor.position).abs();             min_distance = usize::min(min_distance, (d.x + d.y) as usize);         }         max_distance = usize::max(max_distance, min_distance);     }      max_distance }<\/code><\/pre>\n<p>  \u041a\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0451 \u0442\u043e, \u043e \u0447\u0451\u043c \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b. \u0421\u0430\u043c\u044b\u043c \u0441\u043b\u043e\u0436\u043d\u044b\u043c \u0431\u044b\u043b\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0440\u0430\u043d\u0435\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>solve<\/code> \u043f\u043e\u0434 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0438. \u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043c\u044b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c \u0432 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0432\u0441\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0443\u044e \u043f\u0440\u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0438 \u0443\u0437\u043b\u0430:<\/p>\n<pre><code class=\"rust\">#[derive(Eq, PartialEq)] struct Node {     state: State,     distance: usize,     estimate: usize,     index: usize, }<\/code><\/pre>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041a \u0441\u043b\u043e\u0432\u0443 \u043e \u043d\u0435\u0439:<\/p>\n<pre><code class=\"rust\">let mut queue = BinaryHeap::new();<\/code><\/pre>\n<p>  <code>BinaryHeap<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430 \u0432\u0440\u0435\u043c\u044f <code>log(N)<\/code>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0443\u0437\u043b\u043e\u0432, \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0449\u0435\u0435 \u0441\u0430\u043c\u044b\u043c \u043c\u043d\u043e\u0433\u043e\u043e\u0431\u0435\u0449\u0430\u044e\u0449\u0438\u043c \u0443\u0437\u043b\u0430\u043c (\u0441 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c + \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u043e\u0439) \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442:<\/p>\n<pre><code class=\"rust\">impl PartialOrd for Node {     fn partial_cmp(&amp;self, other: &amp;Self) -> Option&lt;Ordering> {         Some(self.cmp(other))     } }  impl Ord for Node {     fn cmp(&amp;self, other: &amp;Self) -> Ordering {         other.estimate.cmp(&amp;self.estimate)     } }<\/code><\/pre>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043d\u043e \u0432 \u0446\u0435\u043b\u043e\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c <code>estimate<\/code>. \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e <code>push<\/code>, \u0447\u0442\u043e\u0431\u044b \u0443\u0447\u0435\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 fill out \u0432 <code>Node<\/code>:<\/p>\n<pre><code class=\"rust\">let estimate = state.heuristic(data) + (parent_node.distance + 1); queue.push(Node {     state: state,     distance: parent_node.distance + 1,     estimate,     index: parents.len(), });<\/code><\/pre>\n<p>  \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0438\u0445 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043c \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <code>parents<\/code>. \u0418 \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451! \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f A*, \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448 \u0441\u043e\u043b\u0432\u0435\u0440 \u0441\u0432\u0435\u0440\u0445\u0431\u044b\u0441\u0442\u0440\u044b\u043c!<\/p>\n<pre><code class=\"rust\">$ cargo bench  solve_square_dance      time:   [4.4051 ms 4.4276 ms 4.4524 ms]                         change: [+3.7025% +4.6095% +5.4779%] (p = 0.00 &lt; 0.05)  solve_fractal           time:   [7.7314 ms 7.7718 ms 7.8183 ms]                         change: [-57.412% -57.044% -56.682%] (p = 0.00 &lt; 0.05)  solve_antiparticle      time:   [201.26 ms 202.26 ms 203.36 ms]                         change: [+14.570% +15.351% +16.121%] (p = 0.00 &lt; 0.05)<\/code><\/pre>\n<p>  \u0425\u043c, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u044b\u0432\u0430\u0435\u0442, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043a\u043e\u0433\u0434\u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u0448\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u0432\u0443\u0445 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u0441\u044f \u043d\u0430 5-15%, \u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u2014 \u0441\u043d\u0438\u0437\u0438\u043b\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043d\u0430 50%. \u0422\u043e \u0435\u0441\u0442\u044c \u0445\u043e\u0442\u044f \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0438 \u0430\u0441\u0441\u0438\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u043c, \u0432 \u0446\u0435\u043b\u043e\u043c \u043e\u043d \u0431\u044b\u043b \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u0443. \u0410 \u0435\u0441\u043b\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u0438 \u043e\u0442 \u043d\u0435\u0451. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (\u0438 \u043d\u0430 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f):<\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0413\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430<\/th>\n<th align=\"right\">\u0414\u043b\u0438\u043d\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/th>\n<th align=\"right\">\u0414\u043e (BF)<\/th>\n<th align=\"right\">\u041f\u043e\u0441\u043b\u0435 (BF)<\/th>\n<th align=\"right\">\u0420\u0430\u0437\u043d\u0438\u0446\u0430<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Square Dance<\/td>\n<td align=\"right\">12<\/td>\n<td align=\"right\">11401 (2.061)<\/td>\n<td align=\"right\">9737 (2.031)<\/td>\n<td align=\"right\">-14.595%<\/td>\n<\/tr>\n<tr>\n<td>Fractal<\/td>\n<td align=\"right\">13<\/td>\n<td align=\"right\">46253 (2.179)<\/td>\n<td align=\"right\">16593 (2.002)<\/td>\n<td align=\"right\">-64.126%<\/td>\n<\/tr>\n<tr>\n<td>Antiparticle<\/td>\n<td align=\"right\">22<\/td>\n<td align=\"right\">315100 (1.708)<\/td>\n<td align=\"right\">269211 (1.695)<\/td>\n<td align=\"right\">-14.563%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  \u0412\u0430\u0436\u043d\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433 \u043d\u0443\u0436\u043d\u043e \u043e\u0447\u0435\u043d\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u043e\u0442\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c, \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u0438\u0437 \u043d\u0438\u0445 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u043e\u0431\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0435 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f <em>Fractal<\/em> \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044e \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043d\u0438\u0437\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e.<\/p>\n<h2>\u0421\u043d\u0438\u0436\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439<\/h2>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u2014 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u0439\u0434\u0451\u043c \u043c\u0435\u0441\u0442\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<pre><code class=\"rust\">pub fn transitions(&amp;self, data: &amp;Data) -> Vec&lt;(Direction, Transition&lt;Self>)> {     ... }<\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Vec<\/code> \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c\u0438 \u0432 \u043a\u0443\u0447\u0443, \u043d\u043e \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0447\u0435\u0442\u044b\u0440\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u043b\u0430 \u043c\u0430\u0441\u0441\u0438\u0432:<\/p>\n<pre><code class=\"rust\">pub fn transitions(&amp;self, data: &amp;Data) -> [(Direction, Transition&lt;Self>); 4] {     ... }<\/code><\/pre>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0430\u043c \u0434\u0430\u0441\u0442:<\/p>\n<pre><code class=\"bash\">$ cargo bench  solve_square_dance      time:   [4.4052 ms 4.4415 ms 4.4867 ms]                         change: [-7.0971% -6.1140% -4.9385%] (p = 0.00 &lt; 0.05)  solve_fractal           time:   [7.6836 ms 7.7682 ms 7.8720 ms]                         change: [-8.5312% -7.0938% -5.5943%] (p = 0.00 &lt; 0.05)  solve_antiparticle      time:   [207.00 ms 207.71 ms 208.44 ms]                         change: [-4.9600% -4.2495% -3.5907%] (p = 0.00 &lt; 0.05)<\/code><\/pre>\n<p>  \u0414\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c. \u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442 \u043a\u0440\u0435\u0439\u0442 <code>arrayvec<\/code> \u0434\u043b\u044f \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u0432 \u043d\u0430\u0448\u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u0445. \u041f\u043e \u0441\u0443\u0442\u0438, \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u043e \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043a\u0443\u0447\u0438, \u0435\u0441\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0441\u0432\u0435\u0440\u0445\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430\u0445. \u0427\u0442\u043e\u0431\u044b \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u043c\u0430\u043d\u0451\u0432\u0440\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0432\u043e\u0441\u0435\u043c\u044c\u044e:<\/p>\n<pre><code class=\"rust\">pub struct State {     actors: ArrayVec&lt;Actor, 8>, }<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b:<\/p>\n<pre><code class=\"bash\">$ cargo bench  solve_square_dance      time:   [4.0299 ms 4.0567 ms 4.0854 ms]                         change: [-9.7690% -8.6635% -7.6778%] (p = 0.00 &lt; 0.05)  solve_fractal           time:   [7.4610 ms 7.5152 ms 7.5743 ms]                         change: [-4.6656% -3.2571% -1.9086%] (p = 0.00 &lt; 0.05)  solve_antiparticle      time:   [187.27 ms 188.29 ms 189.38 ms]                         change: [-9.9536% -9.3494% -8.7499%] (p = 0.00 &lt; 0.05)<\/code><\/pre>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e! \u0415\u0449\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043c\u043d\u044b\u0445 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439, \u043d\u043e \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u043c\u0435\u043b\u043e\u0447\u044c. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c\u2026<\/p>\n<h2>\u041f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  \u041f\u0440\u043e\u0441\u0442\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043c\u0438\u043a\u0440\u043e\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f\u043c. \u041c\u044b \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043d\u043e\u0433\u043e\u0435 \u043c\u043e\u0436\u0435\u043c \u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c, \u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0432 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0432 Visual Studio, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/oo\/vk\/zw\/oovkzwvhnhs6hk9a9gzxtl189dy.png\" data-src=\"https:\/\/habrastorage.org\/webt\/oo\/vk\/zw\/oovkzwvhnhs6hk9a9gzxtl189dy.png\"\/><\/div>\n<p>  \u0412\u043e\u0442 \u043e\u043d\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0424\u0443\u043d\u043a\u0446\u0438\u044f<\/th>\n<th>\u041e\u0431\u0449\u0438\u0439 % CPU<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>anima_solver::puzzle::State::transitions<\/code><\/td>\n<td align=\"right\">24.40%<\/td>\n<\/tr>\n<tr>\n<td><code>hashbrown::map::HashMap::contains_key<\/code><\/td>\n<td align=\"right\">20.72%<\/td>\n<\/tr>\n<tr>\n<td><code>hashbrown::map::HashMap::insert<\/code><\/td>\n<td align=\"right\">19.83%<\/td>\n<\/tr>\n<tr>\n<td><code>alloc::collections::binary_heap::BinaryHeap::pop<\/code><\/td>\n<td align=\"right\">15.91%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  \u0421\u0440\u0430\u0437\u0443 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0437\u0430\u043c\u0435\u0442\u043d\u043e, \u0447\u0442\u043e \u043c\u044b \u0442\u0440\u0430\u0442\u0438\u043c \u043f\u043e\u0447\u0442\u0438 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 <code>HashMap::contains_key<\/code>, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438 \u0432 <code>HashMap::insert<\/code>. \u041d\u043e \u0432\u0435\u0434\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043e\u043b\u0432\u0435\u0440\u0435 \u043d\u0435\u0442 hash maps. \u0418\u043b\u0438 \u0435\u0441\u0442\u044c?<\/p>\n<p>  \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0435\u0441\u0442\u044c. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>HashSet<\/code> \u0434\u043b\u044f \u043f\u043e\u0441\u0435\u0449\u0451\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0430 \u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c <code>HashMap&lt;K, ()><\/code>. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043a\u043e\u0434:<\/p>\n<pre><code class=\"rust\">let mut states = HashSet::new();  ...  while let Some(parent_node) = queue.pop() {     if !states.contains(&amp;parent_node.state) {         for (action, transition) in parent_node.state.transitions(data) {             ...         }         states.insert(parent_node.state);     } }<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0432 \u0447\u0451\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u041d\u0430\u0432\u0435\u0440\u043d\u043e, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>Entry<\/code> API \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u0433\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0434\u043b\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0435\u0433\u043e \u0437\u0430 \u043e\u0434\u043d\u0443 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043f\u043e\u0438\u0441\u043a\u0430, \u0442\u0430\u043a? \u041d\u0443-\u0443-\u0443\u2026 \u0423 <code>HashSet<\/code> <a href=\"https:\/\/github.com\/rust-lang\/rfcs\/issues\/1490\">\u043f\u043e\u043a\u0430<\/a> \u043d\u0435\u0442 entry API \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0443 <code>HashMap<\/code>.<\/p>\n<p>  \u041d\u0443, \u0442\u043e\u0433\u0434\u0430 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>HashMap<\/code> \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <code>()<\/code>, \u0442\u0430\u043a?<\/p>\n<pre><code class=\"rust\">let mut states = HashMap::new();  ...  while let Some(parent_node) = queue.pop() {     if let Entry::Vacant(entry) = states.entry(parent_node.state) {         for (action, transition) in entry.key().transitions(data) {             ...         }         entry.insert(());     } }<\/code><\/pre>\n<p>  \u0414\u043e\u043b\u0436\u043d\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">$ cargo bench  solve_square_dance      time:   [3.8785 ms 3.9364 ms 3.9998 ms]                         change: [+0.9796% +2.8698% +4.8065%] (p = 0.00 &lt; 0.05)  solve_fractal           time:   [6.7915 ms 6.8446 ms 6.9022 ms]                         change: [-2.2994% -1.2597% -0.0914%] (p = 0.03 &lt; 0.05)  solve_antiparticle      time:   [172.04 ms 172.76 ms 173.54 ms]                         change: [-2.4655% -1.8303% -1.1884%] (p = 0.00 &lt; 0.05)<\/code><\/pre>\n<p>  \u041f\u0435\u0447\u0430\u043b\u044c\u043d\u043e, \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u0443 entry API \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0438\u0437\u0434\u0435\u0440\u0436\u043a\u0438, \u0441\u0442\u043e\u043b\u044c \u0436\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0435, \u043a\u0430\u043a \u0438 \u043f\u043e\u0438\u0441\u043a \u0441\u043e \u0432\u0441\u0442\u0430\u0432\u043a\u043e\u0439. \u0415\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0437\u043d\u0430\u0435\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c, \u043c\u043d\u0435 \u0431\u044b \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0437\u043d\u0430\u0442\u044c. \u041d\u043e \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438\u043d\u0433\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430. \u0414\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0438\u0442\u043e\u0433\u0435 \u043c\u043e\u0433\u0443\u0442 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u0442\u044c \u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h2>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432<\/h2>\n<p>  \u041c\u044b \u043f\u043e\u0447\u0442\u0438 \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u0434\u043d\u0430 \u0431\u043e\u0447\u043a\u0438. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0438 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u2014 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432. \u042d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043c \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442 \u043b\u044e\u0431\u0443\u044e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043f\u043e\u0434 \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043d\u0438\u0436\u0435 \u043d\u0435\u043a\u043e\u0433\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u042f \u0432\u044b\u0431\u0440\u0430\u043b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b:<\/p>\n<pre><code class=\"rust\">let mut states = HashMap::with_capacity(4 * 1024); let mut parents = Vec::with_capacity(4 * 1024); let mut queue = BinaryHeap::with_capacity(1024);<\/code><\/pre>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u043e\u0432\u043b\u0438\u044f\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u044c \u0432\u044b\u0448\u0435 \u043f\u043e\u0440\u043e\u0433\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430. \u0422\u0430\u043a \u043b\u0438 \u044d\u0442\u043e?<\/p>\n<pre><code class=\"bash\">$ cargo bench  solve_square_dance      time:   [3.7025 ms 3.7311 ms 3.7652 ms]                         change: [-9.7612% -8.3409% -6.9754%] (p = 0.00 &lt; 0.05)  solve_fractal           time:   [6.0512 ms 6.1010 ms 6.1584 ms]                         change: [-15.633% -14.231% -12.778%] (p = 0.00 &lt; 0.05)  solve_antiparticle      time:   [177.28 ms 178.40 ms 179.59 ms]                         change: [-0.7913% +0.0458% +0.8882%] (p = 0.92 > 0.05)<\/code><\/pre>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043c\u044b \u0438 \u0432\u0438\u0434\u0438\u043c. \u0412 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430\u0445 \u043f\u043e\u043f\u0440\u043e\u0449\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0435 \u0434\u0435\u043b\u044c\u0442\u044b, \u043d\u043e \u043d\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430\u043c\u0438 \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u043e. \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u0441\u0440\u0435\u0434\u043d\u0435\u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f, \u0438 \u044d\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0441 \u0432\u0430\u0436\u043d\u043e. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h2>\u0412\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435<\/h2>\n<p>  \u041e\u0434\u0438\u043d \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2014 \u044d\u0442\u043e \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. \u0412\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u043d\u0438\u0442\u0441\u044f, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u043e\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c\u0438. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u044b \u043d\u0430 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435. \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0438\u043b\u0438 <em>\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439<\/em>, \u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u043d\u0435\u0439, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f <em>\u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430<\/em>. \u0412 \u043d\u0430\u0448\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u0435 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u044b \u0434\u0438\u0440\u0435\u043a\u0442\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c, \u0438 \u044d\u0442\u043e \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442. \u0412\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043d\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0439\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>transition<\/code> \u0434\u043b\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0443\u0441\u0442\u0440\u0430\u043d\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u0438\u0437\u0434\u0435\u0440\u0436\u0435\u043a.<\/p>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c:<\/p>\n<pre><code class=\"bash\">$ cargo bench  solve_square_dance      time:   [3.7629 ms 3.8005 ms 3.8413 ms]                         change: [-10.293% -8.6516% -6.9645%] (p = 0.00 &lt; 0.05)  solve_fractal           time:   [6.7174 ms 6.8059 ms 6.9033 ms]                         change: [-10.243% -8.5148% -6.7086%] (p = 0.00 &lt; 0.05)  solve_antiparticle      time:   [175.97 ms 176.63 ms 177.38 ms]                         change: [-6.8481% -5.9110% -5.0767%] (p = 0.00 &lt; 0.05)<\/code><\/pre>\n<p>  \u041d\u0430\u0448 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0439 \u0433\u043e\u0442\u043e\u0432! \u0412\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u0442\u0430\u043a\u043e\u0435.<\/p>\n<h2>\u041f\u043e\u0434\u0432\u0435\u0434\u0451\u043c \u0438\u0442\u043e\u0433\u0438<\/h2>\n<p>  \u041c\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u043e\u043b\u0432\u0435\u0440 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0439 \u0440\u0435\u0448\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043f\u0440\u0438 \u0432\u0441\u0435\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0438\u043a \u0431\u0440\u0443\u0442\u0444\u043e\u0440\u0441\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u0438\u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u043b\u0438\u044f\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0438\u043a \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u0437\u043d\u0430\u0435\u043c \u0442\u0435\u043f\u0435\u0440\u044c, \u0447\u0435\u0433\u043e \u0436\u0434\u0430\u0442\u044c \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c.<\/p>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043d\u0430\u0443\u0447\u0438\u043b\u0438\u0441\u044c \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u0441\u0435 \u0441\u043b\u0443\u0447\u0430\u0438, \u0438\u043b\u0438 \u0447\u0442\u043e \u043e\u043d\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  \u0412 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0448\u0430 \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u043e\u0442 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u0433\u0440\u044b \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0432 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438\u0433\u0440\u0435 \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e.<\/p>\n<p>  \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u043e\u043b\u0432\u0435\u0440\u0430 \u0434\u043b\u044f Stephen&#8217;s Sausage Roll, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0448\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u0443\u044e \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0443, \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043e\u0442 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0431\u044b\u043b \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u044b \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0441\u043e\u043b\u0432\u0435\u0440! \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0441 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u043e\u0439, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u043a URL \u0441\u0442\u0440\u043e\u043a\u0443 <code>&amp;controls=true<\/code> (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/davidkoloski.me\/blog\/anima-playground?controls=true\">\u0437\u0434\u0435\u0441\u044c<\/a>).<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/lr\/rs\/oi\/lrrsoigqli7_jgtiwmzpbb21z_y.png\" data-src=\"https:\/\/habrastorage.org\/webt\/lr\/rs\/oi\/lrrsoigqli7_jgtiwmzpbb21z_y.png\"\/><\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/company\/beeline\/blog\/663852\/\"> https:\/\/habr.com\/ru\/company\/beeline\/blog\/663852\/<\/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-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/lr\/rs\/oi\/lrrsoigqli7_jgtiwmzpbb21z_y.png\" data-src=\"https:\/\/habrastorage.org\/webt\/lr\/rs\/oi\/lrrsoigqli7_jgtiwmzpbb21z_y.png\"\/><\/div>\n<p>  <\/p>\n<h2>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u0440\u0435\u0434\u0438\u0441\u043b\u043e\u0432\u0438\u0435<\/h2>\n<p>  \u0412 \u043a\u043e\u043b\u043b\u0435\u0434\u0436\u0435 \u044f \u043c\u043d\u043e\u0433\u043e \u0438\u0433\u0440\u0430\u043b \u0432 <em>\u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438<\/em>. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u043e\u0434 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0430\u043c\u0438 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0443\u0437\u043a\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u043a\u0438\u0445 \u0438\u0433\u0440. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432:<\/p>\n<ul>\n<li><a href=\"https:\/\/store.steampowered.com\/app\/353540\/Stephens_Sausage_Roll\/\">Stephen&#8217;s Sausage Roll<\/a><\/li>\n<li><a href=\"https:\/\/store.steampowered.com\/app\/207570\/English_Country_Tune\/\">English Country Tune<\/a><\/li>\n<li><a href=\"https:\/\/store.steampowered.com\/app\/290260\/Sokobond\/\">Sokobond<\/a><\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u043d\u0435 \u043f\u043e\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0438\u043b\u043e\u0441\u044c \u0438\u0437\u0443\u0447\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u041f\u043e\u043b\u0438\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0438\u0442\u0443\u0442\u0435 \u0420\u0435\u043d\u0441\u0441\u0435\u043b\u0435\u0440\u0430, \u0433\u0434\u0435 \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0443\u0434\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u043e\u0440\u0430 \u041a\u0430\u0442\u043b\u0435\u0440\u0430 (\u043f\u0440\u0438\u0432\u0435\u0442, \u0411\u0430\u0440\u0431!) \u0435\u0436\u0435\u0433\u043e\u0434\u043d\u043e \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e <em>\u0441\u043e\u043b\u0432\u0435\u0440\u0430 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043e\u043a<\/em>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0433\u043e\u0434 \u0438\u0433\u0440\u0430 \u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c, \u0438 \u0432 \u043c\u043e\u0439 \u0433\u043e\u0434 \u044d\u0442\u043e \u0431\u044b\u043b\u0430 <a href=\"https:\/\/www.cs.rpi.edu\/academics\/courses\/fall13\/csci1200\/hw\/06_ricochet_robots\/hw.pdf\">Ricochet Robots<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u043e\u0439 \u0441\u043e \u0441\u043a\u043e\u043b\u044c\u0436\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043b\u044c\u0434\u0443 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u041c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u0438\u0435 (\u0438 \u044f \u043f\u043e\u0431\u0435\u0434\u0438\u043b \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0438!), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043b \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u0430 \u043f\u0440\u0435\u043f\u043e\u0434\u0430\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>  \u0426\u0435\u043b\u044c \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c \u0432\u0441\u0435\u0445 \u0441 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0435\u0439 \u0438 \u043f\u043e\u0438\u0441\u043a\u043e\u043c \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u0433\u0440\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0433\u043b\u0443\u0431\u0438\u043d\u0430 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0438\u043b\u0438 \u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0412 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u0438\u0433\u0440\u043e\u043a\u0430\u043c \u043c\u043e\u0433\u043b\u0438 \u0438\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c, \u0438\u043b\u0438 \u043d\u0435 \u0441\u043e\u043e\u0431\u0449\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0435\u043b \u0433\u043b\u0443\u0431\u0438\u043d\u044b; \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b \u0431\u044b\u043b\u0438 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438, \u043d\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f. \u042f \u043c\u043d\u043e\u0433\u043e\u043c\u0443 \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043a\u0443\u0447\u0443 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f.  <\/p>\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-332645","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332645","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=332645"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/332645\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=332645"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=332645"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=332645"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}