{"id":445166,"date":"2025-01-16T09:02:07","date_gmt":"2025-01-16T09:02:07","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=445166"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=445166","title":{"rendered":"<span>SQL HowTo: \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e (Advent of Code 2024, Day 9: Disk Fragmenter)<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439\u00a0<a href=\"\/ru\/post\/868964\/\">\u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436-\u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439<\/a>\u00a0\u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c PostgreSQL \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u00a0<a href=\"https:\/\/adventofcode.com\/2024\">Advent of Code 2024<\/a>.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, SQL \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a, \u0437\u0430\u0442\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0438 \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 &#171;\u0433\u0440\u0430\u0431\u043b\u0438&#187;, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0430 SQL&#8230; \u041a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0432\u0441\u0435 \u043d\u0435\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438, <strong>\u0443\u0441\u043a\u043e\u0440\u044f\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437<\/strong>!<\/p>\n<ul>\n<li>\n<p><a href=\"\/ru\/post\/868964\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 1: Historian Hysteria (\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/868982\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 2: Red-Nosed Reports (\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869004\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 3: Mull It Over (&#171;\u0447\u0438\u0441\u0442\u044b\u0435&#187; \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869026\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 4: Ceres Search (\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869654\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 5: Print Queue (\u043f\u043e\u0438\u0441\u043a \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 &#171;\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c&#187;)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869982\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 6: Guard Gallivant (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u0438 \u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/872368\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 7: Bridge Repair (&#171;\u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f&#187; \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/873170\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 8: Resonant Collinearity (\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/873702\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 9: Disk Fragmenter (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/865894\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 11: Plutonian Pebbles (\u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438)<\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/6ea\/1fa\/def\/6ea1fadef8554c68eeee6218a7763373.jpg\" width=\"1216\" height=\"832\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6ea\/1fa\/def\/6ea1fadef8554c68eeee6218a7763373.jpg\" data-blurred=\"true\"\/><\/figure>\n<p><a href=\"https:\/\/adventofcode.com\/2024\/day\/8\">\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/a>\u00a0\u0438 \u0435\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434:<\/p>\n<details class=\"spoiler\">\n<summary>Advent of Code 2024, Day 9: Disk Fragmenter<\/summary>\n<div class=\"spoiler__content\">\n<h3>&#8212; \u0414\u0435\u043d\u044c 9: \u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440 \u0434\u0438\u0441\u043a\u0430 &#8212;<\/h3>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0441 \u0432 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u043a\u043e\u0440\u0438\u0434\u043e\u0440\u0430\u0445 \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u044b\u0445\u00a0<a href=\"https:\/\/adventofcode.com\/2021\/day\/23\">\u0430\u043c\u0444\u0438\u043f\u043e\u0434<\/a>! \u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0432\u0430\u0441 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u0438\u043d\u0438-\u043f\u043e\u0434\u0432\u043e\u0434\u043d\u0443\u044e \u043b\u043e\u0434\u043a\u0443. \u0418\u0441\u0442\u043e\u0440\u0438\u043a\u0438 \u0443\u043b\u0435\u0442\u0430\u044e\u0442 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a\u0438 \u0428\u0435\u0444\u0430, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u0440\u0435\u0437\u0430\u044f\u0441\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0442\u0435\u043d\u044b.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0418\u0441\u0442\u043e\u0440\u0438\u043a\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f, \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438\u043c\u0438 \u0448\u0442\u0443\u043a\u0430\u043c\u0438, \u0432\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442\u0435 \u0432 \u0443\u0433\u043b\u0443 \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u043e\u0440\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c. \u041e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0441\u0436\u0438\u043c\u0430\u044f \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u043d\u043e \u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442; \u0432\u044b \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0435 \u043f\u043e\u043c\u043e\u0447\u044c.<\/p>\n<p>\u041e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u043c\u00a0<strong><em>\u043a\u0430\u0440\u0442\u0443 \u0434\u0438\u0441\u043a\u0430<\/em><\/strong>\u00a0(\u0432\u0430\u0448\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043d \u0443\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>2333133121414131402<\/code><\/pre>\n<p>\u041a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043b\u043e\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u00a0<strong><em>\u0444\u0430\u0439\u043b\u043e\u0432<\/em>\u00a0\u0438\u00a0<em>\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430<\/em><\/strong>\u00a0\u043d\u0430 \u0434\u0438\u0441\u043a\u0435. \u0426\u0438\u0444\u0440\u044b \u043f\u043e\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0434\u043b\u0438\u043d\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f\u00a0<code>12345<\/code>\u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0430\u0439\u043b \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0434\u0432\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0444\u0430\u0439\u043b \u0438\u0437 \u0442\u0440\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0447\u0435\u0442\u044b\u0440\u0435 \u0431\u043b\u043e\u043a\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438 \u0437\u0430\u0442\u0435\u043c \u0444\u0430\u0439\u043b \u0438\u0437 \u043f\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432. \u041a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f\u00a0<code>90909<\/code>\u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 \u0438\u0437 \u0434\u0435\u0432\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e\u0434\u0440\u044f\u0434 (\u0431\u0435\u0437 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438).<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u00a0<strong><em>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440<\/em><\/strong><em>,<\/em>\u00a0\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f\u00a0<strong><em>\u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a<\/em><\/strong>\u00a0\u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 ID\u00a0<code>0<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430\u00a0<code>12345<\/code>\u0438\u043c\u0435\u0435\u0442 \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430: \u0444\u0430\u0439\u043b \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0441 ID\u00a0<code>0<\/code>, \u0444\u0430\u0439\u043b \u0438\u0437 \u0442\u0440\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 ID\u00a0<code>1<\/code>\u0438 \u0444\u0430\u0439\u043b \u0438\u0437 \u043f\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 ID\u00a0<code>2<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0433\u0434\u0435 \u0446\u0438\u0444\u0440\u044b \u2014 \u044d\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430, \u0430\u00a0<code>.<\/code> &#8212; \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430\u00a0<code>12345<\/code>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438:<\/p>\n<pre><code>0..111....22222<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435,\u00a0<code>2333133121414131402<\/code>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u0430\u043a\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438:<\/p>\n<pre><code>00...111...2...333.44.5555.6666.777.888899<\/code><\/pre>\n<p>\u0410\u043c\u0444\u0438\u043f\u043e\u0434 \u0445\u043e\u0442\u0435\u043b \u0431\u044b\u00a0<strong><em>\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u0430 \u0440\u0430\u0437<\/em><\/strong>\u00a0\u0441 \u043a\u043e\u043d\u0446\u0430 \u0434\u0438\u0441\u043a\u0430 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u0431\u043b\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 (\u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432). \u0414\u043b\u044f \u043a\u0430\u0440\u0442\u044b \u0434\u0438\u0441\u043a\u0430\u00a0<code>12345<\/code>\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>0..111....22222 02.111....2222. 022111....222.. 0221112...22... 02211122..2.... 022111222......<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<pre><code>00...111...2...333.44.5555.6666.777.888899 009..111...2...333.44.5555.6666.777.88889. 0099.111...2...333.44.5555.6666.777.8888.. 00998111...2...333.44.5555.6666.777.888... 009981118..2...333.44.5555.6666.777.88.... 0099811188.2...333.44.5555.6666.777.8..... 009981118882...333.44.5555.6666.777....... 0099811188827..333.44.5555.6666.77........ 00998111888277.333.44.5555.6666.7......... 009981118882777333.44.5555.6666........... 009981118882777333644.5555.666............ 00998111888277733364465555.66............. 0099811188827773336446555566..............<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0436\u0430\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u00a0<strong><em>\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/em><\/strong>. \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443, \u0441\u043b\u043e\u0436\u0438\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442. \u0421\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u0431\u043b\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438\u00a0<code>0<\/code>. \u0415\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0435\u0433\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430, \u0440\u0430\u0432\u043d\u0430\u00a0<code>0 * 0 = 0<\/code>,\u00a0<code>1 * 0 = 0<\/code>,\u00a0<code>2 * 9 = 18<\/code>,\u00a0<code>3 * 9 = 27<\/code>,\u00a0<code>4 * 8 = 32<\/code>, \u0438 \u0442. \u0434. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0443\u043c\u043c\u0443 \u044d\u0442\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439,\u00a0<code>1928<\/code>.<\/p>\n<p>\u0423\u043f\u0430\u043a\u0443\u0439\u0442\u0435 \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430,\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441.\u00a0<strong><em>\u041a\u0430\u043a\u043e\u0432\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b?<\/em><\/strong><em>\u00a0<\/em>(\u0411\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b \u043f\u0440\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\/\u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438; \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430.)<\/p>\n<p>\u0412\u0430\u0448 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443 \u0431\u044b\u043b\u00a0<code>6307275788409<\/code>.<\/p>\n<h3>&#8212; \u0427\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f &#8212;<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u044f\u0441\u043d\u044b \u0434\u0432\u0435 \u0432\u0435\u0449\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043a\u0430\u043a \u0438 \u043d\u0430\u0434\u0435\u044f\u043b\u0441\u044f \u0430\u043c\u0444\u0438\u043f\u043e\u0434. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435! \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/File_system_fragmentation\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a>\u00a0\u0431\u044b\u043b\u043e \u043f\u043b\u043e\u0445\u043e\u0439 \u0438\u0434\u0435\u0435\u0439?<\/p>\n<p>\u0423 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u0438\u043c\u0447\u0438\u0432\u043e\u0433\u043e \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043b\u0430\u043d: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438, \u043e\u043d \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u043b\u043e\u0442\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0434\u0438\u0441\u043a\u0435, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044f\u00a0<strong><em>\u0446\u0435\u043b\u044b\u0435 \u0444\u0430\u0439\u043b\u044b<\/em><\/strong>.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0431\u043b\u043e\u043a\u043e\u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b. \u041f\u043e\u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435\u00a0<strong><em>\u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430<\/em><\/strong>, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0441\u0430\u043c\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430. \u0415\u0441\u043b\u0438 \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430, \u0444\u0430\u0439\u043b \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0430\u0447\u0435:<\/p>\n<pre><code>00...111...2...333.44.5555.6666.777.888899 0099.111...2...333.44.5555.6666.777.8888.. 0099.1117772...333.44.5555.6666.....8888.. 0099.111777244.333....5555.6666.....8888.. 00992111777.44.333....5555.6666.....8888..<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439; \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442\u00a0<code>2858<\/code>.<\/p>\n<p>\u041d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0436\u0438\u043c\u0430\u044f \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.\u00a0<strong><em>\u041a\u0430\u043a\u043e\u0432\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b?<\/em><\/strong><\/p>\n<\/div>\n<\/details>\n<h2>\u0427\u0430\u0441\u0442\u044c 1<\/h2>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f &#171;\u0441\u0445\u043e\u0434\u0443&#187;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 &#171;\u043a\u0430\u0440\u0442\u044b&#187; \u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. \u0410\u0432\u0442\u043e\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b <code>WITH ORDINALITY<\/code>, \u0430 ID \u0444\u0430\u0439\u043b\u0430 &#8212; <strong>\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/strong>:<\/p>\n<pre><code class=\"sql\">WITH map AS (   SELECT     sz::::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n             -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid       -- ID \u0444\u0430\u0439\u043b\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''                   -- ... \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c     )       WITH ORDINALITY T(sz, n) )<\/code><\/pre>\n<pre><code>sz |  n | fid  2 |  1 |   0  3 |  2 |  3 |  3 |   1  3 |  4 |  1 |  5 |   2  3 |  6 |  3 |  7 |   3  1 |  8 |  2 |  9 |   4  1 | 10 |  4 | 11 |   5  1 | 12 |  4 | 13 |   6  1 | 14 |  3 | 15 |   7  1 | 16 |  4 | 17 |   8  0 | 18 |  2 | 19 |   9<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u043d\u0430\u0448\u0443 \u043a\u0430\u0440\u0442\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u044b-\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 &#8212; \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438 &#171;\u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445&#187; \u0431\u043b\u043e\u043a\u043e\u0432 <strong>\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f<\/strong> (\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c):<\/p>\n<pre><code class=\"sql\">, blk AS (   SELECT     array_agg(fid ORDER BY n) blkdsk       -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435   , array_agg(fid ORDER BY n DESC)         -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 ...       FILTER(WHERE fid IS NOT NULL) blkfil -- ... \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043d\u044f\u0442\u044b\u0435 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0431\u043b\u043e\u043a\u0438   FROM     map   , unnest(array_fill(NULL::integer, ARRAY[sz::integer])) -- \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c sz \u0440\u0430\u0437 )<\/code><\/pre>\n<pre><code>blkdsk : {0,0,NULL,NULL,NULL,1,1,1,NULL,NULL,NULL,2,NULL,NULL,NULL,3,3,3,NULL,4,4,NULL,5,5,5,5,NULL,6,6,6,6,NULL,7,7,7,NULL,8,8,8,8,9,9} blkfil : {9,9,8,8,8,8,7,7,7,6,6,6,6,5,5,5,5,4,4,3,3,3,2,1,1,1,0,0}<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c <code>array_fill<\/code> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e <code>NULL<\/code> \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043b\u0438\u043d\u044b <code>sz<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430, \u0438 \u0442\u0443\u0442 \u0436\u0435 &#171;\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438&#187; \u0435\u0433\u043e \u0432 <code>sz<\/code> \u0437\u0430\u043f\u0438\u0441\u0435\u0439, &#171;\u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u0432&#187; \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u043c \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u0441\u043a\u043e\u043c\u0443\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u043c (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>WITH RECURSIVE<\/code> \u043f\u0435\u0440\u0435\u0434 <code>map<\/code>) &#171;\u0446\u0438\u043a\u043b\u0435&#187; \u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432:<\/p>\n<pre><code class=\"sql\">, r AS (   SELECT     1 posdsk -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u0430 \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\"   , 1 posfil -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u043e\u0433\u043e\" \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430   , 0::bigint checksum UNION ALL   SELECT     posdsk + 1 -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\" \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437   , posfil + (blkdsk[posdsk] IS NULL)::integer -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u0444\u0430\u0439\u043b\u0430\" - \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \"\u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0439\" \u0431\u043b\u043e\u043a \u043f\u0443\u0441\u0442   , checksum + (posdsk - 1) * coalesce(blkdsk[posdsk], blkfil[posfil])   FROM     r   , blk   WHERE     posdsk &lt;= array_length(blkfil, 1) -- \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430\u0434\u043e \u0434\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 )<\/code><\/pre>\n<pre><code>posdsk | posfil | checksum      1 |      1 |        0      2 |      1 |        0      3 |      1 |        0      4 |      2 |       18      5 |      3 |       45      6 |      4 |       77      7 |      4 |       82      8 |      4 |       88      9 |      4 |       95     10 |      5 |      159     11 |      6 |      231     12 |      7 |      311     13 |      7 |      333     14 |      8 |      417     15 |      9 |      508     16 |     10 |      606     17 |     10 |      651     18 |     10 |      699     19 |     10 |      750     20 |     11 |      858     21 |     11 |      934     22 |     11 |     1014     23 |     12 |     1140     24 |     12 |     1250     25 |     12 |     1365     26 |     12 |     1485     27 |     12 |     1610     28 |     13 |     1766     29 |     13 |     1928<\/code><\/pre>\n<p>\u0418\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u0437\u044f\u0442\u044c &#171;\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435&#187; (\u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u043c <code>posdsk<\/code>) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>checksum<\/code>. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043d\u0430\u0448 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"sql\">WITH RECURSIVE map AS (   SELECT     sz::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n           -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid     -- ID \u0444\u0430\u0439\u043b\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''                   -- ... \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c     )       WITH ORDINALITY T(sz, n) ) , blk AS (   SELECT     array_agg(fid ORDER BY n) blkdsk   , array_agg(fid ORDER BY n DESC) FILTER(WHERE fid IS NOT NULL) blkfil   FROM     map   , unnest(array_fill(NULL::integer, ARRAY[sz::integer])) -- \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c sz \u0440\u0430\u0437 ) , r AS (   SELECT     1 posdsk -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u0430 \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\"   , 1 posfil -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u043e\u0433\u043e\" \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430   , 0::bigint checksum UNION ALL   SELECT     posdsk + 1 -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\" \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437   , posfil + (blkdsk[posdsk] IS NULL)::integer -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u0444\u0430\u0439\u043b\u0430\" - \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \"\u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0439\" \u0431\u043b\u043e\u043a \u043f\u0443\u0441\u0442   , checksum + (posdsk - 1) * coalesce(blkdsk[posdsk], blkfil[posfil])   FROM     r   , blk   WHERE     posdsk &lt;= array_length(blkfil, 1) -- \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430\u0434\u043e \u0434\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 ) SELECT   checksum FROM   r ORDER BY   posdsk DESC LIMIT 1;<\/code><\/pre>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435, \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\u0443, \u043d\u043e \u043f\u0440\u0438 \u0432\u0432\u043e\u0434\u0435 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0430 \u0442\u0430\u043c <strong>20 \u0442\u044b\u0441\u044f\u0447<\/strong> \u0446\u0438\u0444\u0440-\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432) \u0443\u0445\u043e\u0434\u0438\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u043e\u043b\u0433\u043e-\u0434\u043e\u043b\u0433\u043e&#8230;<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/22b114e65cad4defd7c4d6f0822f5281:0:2025-01-15\">\u043f\u043b\u0430\u043d &#171;\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0433\u043e&#187; \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/a>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e8e\/fbd\/c4c\/e8efbdc4c0958f963ff1a7c8d4366390.png\" width=\"1905\" height=\"1020\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e8e\/fbd\/c4c\/e8efbdc4c0958f963ff1a7c8d4366390.png\"\/><\/figure>\n<p>\u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0443 \u043d\u0430\u0441 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 CTE <code>map<\/code> \u0438 <code>blk<\/code>! \u0427\u0440\u0435\u0437\u043c\u0435\u0440\u043d\u043e &#171;\u0443\u043c\u043d\u044b\u0439&#187; PostgreSQL &#171;\u0437\u0430\u0438\u043d\u043b\u0430\u0439\u043d\u0438\u043b&#187; \u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u043d\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u0445\u043e\u0434\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e. \u0422\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0442 \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 (<code>Join Filter<\/code> \u0432 \u0443\u0437\u043b\u0435 <code>Nested Loop<\/code> (#4)) \u0435\u043c\u0443 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f <strong>\u043f\u0435\u0440\u0435\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435<\/strong>!<\/p>\n<p>\u0410 \u043e\u043d\u043e \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435! \u041f\u0440\u0438\u0432\u0435\u0434\u0435\u043c \u0435\u0433\u043e \u0432 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e-\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code>Join Filter: (   r_1.posdsk &lt;= array_length(     (       array_agg(         CASE WHEN ((t.n % '2'::bigint) = 1) THEN (t.n \/ 2) ELSE NULL::bigint END         ORDER BY t.n DESC       )       FILTER (         WHERE (           CASE WHEN ((t.n % '2'::bigint) = 1) THEN (t.n \/ 2) ELSE NULL::bigint END IS NOT NULL         )       )     )   , 1   ) )<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b PostgreSQL \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u043c\u043d\u0438\u0447\u0430\u043b, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>MATERIALIZED<\/code> \u0443 CTE <code>blk<\/code> :<\/p>\n<pre><code class=\"sql\">WITH RECURSIVE map AS (   SELECT     sz::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n           -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid     -- ID \u0444\u0430\u0439\u043b\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''                   -- ... \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c     )       WITH ORDINALITY T(sz, n) ) , blk AS MATERIALIZED (   SELECT     array_agg(fid ORDER BY n) blkdsk   , array_agg(fid ORDER BY n DESC) FILTER(WHERE fid IS NOT NULL) blkfil   FROM     map   , unnest(array_fill(NULL::integer, ARRAY[sz::integer])) -- \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c sz \u0440\u0430\u0437 ) , r AS (   SELECT     1 posdsk -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u0430 \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\"   , 1 posfil -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u043e\u0433\u043e\" \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430   , 0::bigint checksum UNION ALL   SELECT     posdsk + 1 -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\" \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437   , posfil + (blkdsk[posdsk] IS NULL)::integer -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u0444\u0430\u0439\u043b\u0430\" - \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \"\u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0439\" \u0431\u043b\u043e\u043a \u043f\u0443\u0441\u0442   , checksum + (posdsk - 1) * coalesce(blkdsk[posdsk], blkfil[posfil])   FROM     r   , blk   WHERE     posdsk &lt;= array_length(blkfil, 1) -- \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430\u0434\u043e \u0434\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 ) SELECT   checksum FROM   r ORDER BY   posdsk DESC LIMIT 1;<\/code><\/pre>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043f\u043b\u0430\u043d \u0432\u044b\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u043e <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/eae3c15edd423b111a552e4ca61f7fea:0:2025-01-15\">\u0437\u0430 8 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0441\u0435\u043a\u0443\u043d\u0434<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7ad\/02e\/7f4\/7ad02e7f44da936aa1cae139300a2770.png\" width=\"1905\" height=\"1051\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7ad\/02e\/7f4\/7ad02e7f44da936aa1cae139300a2770.png\"\/><\/figure>\n<h3>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c &#8212; \u0431\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438!<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0443\u043c\u0430\u0435\u043c\u0441\u044f &#8212; \u043d\u0443\u0436\u043d\u0430 \u043b\u0438 \u043d\u0430\u043c \u0442\u0443\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f \u0432\u043e\u043e\u0431\u0449\u0435, \u0447\u0442\u043e \u043c\u044b \u0441 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043b\u0430\u043b\u0438?..<\/p>\n<p>\u041f\u043e \u0441\u0443\u0442\u0438, \u043c\u044b \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043b\u0438 \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0434\u0438\u0441\u043a\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0438 \u0437\u0430\u043d\u044f\u0442\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u043c\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 &#8212; \u043d\u043e \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0431\u0435\u0437 \u0432\u0441\u044f\u043a\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438!<\/p>\n<pre><code class=\"sql\">, blk AS (   SELECT     posdsk   , fid   , CASE       WHEN fid IS NULL THEN         count(*) FILTER(WHERE fid IS NULL) OVER(ORDER BY posdsk)     END posfiln -- \"\u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u043c\" \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435   , CASE       WHEN fid IS NOT NULL THEN         count(*) FILTER(WHERE fid IS NOT NULL) OVER(ORDER BY posdsk DESC)     END posfilo -- \"\u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u043c\" \u0437\u0430\u043d\u044f\u0442\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435   FROM     (       SELECT         row_number() OVER() posdsk -- \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438       , map.*       FROM         map       , unnest(array_fill(NULL::integer, ARRAY[sz::integer])) -- \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c sz \u0440\u0430\u0437     ) T )<\/code><\/pre>\n<pre><code>posdsk | fid | posfiln | posfilo      1 |   0 |         |      28      2 |   0 |         |      27      3 |     |       1 |      4 |     |       2 |      5 |     |       3 |      6 |   1 |         |      26      7 |   1 |         |      25      8 |   1 |         |      24      9 |     |       4 |     10 |     |       5 |     11 |     |       6 |     12 |   2 |         |      23     13 |     |       7 |     14 |     |       8 |     15 |     |       9 |     16 |   3 |         |      22     17 |   3 |         |      21     18 |   3 |         |      20     19 |     |      10 |     20 |   4 |         |      19     21 |   4 |         |      18     22 |     |      11 |     23 |   5 |         |      17     24 |   5 |         |      16     25 |   5 |         |      15     26 |   5 |         |      14     27 |     |      12 |     28 |   6 |         |      13     29 |   6 |         |      12     30 |   6 |         |      11     31 |   6 |         |      10     32 |     |      13 |     33 |   7 |         |       9     34 |   7 |         |       8     35 |   7 |         |       7     36 |     |      14 |     37 |   8 |         |       6     38 |   8 |         |       5     39 |   8 |         |       4     40 |   8 |         |       3     41 |   9 |         |       2     42 |   9 |         |       1<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0441 \u0441\u043e\u0431\u043e\u0439 \u0436\u0435, \u0441\u0442\u044b\u043a\u0443\u044f \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043a \u0441\u0442\u0430\u0440\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 <code>LEFT JOIN<\/code> , \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0447\u0435\u043a-\u0441\u0443\u043c\u043c\u0443. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432:<\/p>\n<pre><code class=\"sql\">SELECT   sum((n.posdsk - 1) * coalesce(n.fid, o.fid)) -- \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c -1! FROM   blk n LEFT JOIN   blk o     ON n.posfiln = o.posfilo -- \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e\/\u0441\u0442\u0430\u0440\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 WHERE   n.posdsk &lt;= (SELECT sum(sz) FILTER(WHERE fid IS NOT NULL) FROM map); -- \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043d\u044f\u0442\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0448 \u0437\u0430\u043f\u0440\u043e\u0441 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"sql\">WITH map AS (   SELECT     sz::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n           -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid     -- ID \u0444\u0430\u0439\u043b\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''                   -- ... \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c     )       WITH ORDINALITY T(sz, n) ) , blk AS (   SELECT     posdsk   , fid   , CASE       WHEN fid IS NULL THEN         count(*) FILTER(WHERE fid IS NULL) OVER(ORDER BY posdsk)     END posfiln -- \"\u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u043c\" \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435   , CASE       WHEN fid IS NOT NULL THEN         count(*) FILTER(WHERE fid IS NOT NULL) OVER(ORDER BY posdsk DESC)     END posfilo -- \"\u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u043c\" \u0437\u0430\u043d\u044f\u0442\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435   FROM     (       SELECT         row_number() OVER() posdsk -- \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438       , map.*       FROM         map       , unnest(array_fill(NULL::integer, ARRAY[sz::integer])) -- \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c sz \u0440\u0430\u0437     ) T ) SELECT   sum((n.posdsk - 1) * coalesce(n.fid, o.fid)) -- \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c -1! FROM   blk n LEFT JOIN   blk o     ON n.posfiln = o.posfilo -- \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e\/\u0441\u0442\u0430\u0440\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 WHERE   n.posdsk &lt;= (SELECT sum(sz) FILTER(WHERE fid IS NOT NULL) FROM map); -- \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043d\u044f\u0442\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438<\/code><\/pre>\n<p>\u041d\u0435\u043b\u044c\u0437\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u0430\u043a-\u0442\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0436 \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u0435\u0433\u043e <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/ada5a12d94a550cfdff6417e4cf4788c:0:2025-01-15\">\u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b\u043e\u0441\u044c \u0432 25 \u0440\u0430\u0437<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b70\/769\/705\/b70769705f1bdca1d8e13402e5e80d5d.png\" width=\"1857\" height=\"1413\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b70\/769\/705\/b70769705f1bdca1d8e13402e5e80d5d.png\"\/><\/figure>\n<h2>\u0427\u0430\u0441\u0442\u044c 2<\/h2>\n<p>\u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u0441 \u043f\u0440\u043e\u0441\u044f\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438, \u0430 \u0446\u0435\u043b\u0438\u043a\u043e\u0432\u044b\u043c\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u0430\u043c\u043e\u0435 \u043d\u0430\u0447\u0430\u043b\u043e \u043d\u0430\u0448\u0435\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"sql\">WITH map AS (   SELECT     sz::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n           -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid     -- ID \u0444\u0430\u0439\u043b\u0430   , sum(sz::bigint) OVER(ORDER BY n) - sz::bigint pos -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''                   -- ... \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c     )       WITH ORDINALITY T(sz, n) )<\/code><\/pre>\n<pre><code>sz |  n | fid | pos  2 |  1 |   0 |   0  3 |  2 |     |   2  3 |  3 |   1 |   5  3 |  4 |     |   8  1 |  5 |   2 |  11  3 |  6 |     |  12  3 |  7 |   3 |  15  1 |  8 |     |  18  2 |  9 |   4 |  19  1 | 10 |     |  21  4 | 11 |   5 |  22  1 | 12 |     |  26  4 | 13 |   6 |  27  1 | 14 |     |  31  3 | 15 |   7 |  32  1 | 16 |     |  35  4 | 17 |   8 |  36  0 | 18 |     |  40  2 | 19 |   9 |  40<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0442\u0443\u0442 \u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0435\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e, \u0431\u0435\u0437 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0436 \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u0441\u043e\u0431\u0435\u0440\u0435\u043c \u0434\u0432\u0435 &#171;\u043a\u0430\u0440\u0442\u044b&#187; \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u0430\u0440\u0430\u043c\u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u0439 \u043d\u0430\u0447\u0430\u043b\u0430\/\u043a\u043e\u043d\u0446\u0430: \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 (\u0441\u0440\u0430\u0437\u0443 \u0443\u043a\u0430\u0436\u0435\u043c <code>MATERIALIZED<\/code>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043d\u0430 \u0442\u0435 \u0436\u0435 \u0433\u0440\u0430\u0431\u043b\u0438):<\/p>\n<pre><code class=\"sql\">, seg AS MATERIALIZED (   SELECT     array_agg(ARRAY[pos, pos + sz]::integer[] ORDER BY n DESC)       FILTER(WHERE fid IS NOT NULL) segfile -- \u043a\u0430\u0440\u0442\u0430 \u0444\u0430\u0439\u043b\u043e\u0432   , array_agg(ARRAY[pos, pos + sz]::integer[] ORDER BY n)       FILTER(WHERE fid IS NULL) segfree     -- \u043a\u0430\u0440\u0442\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432   FROM     map )<\/code><\/pre>\n<pre><code>segfile : {{40,42},{36,40},{32,35},{27,31},{22,26},{19,21},{15,18},{11,12},{5,8},{0,2}} segfree : {{2,5},{8,11},{12,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 &#8212; \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438 \u043d\u0430\u0439\u0442\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u044b\u0439 \u0444\u0430\u0439\u043b, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e &#171;\u043f\u0440\u0438\u043c\u0435\u0440\u044f\u044f&#187; \u0435\u0433\u043e \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 &#171;\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u043c\u0443&#187; \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0443:<\/p>\n<pre><code class=\"sql\">, r AS (   SELECT     1 i   , *   FROM     seg UNION ALL   SELECT     i + 1   , coalesce(T.segfile, r.segfile) -- \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 - \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e ...   , coalesce(T.segfree, r.segfree) -- ... \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 - \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0440\u0435\u0436\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f   FROM     r   LEFT JOIN     LATERAL (       SELECT -- \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432-\u043a\u0430\u0440\u0442 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430         segfile[:i - 1]         || ARRAY[segfree[j][1], segfree[j][1] + segfile[i][2] - segfile[i][1]]         || segfile[i + 1:] segfile       , segfree[:j - 1]         || ARRAY[segfree[j][1] + segfile[i][2] - segfile[i][1], segfree[j][2]]         || segfree[j + 1:] segfree       FROM         generate_subscripts(segfree, 1) j -- \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432       WHERE         segfree[j][1] &lt; segfile[i][1] AND -- \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430         segfree[j][2] - segfree[j][1] &gt;= segfile[i][2] - segfile[i][1]       LIMIT 1 -- \u0438\u0449\u0435\u043c \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438     ) T       ON TRUE   WHERE     i &lt;= array_length(r.segfile, 1) -- \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432 )<\/code><\/pre>\n<pre><code> i | segfile\/segfree  1 | {{40,42},{36,40},{32,35},{27,31},{22,26},{19,21},{15,18},{11,12},{5,8},{0,2}}      {{2,5},{8,11},{12,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  2 | {{2,4},{36,40},{32,35},{27,31},{22,26},{19,21},{15,18},{11,12},{5,8},{0,2}}      {{4,5},{8,11},{12,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  3 | {{2,4},{36,40},{32,35},{27,31},{22,26},{19,21},{15,18},{11,12},{5,8},{0,2}}      {{4,5},{8,11},{12,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  4 | {{2,4},{36,40},{8,11},{27,31},{22,26},{19,21},{15,18},{11,12},{5,8},{0,2}}      {{4,5},{11,11},{12,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  5 | {{2,4},{36,40},{8,11},{27,31},{22,26},{19,21},{15,18},{11,12},{5,8},{0,2}}      {{4,5},{11,11},{12,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  6 | {{2,4},{36,40},{8,11},{27,31},{22,26},{19,21},{15,18},{11,12},{5,8},{0,2}}      {{4,5},{11,11},{12,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  7 | {{2,4},{36,40},{8,11},{27,31},{22,26},{12,14},{15,18},{11,12},{5,8},{0,2}}      {{4,5},{11,11},{14,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  8 | {{2,4},{36,40},{8,11},{27,31},{22,26},{12,14},{15,18},{11,12},{5,8},{0,2}}      {{4,5},{11,11},{14,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}  9 | {{2,4},{36,40},{8,11},{27,31},{22,26},{12,14},{15,18},{4,5},{5,8},{0,2}}      {{5,5},{11,11},{14,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}} 10 | {{2,4},{36,40},{8,11},{27,31},{22,26},{12,14},{15,18},{4,5},{5,8},{0,2}}      {{5,5},{11,11},{14,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}} 11 | {{2,4},{36,40},{8,11},{27,31},{22,26},{12,14},{15,18},{4,5},{5,8},{0,2}}      {{5,5},{11,11},{14,15},{18,19},{21,22},{26,27},{31,32},{35,36},{40,40}}<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u043f\u0440\u043e\u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0435\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442:<\/p>\n<pre><code class=\"sql\">SELECT   sum(fid * i) -- \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 FROM   (     SELECT       segfile -- \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430     FROM       r     ORDER BY       i DESC     LIMIT 1   ) T , array_length(segfile, 1) files -- \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 , generate_series(     files - 1   , 0   , -1   ) fid -- \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 , generate_series(     segfile[files - fid][1]   , segfile[files - fid][2] - 1   ) i; -- \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430<\/code><\/pre>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"sql\">WITH RECURSIVE map AS (   SELECT     sz::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n           -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid     -- ID \u0444\u0430\u0439\u043b\u0430   , sum(sz::bigint) OVER(ORDER BY n) - sz::bigint pos -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''                   -- ... \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c     )       WITH ORDINALITY T(sz, n) ) , seg AS MATERIALIZED (   SELECT     array_agg(ARRAY[pos, pos + sz]::integer[] ORDER BY n DESC)       FILTER(WHERE fid IS NOT NULL) segfile -- \u043a\u0430\u0440\u0442\u0430 \u0444\u0430\u0439\u043b\u043e\u0432   , array_agg(ARRAY[pos, pos + sz]::integer[] ORDER BY n)       FILTER(WHERE fid IS NULL) segfree     -- \u043a\u0430\u0440\u0442\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432   FROM     map ) , r AS (   SELECT     1 i   , *   FROM     seg UNION ALL   SELECT     i + 1   , coalesce(T.segfile, r.segfile) -- \u0435\u0441\u043b\u0438 \u043d\u0430\u0448\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u0430 - \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0435\u0433\u043e ...   , coalesce(T.segfree, r.segfree) -- ... \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 - \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0440\u0435\u0436\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f   FROM     r   LEFT JOIN     LATERAL (       SELECT -- \u0440\u0435\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432-\u043a\u0430\u0440\u0442 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430         segfile[:i - 1]         || ARRAY[segfree[j][1], segfree[j][1] + segfile[i][2] - segfile[i][1]]         || segfile[i + 1:] segfile       , segfree[:j - 1]         || ARRAY[segfree[j][1] + segfile[i][2] - segfile[i][1], segfree[j][2]]         || segfree[j + 1:] segfree       FROM         generate_subscripts(segfree, 1) j -- \u043f\u0435\u0440\u0435\u0431\u043e\u0440 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432       WHERE         segfree[j][1] &lt; segfile[i][1] AND -- \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430         segfree[j][2] - segfree[j][1] &gt;= segfile[i][2] - segfile[i][1]       LIMIT 1 -- \u0438\u0449\u0435\u043c \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438     ) T       ON TRUE   WHERE     i &lt;= array_length(r.segfile, 1) -- \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0444\u0430\u0439\u043b\u043e\u0432 ) SELECT   sum(fid * i) -- \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 FROM   (     SELECT       segfile -- \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430     FROM       r     ORDER BY       i DESC     LIMIT 1   ) T , array_length(segfile, 1) files -- \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 , generate_series(     files - 1   , 0   , -1   ) fid -- \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 , generate_series(     segfile[files - fid][1]   , segfile[files - fid][2] - 1   ) i; -- \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430<\/code><\/pre>\n<p>\u041b\u043e\u0433\u0438\u0447\u043d\u043e, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u043d\u044f\u043b\u0438 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 &#8212; <a href=\"https:\/\/explain.tensor.ru\/archive\/explain\/71aad0d714e81484c6606ef991f75b9c:0:2025-01-15\">\u043f\u043e\u0440\u044f\u0434\u043a\u0430 22.5 \u0441\u0435\u043a\u0443\u043d\u0434<\/a>, \u0430 90% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 &#8212; \u043f\u043e\u0438\u0441\u043a\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/265\/9a4\/9aa\/2659a49aae9c9c9ab08c9ca83dd566e0.png\" width=\"1857\" height=\"1440\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/265\/9a4\/9aa\/2659a49aae9c9c9ab08c9ca83dd566e0.png\"\/><\/figure>\n<p>\u042d\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b &#171;\u043d\u0430 \u043a\u0443\u0447\u043a\u0438&#187; \u043f\u043e \u0434\u043b\u0438\u043d\u0435, \u0438 \u0441\u0440\u0430\u0437\u0443 <strong>\u0432\u043c\u0435\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u0431\u0440\u0430\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432<\/strong> \u0434\u043b\u0438\u043d\u044b \u043d\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439. \u041d\u043e \u043d\u0430 SQL \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435 \u0434\u0430\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0437-\u0437\u0430 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0445 \u0440\u0430\u0441\u0445\u043e\u0434\u043e\u0432 \u0438\u0437-\u0437\u0430 &#171;\u043f\u0440\u043e\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f&#187; \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 \u0441\u043a\u0432\u043e\u0437\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/873702\/\"> https:\/\/habr.com\/ru\/articles\/873702\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u044d\u0442\u043e\u0439\u00a0<a href=\"\/ru\/post\/868964\/\">\u0447\u0435\u043b\u043b\u0435\u043d\u0434\u0436-\u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439<\/a>\u00a0\u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c PostgreSQL \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u00a0<a href=\"https:\/\/adventofcode.com\/2024\">Advent of Code 2024<\/a>.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, SQL \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f\u0437\u044b\u043a, \u0437\u0430\u0442\u043e \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0435\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u043c\u043e\u0433\u043b\u0438 \u0438 \u043d\u0435 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 &#171;\u0433\u0440\u0430\u0431\u043b\u0438&#187;, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442\u044c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0430 SQL&#8230; \u041a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043e\u0432\u0441\u0435 \u043d\u0435\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u043c\u0438, <strong>\u0443\u0441\u043a\u043e\u0440\u044f\u044f \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0440\u0430\u0437<\/strong>!<\/p>\n<ul>\n<li>\n<p><a href=\"\/ru\/post\/868964\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 1: Historian Hysteria (\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/868982\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 2: Red-Nosed Reports (\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u044b)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869004\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 3: Mull It Over (&#171;\u0447\u0438\u0441\u0442\u044b\u0435&#187; \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043a\u0438)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869026\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 4: Ceres Search (\u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869654\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 5: Print Queue (\u043f\u043e\u0438\u0441\u043a \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u0445, \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 &#171;\u043f\u0443\u0437\u044b\u0440\u044c\u043a\u043e\u043c&#187;)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/869982\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 6: Guard Gallivant (\u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0446\u0438\u043a\u043b\u044b \u0438 \u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/872368\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 7: Bridge Repair (&#171;\u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f&#187; \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044f)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/873170\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 8: Resonant Collinearity (\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0438 \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/873702\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 9: Disk Fragmenter (\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u044e)<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"\/ru\/post\/865894\/\">\u0420\u0435\u0448\u0435\u043d\u0438\u0435 Day 11: Plutonian Pebbles (\u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0438)<\/a><\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<figure class=\"full-width\"><\/figure>\n<p><a href=\"https:\/\/adventofcode.com\/2024\/day\/8\">\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/a>\u00a0\u0438 \u0435\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434:<\/p>\n<details class=\"spoiler\">\n<summary>Advent of Code 2024, Day 9: Disk Fragmenter<\/summary>\n<div class=\"spoiler__content\">\n<h3>&#8212; \u0414\u0435\u043d\u044c 9: \u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440 \u0434\u0438\u0441\u043a\u0430 &#8212;<\/h3>\n<p>\u0415\u0449\u0435 \u043e\u0434\u043d\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0430\u0441 \u0432 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0445 \u043a\u043e\u0440\u0438\u0434\u043e\u0440\u0430\u0445 \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u043d\u044b\u0445\u00a0<a href=\"https:\/\/adventofcode.com\/2021\/day\/23\">\u0430\u043c\u0444\u0438\u043f\u043e\u0434<\/a>! \u0425\u043e\u0440\u043e\u0448\u043e, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u0432\u0430\u0441 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0441\u0432\u043e\u044e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u0438\u043d\u0438-\u043f\u043e\u0434\u0432\u043e\u0434\u043d\u0443\u044e \u043b\u043e\u0434\u043a\u0443. \u0418\u0441\u0442\u043e\u0440\u0438\u043a\u0438 \u0443\u043b\u0435\u0442\u0430\u044e\u0442 \u043d\u0430 \u043f\u043e\u0438\u0441\u043a\u0438 \u0428\u0435\u0444\u0430, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0432\u0440\u0435\u0437\u0430\u044f\u0441\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0441\u0442\u0435\u043d\u044b.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0418\u0441\u0442\u043e\u0440\u0438\u043a\u0438 \u0431\u044b\u0441\u0442\u0440\u043e \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f, \u043a\u0430\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u044d\u0442\u0438\u043c\u0438 \u0448\u0442\u0443\u043a\u0430\u043c\u0438, \u0432\u044b \u0437\u0430\u043c\u0435\u0447\u0430\u0435\u0442\u0435 \u0432 \u0443\u0433\u043b\u0443 \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u043e\u0440\u0435\u0442\u0441\u044f \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u043c. \u041e\u043d \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0441\u0436\u0438\u043c\u0430\u044f \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u043d\u043e \u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442; \u0432\u044b \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0435 \u043f\u043e\u043c\u043e\u0447\u044c.<\/p>\n<p>\u041e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0430\u043c\u00a0<strong><em>\u043a\u0430\u0440\u0442\u0443 \u0434\u0438\u0441\u043a\u0430<\/em><\/strong>\u00a0(\u0432\u0430\u0448\u0438 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u043d \u0443\u0436\u0435 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code>2333133121414131402<\/code><\/pre>\n<p>\u041a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043b\u043e\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u00a0<strong><em>\u0444\u0430\u0439\u043b\u043e\u0432<\/em>\u00a0\u0438\u00a0<em>\u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430<\/em><\/strong>\u00a0\u043d\u0430 \u0434\u0438\u0441\u043a\u0435. \u0426\u0438\u0444\u0440\u044b \u043f\u043e\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0434\u043b\u0438\u043d\u0443 \u0444\u0430\u0439\u043b\u0430 \u0438 \u0434\u043b\u0438\u043d\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f\u00a0<code>12345<\/code>\u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0444\u0430\u0439\u043b \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0434\u0432\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0444\u0430\u0439\u043b \u0438\u0437 \u0442\u0440\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0447\u0435\u0442\u044b\u0440\u0435 \u0431\u043b\u043e\u043a\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438 \u0437\u0430\u0442\u0435\u043c \u0444\u0430\u0439\u043b \u0438\u0437 \u043f\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432. \u041a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430 \u043f\u043e\u0434\u043e\u0431\u043d\u0430\u044f\u00a0<code>90909<\/code>\u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430 \u0438\u0437 \u0434\u0435\u0432\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u043f\u043e\u0434\u0440\u044f\u0434 (\u0431\u0435\u0437 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438).<\/p>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442\u00a0<strong><em>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440<\/em><\/strong><em>,<\/em>\u00a0\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u0430\u043a \u043e\u043d\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f\u00a0<strong><em>\u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a<\/em><\/strong>\u00a0\u043e\u043d\u0438 \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 ID\u00a0<code>0<\/code>. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430\u00a0<code>12345<\/code>\u0438\u043c\u0435\u0435\u0442 \u0442\u0440\u0438 \u0444\u0430\u0439\u043b\u0430: \u0444\u0430\u0439\u043b \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0441 ID\u00a0<code>0<\/code>, \u0444\u0430\u0439\u043b \u0438\u0437 \u0442\u0440\u0435\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 ID\u00a0<code>1<\/code>\u0438 \u0444\u0430\u0439\u043b \u0438\u0437 \u043f\u044f\u0442\u0438 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441 ID\u00a0<code>2<\/code>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043e\u0434\u0438\u043d \u0441\u0438\u043c\u0432\u043e\u043b \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430, \u0433\u0434\u0435 \u0446\u0438\u0444\u0440\u044b \u2014 \u044d\u0442\u043e \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430, \u0430\u00a0<code>.<\/code> &#8212; \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043a\u0430\u0440\u0442\u0430 \u0434\u0438\u0441\u043a\u0430\u00a0<code>12345<\/code>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u043a\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438:<\/p>\n<pre><code>0..111....22222<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0448\u0435,\u00a0<code>2333133121414131402<\/code>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u0430\u043a\u0438\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438:<\/p>\n<pre><code>00...111...2...333.44.5555.6666.777.888899<\/code><\/pre>\n<p>\u0410\u043c\u0444\u0438\u043f\u043e\u0434 \u0445\u043e\u0442\u0435\u043b \u0431\u044b\u00a0<strong><em>\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0437\u0430 \u0440\u0430\u0437<\/em><\/strong>\u00a0\u0441 \u043a\u043e\u043d\u0446\u0430 \u0434\u0438\u0441\u043a\u0430 \u0432 \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u0431\u043b\u043e\u043a \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 (\u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0431\u043b\u043e\u043a\u0430\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432). \u0414\u043b\u044f \u043a\u0430\u0440\u0442\u044b \u0434\u0438\u0441\u043a\u0430\u00a0<code>12345<\/code>\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code>0..111....22222 02.111....2222. 022111....222.. 0221112...22... 02211122..2.... 022111222......<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0448\u0430\u0433\u043e\u0432:<\/p>\n<pre><code>00...111...2...333.44.5555.6666.777.888899 009..111...2...333.44.5555.6666.777.88889. 0099.111...2...333.44.5555.6666.777.8888.. 00998111...2...333.44.5555.6666.777.888... 009981118..2...333.44.5555.6666.777.88.... 0099811188.2...333.44.5555.6666.777.8..... 009981118882...333.44.5555.6666.777....... 0099811188827..333.44.5555.6666.77........ 00998111888277.333.44.5555.6666.7......... 009981118882777333.44.5555.6666........... 009981118882777333644.5555.666............ 00998111888277733364465555.66............. 0099811188827773336446555566..............<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0436\u0430\u0442\u0438\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u00a0<strong><em>\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/em><\/strong>. \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443, \u0441\u043b\u043e\u0436\u0438\u0442\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442. \u0421\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u0431\u043b\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438\u00a0<code>0<\/code>. \u0415\u0441\u043b\u0438 \u0431\u043b\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0435\u0433\u043e.<\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044f \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u044b\u0445 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0431\u043b\u043e\u043a\u043e\u0432, \u0443\u043c\u043d\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u043d\u0430 \u043d\u043e\u043c\u0435\u0440 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430, \u0440\u0430\u0432\u043d\u0430\u00a0<code>0 * 0 = 0<\/code>,\u00a0<code>1 * 0 = 0<\/code>,\u00a0<code>2 * 9 = 18<\/code>,\u00a0<code>3 * 9 = 27<\/code>,\u00a0<code>4 * 8 = 32<\/code>, \u0438 \u0442. \u0434. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0443\u043c\u043c\u0443 \u044d\u0442\u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439,\u00a0<code>1928<\/code>.<\/p>\n<p>\u0423\u043f\u0430\u043a\u0443\u0439\u0442\u0435 \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430,\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u043d\u044b\u0439 \u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441.\u00a0<strong><em>\u041a\u0430\u043a\u043e\u0432\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b?<\/em><\/strong><em>\u00a0<\/em>(\u0411\u0443\u0434\u044c\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u044b \u043f\u0440\u0438 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438\/\u0432\u0441\u0442\u0430\u0432\u043a\u0435 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0438; \u044d\u0442\u043e \u043e\u0434\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u0434\u043b\u0438\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430.)<\/p>\n<p>\u0412\u0430\u0448 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0433\u043e\u043b\u043e\u0432\u043e\u043b\u043e\u043c\u043a\u0443 \u0431\u044b\u043b\u00a0<code>6307275788409<\/code>.<\/p>\n<h3>&#8212; \u0427\u0430\u0441\u0442\u044c \u0432\u0442\u043e\u0440\u0430\u044f &#8212;<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u044f\u0441\u043d\u044b \u0434\u0432\u0435 \u0432\u0435\u0449\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u043a\u0430\u043a \u0438 \u043d\u0430\u0434\u0435\u044f\u043b\u0441\u044f \u0430\u043c\u0444\u0438\u043f\u043e\u0434. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435! \u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0439 \u044d\u0442\u043e\u0439\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/File_system_fragmentation\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a>\u00a0\u0431\u044b\u043b\u043e \u043f\u043b\u043e\u0445\u043e\u0439 \u0438\u0434\u0435\u0435\u0439?<\/p>\n<p>\u0423 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u0438\u043c\u0447\u0438\u0432\u043e\u0433\u043e \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u043b\u0430\u043d: \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438, \u043e\u043d \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0443\u043f\u043b\u043e\u0442\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u0434\u0438\u0441\u043a\u0435, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u044f\u00a0<strong><em>\u0446\u0435\u043b\u044b\u0435 \u0444\u0430\u0439\u043b\u044b<\/em><\/strong>.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u043e\u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0446\u0435\u043b\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u0441\u0430\u043c\u044b\u0439 \u043b\u0435\u0432\u044b\u0439 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0431\u043b\u043e\u043a\u043e\u0432 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043b. \u041f\u043e\u043f\u044b\u0442\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0430\u0439\u043b \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435\u00a0<strong><em>\u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u043c\u0435\u0440\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430<\/em><\/strong>, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0441\u0430\u043c\u044b\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u0444\u0430\u0439\u043b\u0430. \u0415\u0441\u043b\u0438 \u0441\u043b\u0435\u0432\u0430 \u043e\u0442 \u0444\u0430\u0439\u043b\u0430 \u043d\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0444\u0430\u0439\u043b\u0430, \u0444\u0430\u0439\u043b \u043d\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0438\u043d\u0430\u0447\u0435:<\/p>\n<pre><code>00...111...2...333.44.5555.6666.777.888899 0099.111...2...333.44.5555.6666.777.8888.. 0099.1117772...333.44.5555.6666.....8888.. 0099.111777244.333....5555.6666.....8888.. 00992111777.44.333....5555.6666.....8888..<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u043e\u0442 \u0436\u0435 \u0441\u0430\u043c\u044b\u0439; \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0431\u0443\u0434\u0435\u0442\u00a0<code>2858<\/code>.<\/p>\n<p>\u041d\u0430\u0447\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0436\u0438\u043c\u0430\u044f \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0434\u0438\u0441\u043a \u0430\u043c\u0444\u0438\u043f\u043e\u0434\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u044d\u0442\u043e\u0442 \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434.\u00a0<strong><em>\u041a\u0430\u043a\u043e\u0432\u0430 \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b?<\/em><\/strong><\/p>\n<\/div>\n<\/details>\n<h2>\u0427\u0430\u0441\u0442\u044c 1<\/h2>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f &#171;\u0441\u0445\u043e\u0434\u0443&#187;, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0438\u0437 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 &#171;\u043a\u0430\u0440\u0442\u044b&#187; \u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. \u0410\u0432\u0442\u043e\u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e \u0441\u0442\u0440\u043e\u043a \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043f\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b <code>WITH ORDINALITY<\/code>, \u0430 ID \u0444\u0430\u0439\u043b\u0430 &#8212; <strong>\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043d\u043e\u043c\u0435\u0440\u0430 \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043d\u0435\u0447\u0435\u0442\u043d\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438<\/strong>:<\/p>\n<pre><code class=\"sql\">WITH map AS (   SELECT     sz::::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n             -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid       -- ID \u0444\u0430\u0439\u043b\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''                   -- ... \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c     )       WITH ORDINALITY T(sz, n) )<\/code><\/pre>\n<pre><code>sz |  n | fid  2 |  1 |   0  3 |  2 |  3 |  3 |   1  3 |  4 |  1 |  5 |   2  3 |  6 |  3 |  7 |   3  1 |  8 |  2 |  9 |   4  1 | 10 |  4 | 11 |   5  1 | 12 |  4 | 13 |   6  1 | 14 |  3 | 15 |   7  1 | 16 |  4 | 17 |   8  0 | 18 |  2 | 19 |   9<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u043d\u0430\u0448\u0443 \u043a\u0430\u0440\u0442\u0443 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0434\u0432\u0435 \u043a\u0430\u0440\u0442\u044b-\u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 &#8212; \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438 &#171;\u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445&#187; \u0431\u043b\u043e\u043a\u043e\u0432 <strong>\u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f<\/strong> (\u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c):<\/p>\n<pre><code class=\"sql\">, blk AS (   SELECT     array_agg(fid ORDER BY n) blkdsk       -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432 \u043f\u0440\u044f\u043c\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435   , array_agg(fid ORDER BY n DESC)         -- \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435 ...       FILTER(WHERE fid IS NOT NULL) blkfil -- ... \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043d\u044f\u0442\u044b\u0435 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0431\u043b\u043e\u043a\u0438   FROM     map   , unnest(array_fill(NULL::integer, ARRAY[sz::integer])) -- \u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044c sz \u0440\u0430\u0437 )<\/code><\/pre>\n<pre><code>blkdsk : {0,0,NULL,NULL,NULL,1,1,1,NULL,NULL,NULL,2,NULL,NULL,NULL,3,3,3,NULL,4,4,NULL,5,5,5,5,NULL,6,6,6,6,NULL,7,7,7,NULL,8,8,8,8,9,9} blkfil : {9,9,8,8,8,8,7,7,7,6,6,6,6,5,5,5,5,4,4,3,3,3,2,1,1,1,0,0}<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c <code>array_fill<\/code> \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0433\u043e <code>NULL<\/code> \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0434\u043b\u0438\u043d\u044b <code>sz<\/code> \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430, \u0438 \u0442\u0443\u0442 \u0436\u0435 &#171;\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438&#187; \u0435\u0433\u043e \u0432 <code>sz<\/code> \u0437\u0430\u043f\u0438\u0441\u0435\u0439, &#171;\u0440\u0430\u0437\u043c\u043d\u043e\u0436\u0438\u0432&#187; \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043d\u0443\u0436\u043d\u043e\u0435 \u043d\u0430\u043c \u0447\u0438\u0441\u043b\u043e \u0440\u0430\u0437.<\/p>\n<p>\u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0438\u0441\u043a\u043e\u043c\u0443\u044e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0443\u044e \u0441\u0443\u043c\u043c\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u043c (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>WITH RECURSIVE<\/code> \u043f\u0435\u0440\u0435\u0434 <code>map<\/code>) &#171;\u0446\u0438\u043a\u043b\u0435&#187; \u0434\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u0432:<\/p>\n<pre><code class=\"sql\">, r AS (   SELECT     1 posdsk -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u0430 \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\"   , 1 posfil -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c\u043e\u0433\u043e\" \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430   , 0::bigint checksum UNION ALL   SELECT     posdsk + 1 -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u043d\u0430 \u0434\u0438\u0441\u043a\u0435\" \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437   , posfil + (blkdsk[posdsk] IS NULL)::integer -- \u043f\u043e\u0437\u0438\u0446\u0438\u044f \"\u0444\u0430\u0439\u043b\u0430\" - \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \"\u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0439\" \u0431\u043b\u043e\u043a \u043f\u0443\u0441\u0442   , checksum + (posdsk - 1) * coalesce(blkdsk[posdsk], blkfil[posfil])   FROM     r   , blk   WHERE     posdsk &lt;= array_length(blkfil, 1) -- \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430\u0434\u043e \u0434\u043e \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 )<\/code><\/pre>\n<pre><code>posdsk | posfil | checksum      1 |      1 |        0      2 |      1 |        0      3 |      1 |        0      4 |      2 |       18      5 |      3 |       45      6 |      4 |       77      7 |      4 |       82      8 |      4 |       88      9 |      4 |       95     10 |      5 |      159     11 |      6 |      231     12 |      7 |      311     13 |      7 |      333     14 |      8 |      417     15 |      9 |      508     16 |     10 |      606     17 |     10 |      651     18 |     10 |      699     19 |     10 |      750     20 |     11 |      858     21 |     11 |      934     22 |     11 |     1014     23 |     12 |     1140     24 |     12 |     1250     25 |     12 |     1365     26 |     12 |     1485     27 |     12 |     1610     28 |     13 |     1766     29 |     13 |     1928<\/code><\/pre>\n<p>\u0418\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u0432\u0437\u044f\u0442\u044c &#171;\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435&#187; (\u0441 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0438\u043c <code>posdsk<\/code>) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>checksum<\/code>. \u0412 \u0446\u0435\u043b\u043e\u043c, \u043d\u0430\u0448 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"sql\">WITH RECURSIVE map AS (   SELECT     sz::integer -- \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , n           -- \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430   , CASE       WHEN n % 2 = 1 THEN n \/ 2     END fid     -- ID \u0444\u0430\u0439\u043b\u0430   FROM     regexp_split_to_table( -- \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ...       '2333133121414131402'     , ''        <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-445166","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/445166","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=445166"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/445166\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=445166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=445166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=445166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}