рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, SQL.ru рдлреЛрд░рдо
рдиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд░реЗ рдЯреНрд░реЗрд╕рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА
рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╣ "PIXAR" рд╢рдмреНрдж рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдБред
рдкреНрд░рдпреЛрдЧ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ SQLite рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╡рд╣рд╛рдВ рдПрдХ SQRT рдлрд╝рдВрдХреНрд╢рди рднреА рдирд╣реАрдВ рд╣реИред
WITH RECURSIVE numbers AS (SELECT 0 AS n UNION ALL SELECT n+1 FROM numbers WHERE n<89), pixels AS (SELECT rows.n as row, cols.n as col FROM numbers as rows CROSS JOIN numbers as cols WHERE rows.n > 4 AND rows.n < 38 AND cols.n > 9 AND cols.n < 89), rawRays AS (SELECT row, col, -0.9049 + col * 0.0065 + row * 0.0057 as x, -0.1487 + row * -0.0171 as y, 0.6713 + col * 0.0045 + row * -0.0081 as z FROM pixels), norms AS (SELECT row, col, x, y, z, (1 + x * x + y * y + z * z) / 2 as n FROM rawRays), rays AS (SELECT row, col, x / n AS x, y / n AS y, z / n AS z FROM norms), iters AS (SELECT row, col, 0 as it, 0 as v FROM rays UNION ALL SELECT rays.row, rays.col, it + 1 AS it, v + MAX(ABS(0.7+v*x) - 0.3, ABS(0.7+v*y) - 0.3, ABS(-1.1+v*z) - 0.3, -((0.7+v*x) * (0.7+v*x) + (0.7+v*y) * (0.7+v*y) + (-1.1+v*z) * (-1.1+v*z)) * 1.78 + 0.28) AS v FROM iters JOIN rays ON rays.row = iters.row AND rays.col = iters.col WHERE it < 15), lastIters AS (SELECT it0.row, it0.col, it0.v AS v0, it1.v AS v1, it2.v AS v2 FROM iters as it0 JOIN iters AS it1 ON it0.col = it1.col AND it0.row = it1.row JOIN iters AS it2 ON it0.col = it2.col AND it0.row = it2.row WHERE it0.it = 15 AND it1.it = 14 AND it2.it = 13), res AS (SELECT col, (v0 - v1) / (v1 - v2) as v FROM lastIters) SELECT group_concat( substr('$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^. ', round(1 + max(0, min(66, v * 67))), 1) || CASE WHEN col=88 THEN X'0A' ELSE '' END, '') FROM res;
рдпрд╣рд╛рдВ рдЖрдк рдХреНрдпреВрдм рдХреЛ рд╕реНрдкрд┐рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВрдЕрдиреБрд░реЛрдз рдХреЗ kat рд▓рд╛рдЗрди-рдмрд╛рдп-рд▓рд╛рдЗрди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рддрд╣рддред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдПрд╕рдХреНрдпреВрдПрд▓ рдФрд░ рд╕реНрдХреВрд▓ рдЧрдгрд┐рдд рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рдХрд╛ рдЬреНрдЮрд╛рди рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЕрд╕реНрд╡реАрдХрд░рдг: рдореИрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкреАрдПрдо рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордп рдкрд░ рдкрд╣реБрдВрдЪреВрдВрдЧрд╛редPostgres рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг (UPD: рдЭрдВрдбреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдпрд╣ рдкрд░рд┐рдорд╛рдг рдХреЗ рдПрдХ рдХреНрд░рдо рд╕реЗ рддреЗрдЬ рд╣реЛ рдЧрдпрд╛, UPD2: рдХрдИ рд╕реБрдзрд╛рд░, рдЕрдм рд░рдирдЯрд╛рдЗрдо 150ms рд╣реИ)рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
XareH рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
SET ENABLE_NESTLOOP TO OFF; WITH RECURSIVE numbers AS (SELECT n FROM generate_series(0,89) gs(n) ), pixels AS (SELECT rows.n as row, cols.n as col FROM numbers as rows CROSS JOIN numbers as cols WHERE rows.n > 4 AND rows.n < 38 AND cols.n > 9 AND cols.n < 89), rawRays AS (SELECT row, col, -0.9049::double precision + col * 0.0065 ::double precision + row * 0.0057::double precision as x, -0.1487::double precision + row * -0.0171::double precision as y, 0.6713::double precision + col * 0.0045::double precision + row * -0.0081::double precision as z FROM pixels), norms AS (SELECT row, col, x, y, z, (1 + x * x + y * y + z * z) / 2 as n FROM rawRays), rays AS (SELECT row, col, x / n AS x, y / n AS y, z / n AS z FROM norms), iters AS (SELECT row, col, 0 as it, 0.0::double precision as v FROM rays UNION ALL SELECT rays.row, rays.col, it + 1 AS it, v + GREATEST(ABS(0.7 +v*x) - 0.3 , ABS(0.7 +v*y) - 0.3 , ABS(-1.1 +v*z) - 0.3 , -(0.28 + ((0.7 +v*x) * (0.7 +v*x) + (0.7 +v*y) * (0.7 +v*y) + (-1.1 +v*z) * (-1.1 +v*z)) / 0.28 ) / 2.0 + 0.42 ) AS v FROM iters JOIN rays ON rays.row = iters.row AND rays.col = iters.col WHERE it < 15), lastIters AS (SELECT it0.row, it0.col, it0.v AS v0, it1.v AS v1, it2.v AS v2 FROM iters as it0 JOIN iters AS it1 ON it0.col = it1.col AND it0.row = it1.row JOIN iters AS it2 ON it0.col = it2.col AND it0.row = it2.row WHERE it0.it = 15 AND it1.it = 14 AND it2.it = 13), res AS (SELECT row,col, (v0 - v1) / (v1 - v2) as v FROM lastIters) SELECT string_agg(substring('$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^. '::text FROM round(1 + GREATEST(0, LEAST(66, v * 67)))::integer FOR 1) || CASE WHEN col=88 THEN E'\n' ELSE '' END, ''::text order by row,col) FROM res; SET ENABLE_NESTLOOP TO ON;
рд╢рдмреНрджрд╛рд╡рд▓реА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ
рд▓рд┐рдП, рдПрдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рд░рдг рдорд╛рд░реНрдЪрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛
рд╕реНрдЯреЗрдЬрд┐рдВрдЧ рдЯреЗрдмрд▓ рдХреА рд╕реВрдЪреА:
numbers (n)
- рдЗрд╕рдореЗрдВ 0 рд╕реЗ 89 рддрдХ рдирдВрдмрд░ рд╣реЛрддреЗ рд╣реИрдВредpixels (row, col)
- рдкреНрд░рддреНрдпреЗрдХ "рдкрд┐рдХреНрд╕реЗрд▓" рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИредrawRays (row, col, x, y, z)
- рдЗрд╕рдореЗрдВ рдХреИрдорд░реЗ рд╕реЗ рд╕реНрдХреНрд░реАрди рддрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд┐рд░рдгреЗрдВ рд╣реЛрддреА рд╣реИрдВ редnorms (row, col, x, y, z, n)
- рдЗрд╕рдореЗрдВ рдХрд┐рд░рдгреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рд╣реЛрддреА рд╣реИредrays (row, col, x, y, z)
- рдЗрд╕рдореЗрдВ рдХреИрдорд░реЗ рд╕реЗ рд╕реНрдХреНрд░реАрди рддрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рд░рдгреЗрдВ рд╣реЛрддреА рд╣реИрдВ редiters (row, col, it, v)
- рдЗрд╕рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд┐рд░рдг рдЕрдЧреНрд░рд╕рд░ рд╣реИрдВредlastIters (row, col, v0, v1, v2)
- рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реА рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдЕрдВрддрд┐рдо рддреАрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИредres (col, v)
- рдЗрд╕рдореЗрдВ рдкрд┐рдХреНрд╕рд▓реНрд╕ рдХреА "рдЪрдордХ" рд╣реЛрддреА рд╣реИред
рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрд┐ рд╡реЗ рдПрдХ-рджреВрд╕рд░реЗ рдкрд░ рдХреИрд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓реА рддрд╛рд▓рд┐рдХрд╛ рдХреЗрд╡рд▓ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдФрд░ рдЕрдВрддрд┐рдо рдХреНрд╡реЗрд░реА рдХреЗрд╡рд▓
res
рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред
рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ (
numbers
рдФрд░
iters
рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдореЗрдВ 81 x 29 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ "рдкрд┐рдХреНрд╕реЗрд▓" рдХреЗ рд▓рд┐рдП рдПрдХ),
row
рдФрд░
col
рдХреЙрд▓рдо рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВред
iters
рдЯреЗрдмрд▓ рдореЗрдВ 81 x 29 x 15 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ (рдкреНрд░рддреНрдпреЗрдХ "рдкрд┐рдХреНрд╕реЗрд▓" рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рд░рдг рдорд╛рд░реНрдЪрд┐рдВрдЧ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ)ред рдкреБрдирд░рд╛рд╡реГрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдЗрд╕ рдХреЙрд▓рдо рдореЗрдВ рд╣реИред
рдЕрдВрддрд┐рдо рдХреНрд╡реЗрд░реА рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рддреИрдпрд╛рд░ рдХрд░рддреА рд╣реИ, рдЕрдиреНрдп рд╕рднреА рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ (рдХреЙрд▓рдо
row
,
col
рдФрд░
it
рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИрдВ)ред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдо рд╕рд╣рд╛рдпрдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдХреНрд╡реЗрд░реА рд╕рдВрд░рдЪрдирд╛:
WITH RECURSIVE numbers AS (SELECT ...), pixels AS (SELECT ...), rawRays AS (SELECT ...), normsSq AS (SELECT ...), norms AS (SELECT ...), rays AS (SELECT ...), iters AS (SELECT ...), lastIters AS (SELECT ...), res AS (SELECT ...) SELECT group_concat(substr('$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^. ', round(1 + max(0, min(66, v * 67))), 1) || CASE WHEN col=88 THEN X'0A' ELSE '' END, '') FROM res;
рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╢реНрди
рдпрд╣рд╛рдБ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 0 рд╕реЗ 89 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ:
WITH RECURSIVE numbers AS ( SELECT 0 AS n UNION ALL SELECT n+1 FROM numbers WHERE n<89 ) ...
- рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рд╢реНрди рдХреЗрд╡рд▓ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рджрд┐рдП рдЧрдП рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
SELECT 0 as n
рд╡рд╣ рд░реЗрдЦрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреНрд╡реЗрд░реА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИредUNION ALL
рдЕрд░реНрде рд╣реИ рдХрд┐ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреЗрдХ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ UNION
рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗредSELECT n+1 FROM numbers WHERE n<80
ред рдпрд╣рд╛рдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдпрд╣ рд╣реИ рдХрд┐ numbers
рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдкрд┐рдЫрд▓реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрддреА рд╣реИред рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, WHERE
рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕реЗ рдЫреЛрдЯрд╛ рдХрд░ WHERE
рдФрд░ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрдЧреАред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА, рд╕рднреА рдкрд┐рдЫрд▓реЗ рддрд╛рд▓рд┐рдХрд╛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ UNION ALL
рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
рд╡рд░реНрдЧрдореВрд▓ рдирд┐рдХрд╛рд▓реЗрдВ
рд╣рдо рдЬрдбрд╝ рдХреА рдЧрдгрдирд╛ рдХреЗ
рдмрдЧреБрд▓рд╛ рд╡рд┐рдзрд┐ (рдмреЗрдмреАрд▓реЛрдирд┐рдпрди рд╡рд┐рдзрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдЧрдгрдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
sqrtS ред рд╣рдо рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ
x0,x1, ldots рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░:
x_ {n + 1} = \ frac {x_n + \ frac {S} {x_n}}} {2}
x_ {n + 1} = \ frac {x_n + \ frac {S} {x_n}}} {2}
рд╡рд┐рдзрд┐ рдХрд╛ рддрд░реНрдХ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
sqrtS рдХреЗ рдмреАрдЪ рд╣рдореЗрд╢рд╛ рдЭреВрда
x рдФрд░
fracSx рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП
x ред рдЗрд╕рд▓рд┐рдП, рдЗрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреЗ рдЦрдВрдб рдХреЗ рдордзреНрдп рдХреЛ рдПрдХ рдЕрдиреБрдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдирд╛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИред
рдЬреНрдпрд╛рдорд┐рддреАрдп рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдкреНрд░рддреНрдпреЗрдХ рдЕрдЧрд▓рд╛ рдорд╛рди рд░реВрдЯ рдХреЛ рдХрд░реАрдм рдФрд░ рдХрд░реАрдм рд▓рд╛рддрд╛ рд╣реИ, рдПрдХ рдЪрд░рдг рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХрдо рд╕реЗ рдХрдо рджреЛ рдмрд╛рд░ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп
x0 рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред 1. рдХреНрд╡реЗрдХ рдЧреЗрдо рдореЗрдВ,
рдЬрд╛рджреВ рдирд┐рд░рдВрддрд░ 0x5f3759df рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛
рдЧрдпрд╛ рдерд╛ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд▓реНрдЯреЗ рд╡рд░реНрдЧрдореВрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рднреА, рдПрдХ рд╕рдорд╛рди рд╡рд┐рдзрд┐ рдХреЛ рдирд┐рдпрдорд┐рдд рд░реВрдЯ рдХреЗ рд▓рд┐рдП
рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ), рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, SQL рдореЗрдВ рд╡рд╣рд╛рдВ рдлреНрд▓реЛрдЯрд┐рдВрдЧ рдкреЙрдЗрдВрдЯ рдирдВрдмрд░реЛрдВ рдХреЗ рдмрд╛рдЗрдирд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рддрдХ рдкрд╣реБрдВрдЪред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдЬрдбрд╝ рдХреЛ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдЬрдм рдХреИрдорд░реЗ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рд╡реИрдХреНрдЯрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ: рдХрд┐рд░рдг рдорд╛рд░реНрдЪрд┐рдВрдЧ рдЕрддреНрдпрдзрд┐рдХ рджреВрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдердЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд▓рдВрдмрд╛рдИ 1 рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
- рдЬрдм рдПрдХ рд╡рд░реНрдЧ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рдХреЗ рд▓рд┐рдП рджреВрд░реА рдХреА рдЧрдгрдирд╛ред
рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдорд╛рди рдПрдХ рд╕рдВрдХреАрд░реНрдг рд╕реАрдорд╛ рдореЗрдВ рд╣реИрдВ
[0.7,1.5] рдФрд░ 1 рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдиреНрдирд┐рдХрдЯрди рдПрдХрджрдо рд╕рд╣реА рд╣реИред рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХреЙрд▓ рдкрд░ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдирд╛, рдореБрдЭреЗ рдФрд╕рдд рдореВрд▓реНрдп рдорд┐рд▓рд╛
0.28 рдЬрд┐рд╕реЗ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рд╣реА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде
, рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ ! рдЕрд░реНрдерд╛рддреН, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдбрд╝ рдПрдХ рд░реИрдЦрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ:
sqrt1(x)= frac1+x2
sqrt2(x)= frac0.28+ fracx0.282=0.14+1.78x
рдХреИрдорд░реЗ рд╕реЗ рдХрд┐рд░рдгреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ
рдкрд╣рд▓реЗ рдЪрд╛рд░ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдп рдкреНрд░рддреНрдпреЗрдХ "рдкрд┐рдХреНрд╕реЗрд▓" рдХреЛ рдХреИрдорд░реЗ рдХреЗ рдмрд╛рд╣рд░ рдЖрдиреЗ рд╡рд╛рд▓реА рд▓рдВрдмрд╛рдИ 1 рдХреА рддреНрд░рд┐-рдЖрдпрд╛рдореА рд╡реЗрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдФрд░
рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рдмрд┐рдВрджреБ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реИред
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╕реНрддрдВрдн рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, 0 рд╕реЗ 89 рддрдХ рдХреЗ рд╕реЗрдЯ рдХреЗ рдХрд╛рд░реНрдЯреЗрд╢рд┐рдпрди рдЙрддреНрдкрд╛рдж рдХреЛ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реЗ рдЦрд╛рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдХреЙрд▓рдореЛрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
... pixels AS ( SELECT rows.n as row, cols.n as col FROM numbers as rows CROSS JOIN numbers as cols WHERE rows.n >= 5 AND rows.n < 38 AND cols.n >= 10 AND cols.n < 89 ), ...
рдЕрдЧрд▓рд╛ рд╣рдо рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд╡реИрдХреНрдЯрд░ рдкрд╛рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрдирдХреЗ рдкрд╛рд╕ рддреНрд░рд┐рдХреЛрдгрдорд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд▓рдВрдмрд╛ рд╕реВрддреНрд░ рд╣реЛрддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдз рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреИрдорд░рд╛ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреА:
... rawRays AS ( SELECT row, col, -0.9049 + col * 0.0065 + row * 0.0057 as x, -0.1487 + row * -0.0171 as y, 0.6713 + col * 0.0045 + row * -0.0081 as z FROM pixels ), ...
рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдореЗрдВ рд╕реВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЗрди рд╡реИрдХреНрдЯрд░реЛрдВ рдХреА рд▓рдВрдмрд╛рдИ (рд▓рдЧрднрдЧ) рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
sqrt1 :
... norms AS ( SELECT row, col, x, y, z, (1 + x * x + y * y + z * z) / 2.0 AS n FROM rawRays ), ...
рдпрд╣ рд▓рдВрдмрд╛рдИ рдХреЗ рд╡реИрдХреНрдЯрд░ 1 рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд▓рдВрдмрд╛рдИ рд╕реЗ рд╡реИрдХреНрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ:
... rays AS (SELECT row, col, x / n AS x, y / n AS y, z / n AS z FROM norms), ...
Iterations рдХрд┐рд░рдг рдорд╛рд░реНрдЪрд┐рдВрдЧ
рдпрд╣
JOIN
рдпреБрдХреНрдд рдереЛрдбрд╝реЗ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреНрд╡реЗрд░реА рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдХрд┐рд░рдг рдорд╛рд░реНрдЪрд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ 15 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рд░ рдмрд╛рд░
numbers
рддрд╛рд▓рд┐рдХрд╛ рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрддреА рд╣реИ, рдЬреЛ рддрдм рд╕рдВрдпреБрдХреНрдд рд╣реЛрддреА рдереА, рддреЛ рдордзреНрдпрд╡рд░реНрддреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 81 x 29 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ рдФрд░ 15 рдмрд╛рд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рд╕рднреА рддреАрди рдЖрдпрд╛рдореА рдЬреНрдпрд╛рдорд┐рддрд┐ рд╕реВрддреНрд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ
SDF startpmatrixxyz endpmatrix= max /(|xтИТ0.3;|y|тИТ0.3,|z|тИТ0.3,тИТ left(sqrt2тИТx)2+y2+z2)тИТ0.42 right) right)
- рд╕рдорд╛рд░реЛрд╣ \ _\ _ рдЪреМрд░рд╛рд╣реЗ рдХрд╛ рдорддрд▓рдм рд╣реИ
- |x|тИТ0.3,|y|тИТ0.3,|z|тИТ0.3 рдЖрдзреЗ-рд╡рд┐рдорд╛рдиреЛрдВ рдХреЗ рддреАрди рдЬреЛрдбрд╝реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬреЛ рдПрдХ рддрд░рдл рд╕реЗ рдШрди рдмрдирд╛рддреЗ рд╣реИрдВ 0.3 cdot2
- тИТ рдмрд╛рдПрдБ(sqrt2(x2+y2+z2)тИТ0.42 рджрд╛рдПрдБ) - рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдЧреЛрд▓реЗ рдХрд╛ рдмрд╛рд╣рд░реА рднрд╛рдЧ 0.42 ред рд╡рд░реНрдЧрдореВрд▓ рдХреА рдЕрдиреБрдорд╛рдирд┐рддрддрд╛ рдХреА рдЕрд╢реБрджреНрдзрд┐ рдХреА рдкреВрд░реНрддрд┐ рдХреЗ рд▓рд┐рдП рддреНрд░рд┐рдЬреНрдпрд╛ рджреГрд╢реНрдпрдорд╛рди рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
0=v0,v1,v2 ldots,v15 рд╕реВрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП:
vn+1=vn+SDF left( startpmatrixcamXCAMYcamZ endpmatrix+vn startpmatrixxz endpmatrix n)
рдЬрд╣рд╛рдБ
x,y,z - рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡реЗрдХреНрдЯрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХред рдЪреВрдВрдХрд┐ рдХреИрдорд░рд╛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрдИ рдмрд╛рд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рджрд╢рдорд▓рд╡ рд╕реНрдерд╛рди рдкрд░ рдЧреЛрд▓ рдХрд┐рдпрд╛ред
... iters AS ( SELECT row, col, 0 as it, 0 as v FROM rays UNION ALL SELECT rays.row, rays.col, it + 1 AS it, v + MAX( ABS(0.7+v*x) - 0.3, ABS(0.7+v*y) - 0.3, ABS(-1.1+v*z) - 0.3, -( (0.7+v*x) * (0.7+v*x) + (0.7+v*y) * (0.7+v*y) + (-1.1+v*z) * (-1.1+v*z) ) * 1.78 + 0.28 ) AS v FROM iters JOIN rays ON rays.row = iters.row AND rays.col = iters.col WHERE it < 15 ), ...
"рдкрд┐рдХреНрд╕реЗрд▓" рдХреА рддреАрд╡реНрд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
рдпрд╣рд╛рдВ рд╣рдо рдПрдХреНрд╕реЗрд▓ рдХреЗ рд╕рдорд╛рди рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдлреЛрдВрдЧ рд╢реЗрдбрд┐рдВрдЧ рд╕реЗ рдлреИрд▓рд╛рдирд╛ рдШрдЯрдХ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИ:
рддреАрд╡реНрд░рддрд╛= рдореИрдХреНрд╕ рд▓реЗрдлреНрдЯ(0, рдорд┐рди рд▓реЗрдлреНрдЯ(1, рдлреНрд░рд╛рдХv15тИТv14v14тИТv13 right) right)
рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдХрд┐рд░рдг рдорд╛рд░реНрдЪрд┐рдВрдЧ рдХреЗ рдЕрдВрддрд┐рдо рддреАрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреА:
... lastIters AS ( SELECT it0.row, it0.col, it0.v AS v0, it1.v AS v1, it2.v AS v2 FROM iters as it0 JOIN iters AS it1 ON it0.col = it1.col AND it0.row = it1.row JOIN iters AS it2 ON it0.col = it2.col AND it0.row = it2.row WHERE it0.it = 15 AND it1.it = 14 AND it2.it = 13 ), ...
рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реВрддреНрд░ рд╣реА (рд╕рдВрдЪрд╛рд▓рди)
\ _\ _ рдФрд░
min рдЕрдВрддрд┐рдо рдЕрдиреБрд░реЛрдз рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛):
... res AS (SELECT row, col, (v0 - v1) / (v1 - v2) as v FROM lastIters) ...
рдЕрд╕реНрд╕реА рдХрд▓рд╛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ
... SELECT group_concat( substr( '$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^. ', round(1 + max(0, min(66, v * 67))), 1 ) || CASE WHEN col=88 THEN X'0A' ELSE '' END, '') FROM res;
рдЕрдВрддрд┐рдо рдХреНрд╡реЗрд░реА рдХрд╛ рдХрд╛рд░реНрдп рдкрд┐рдХреНрд╕реЗрд▓ рддреАрд╡реНрд░рддрд╛ рд╡рд╛рд▓реА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдПрдХ рдПрд╕рд╕реАрдЖрдИ-рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реИред рдЗрдирдкреБрдЯ рдкрд░, рдпрд╣ рдХреЗрд╡рд▓
res
рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ
col
рдФрд░
v
рдХреЙрд▓рдо рд╣реЛрддреЗ рд╣реИрдВред
group_concat(s, delim)
рдПрдХ рдПрдХрддреНрд░реАрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕рднреА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП delim
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реАрдорд╛рдВрдХрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрднрд┐рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИредCASE WHEN cond1 THEN val1 WHEN cond2 THEN val2 ... ELSE valN END
- рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдг, рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдПрдирд╛рд▓реЙрдЧредX'0A'
рд▓рд╛рдЗрди X'0A'
рдХреИрд░реЗрдХреНрдЯрд░ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрди рдХреЗ рдкрд╣рд▓реЗ рдХреИрд░реЗрдХреНрдЯрд░ рд╕реЗ рдкрд╣рд▓реЗ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред||
- рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рдВрдШрдирди рдСрдкрд░реЗрдЯрд░редsubstr(s, start, count)
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ s
рд╡рд░реНрдгреЛрдВ рдХреА count
рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрдЦреНрдпрд╛ start
рд╕рд╛рде рдЪрд░рд┐рддреНрд░ рдХреЗ рд╕рд╛рде start
ред рдЪрд░рд┐рддреНрд░ рдЕрдиреБрдХреНрд░рдордг рдПрдХ рд╕реЗ рдЖрддрд╛ рд╣реИред'$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/|()1{}[]?-_+~<>i!lI;:,"^. '
рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ" рдмреНрд▓реИрдХ "( $
) рд╕реЗ" рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ "рд╣реИред рдПрд╕рд╕реА-рдкрд╛рддреНрд░реЛрдВ рдореЗрдВ "рд╡реНрд╣рд╛рдЗрдЯ" (рд╕реНрдкреЗрд╕)ред рд╕рд╛рдЗрдЯ http://paulbourke.net/dataformats/asciiart/ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛редround(1 + max(0, min(66, v * 67)))
- рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ [0,1] рд╕реАрдорд╛ рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ [1,67] рдЗрд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЪрд░рд┐рддреНрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдПред