
рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЙрдиреЛрдЧреНрд░рд╛рдо рд╕реЙрд▓реНрд╡рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЗрд╕реЗ рд░рд╕реНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ, рддрд╛рдХрд┐ рдЗрд╕реЗ рд╕реАрдзреЗ WebAssembly рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЯреАрдПрд▓, рдбреЙ
рд╢реБрд░реБрдЖрдд
Habr├й рдкрд░ рдЬрд╛рдкрд╛рдиреА рд╡рд░реНрдЧ рдкрд╣реЗрд▓реА (рдиреЙрдиреЛрдЧреНрд░рд╛рдореНрд╕) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрдИ рдкреЛрд╕реНрдЯ рдереЗред рдЙрджрд╛рд╣рд░рдг
рдФрд░ рдПрдХ рдФрд░ ред
рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд┐рдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╕реНрддрдВрднреЛрдВ рдХреЗ рдКрдкрд░ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд▓реЗ рдХреЗ рдХрд┐рддрдиреЗ рд╕рдореВрд╣ (рдпрд╛ рдЙрдирдХреЗ рд░рдВрдЧ, рд░рдВрдЧ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП) рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╕рдВрдЧрдд рдкрдВрдХреНрддрд┐ рдпрд╛ рд╕реНрддрдВрдн рдореЗрдВ рд╣реИрдВ, рдФрд░ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╕реНрд╡рдпрдВ - рдЗрди рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рддрдиреЗ рдорд░реНрдЬ рдХрд┐рдП рдЧрдП рд╕реЗрд▓ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреАрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ - 4, 1, рдФрд░ 3 рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддреАрди рд╕рдореВрд╣ рд╣реИрдВ: рдкрд╣рд▓рд╛ - рдЪрд╛рд░ рд╕реЗ, рджреВрд╕рд░рд╛ - рдПрдХ рд╕реЗ, рддреАрд╕рд░рд╛ - рддреАрди рдХрд╛рд▓реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ)ред рдПрдХ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдХреНрд░реЙрд╕рд╡рд░реНрдб рдкрд╣реЗрд▓реА рдореЗрдВ, рд╕рдореВрд╣реЛрдВ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЦрд╛рд▓реА рд╕реЗрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд░рдВрдЧ рдХреНрд░реЙрд╕рд╡рд░реНрдб рдореЗрдВ, рдпрд╣ рдирд┐рдпрдо рдХреЗрд╡рд▓ рдПрдХ-рд░рдВрдЧ рд╕рдореВрд╣реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдмрд╣реБ-рд░рдВрдЧреАрди рд╕рдореВрд╣ рдмрд╛рд░реАрдХреА рд╕реЗ рдлреИрд▓рд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рд░рд┐рдХреНрдд рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рднреА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ)ред рд╕реЗрд▓ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рд╕рдмрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ "рд╕рд╣реА" рдХреНрд░реЙрд╕рд╡рд░реНрдб рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ "рддрд╛рд░реНрдХрд┐рдХ" рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ / рдпрд╛ рд╕реНрддрдВрднреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рд╕рдорд╛рдзрд╛рди рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдпрд╛ рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рдирд┐рд░реНрдгрдпреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рднрд░ рдирд╣реАрдВ рдЬрд╛рддреА рд╣реИрдВ (рдиреАрдЪреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рдХреЗ рдиреЙрдиреЛрдЧреНрд░рд╛рдо http://bonograms.org/ ( http://nonograms.ru/ ) рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рд╛рдЗрдЯ рдХреЗ рдиреЙрдиреЛрдЧреНрд░рд╛рдореНрд╕ рдкрд╣рд▓реЗ рд╣реА рд▓рд╛рдЗрдЯ рдХреЗ рд╕реНрдкреАрдб рдореЗрдВ рдЬрд╛рдкрд╛рдиреА рд░рдВрдЧреАрди рдХреНрд░реЙрд╕рд╡рд░реНрдб рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЙрджреНрдзреГрдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рддреБрд▓рдирд╛ рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд╕реЙрд▓реНрд╡рд░ рдиреЗ рдЗрд╕ рд╕рд╛рдЗрдЯ рд╕реЗ рдХреНрд░реЙрд╕рд╡рд░реНрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рднреА рдЬреЛрдбрд╝рд╛ (рдЗрд╕рдХреА рд╕рд╛рдЗрдЯ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП KyberPrizrak рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдиреЙрдиреЛрдЧреНрд░рд╛рдо рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛ рддрдХ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рд╕рд╛рдорд╛рдиреНрдп "рддрд╛рд░реНрдХрд┐рдХ" рд╡рд┐рдзрд┐ рдПрдХ рдореГрдд рдЕрдВрдд рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рдХреЛ рд╕реЗрд▓ рдХреЗ рд░рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреА рдФрд░ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдпрд╣ рд░рдВрдЧ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд╡рд┐рдкрд░реАрдд рд░рдВрдЧ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЪрд░рдгреЛрдВ рдХрд╛ рдХреНрд░рдо (рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдзреИрд░реНрдп рд╣реИ) рд╣рдореЗрдВ рд╕рднреА рд╕рдорд╛рдзрд╛рди рджреЗ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреНрд░реЙрд╕рд╡рд░реНрдб рдХреЗ рдРрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред
рдЕрдЬрдЧрд░
рд▓рдЧрднрдЧ рдбреЗрдврд╝ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореИрдВ рдЧрд▓рддреА рд╕реЗ рдПрдХ рд▓реЗрдЦ рдкрд░ рдЕрдбрд╝ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛, рд╡рд┐рдзрд┐ рдзреАрдореА рдереА)ред
рдЬрдм рдореИрдВрдиреЗ рдкрд╛рдпрдерди (рдореЗрд░реА рдореБрдЦреНрдп рдХрд╛рдордХрд╛рдЬреА рднрд╛рд╖рд╛) рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдФрд░ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рдХреНрд░рдорд┐рдХ рдЕрджреНрдпрддрди рдЬреЛрдбрд╝рд╛, рддреЛ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдмрд╣реБрдд рдЬрд▓реНрджреА рд╣рд▓ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рдерд╛ред рдореИрдЯрд░рд┐рдпрд▓ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░реНрдп рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рдореБрдЭреЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реБрдЖ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рд╕реЙрд▓реНрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рд╛рдХрд╛рдВрдХреНрд╖реА рдХрд╛рд░реНрдп рдЬрд╛рди рд╡реЛрд▓реНрдЯрд░ рдиреЗ рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдерд╛ (рдЬреЛ рдХрд┐, рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЧреИрд░-рд╕рд░рдХрд╛рд░реА рдмреИрдВрдХреЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдВрдбрд╛рд░ рдмрдирд╛ рд╣реБрдЖ рд╣реИ), рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдЕрдзреНрдпрдпрди рдЬрд┐рд╕рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд▓рд┐рдВрдХ рдХрд╛ рдЦрдЬрд╛рдирд╛ рд╣реИ рдЬреЛ рдЙрдирдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕реЙрд▓реНрд╡рд░ рдмрдирд╛рдирд╛ред
рдХрдИ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди (рд╡реЗ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрдВрдЧреЗ), рдореИрдВрдиреЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдкрдиреЗ рд╕реЙрд▓реНрд╡рд░ рдХреА рдЧрддрд┐ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ред рдирддреАрдЬрддрди, рдореБрдЭреЗ рд▓рдд рд▓рдЧ рдЧрдИ рдереА рдФрд░ рдореИрдВ рдХрд╛рдо рд╕реЗ рдЦрд╛рд▓реА рд╕рдордп рдореЗрдВ рд▓рдЧрднрдЧ 10 рдорд╣реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рд░рд┐рдлреИрдХреНрдЯрд┐рдВрдЧ, рдбреАрдмрдЧрд┐рдВрдЧ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рдерд╛ред
рдХреЛрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо
рдкрд░рд┐рдгрд╛рдореА рд╕реЙрд▓реНрд╡рд░ рдХреЛ рдЪрд╛рд░ рдирд┐рд░реНрдгрдп рд╕реНрддрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
( рд▓рд╛рдЗрди ) рд▓реАрдирд┐рдпрд░ рд╕реЙрд▓реНрд╡рд░: рдЗрдирдкреБрдЯ рдкрд░, рд╕реЗрд▓реНрд╕ рдХреА рдПрдХ рд▓рд╛рдЗрди рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд▓рд╛рдЗрди рдкрд░ рдПрдХ рд╡рд┐рд╡рд░рдг рд▓рд╛рдЗрди (рд╕реБрд░рд╛рдЧ), рдПрдХ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХреА рдЧрдИ рд▓рд╛рдЗрдиред рдЕрдЬрдЧрд░ рд╕рдорд╛рдзрд╛рди рдореЗрдВ, рдореИрдВрдиреЗ 4 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд▓рд╛рдЧреВ рдХрд┐рдП (рдЙрдирдореЗрдВ рд╕реЗ 3 рдХреЛ рд░рдВрдЧреАрди рдХреНрд░реЙрд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдореВрд▓ рд╕реНрд░реЛрдд рдХреЗ рдирд╛рдо рдкрд░ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рдмрдЧреНрд╕реЛрд▓рд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдирд┐рдХрд▓рд╛ред рдбрд╛рдпрдиреЗрдорд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдиреЙрдиреЛрдЧреНрд░рд╛рдо рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдФрд░ рд╡рд╕реНрддреБрддрдГ рдорд╛рдирдХ рд╡рд┐рдзрд┐ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЫрджреНрдо рдХреЛрдб рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ ред
( рдкреНрд░рд╕рд╛рд░ ) рд╣рдо рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рд╕реНрддрдВрднреЛрдВ рдХреЛ рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдПрдХ рд░реИрдЦрд┐рдХ рд╕реЙрд▓реНрд╡рд░ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрдм рд╣рдо рдПрдХ рдкрдВрдХреНрддрд┐ (рд╕реНрддрдВрдн) рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдирдИ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреНрд░рдорд╢рдГ, рдирдП рдХреЙрд▓рдо (рдкрдВрдХреНрддрд┐рдпреЛрдВ) рдХреЗ рд╕рд╛рде рдХрддрд╛рд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рд▓рд╛рдЗрди рдЦрд╛рд▓реА рд░рд╣рдиреЗ рддрдХ рдЬрд╛рд░реА рд░рдЦреЗрдВред
рдЙрджрд╛рд╣рд░рдг рдФрд░ рдХреЛрдбрд╣рдо рдХрддрд╛рд░ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдХрд╛рдо рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕реЗ 7 рдХреА рдПрдХ рдЦрд╛рд▓реА (рдЕрдирд╕реБрд▓рдЭреА) рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдиреЗ рджреЗрдВ (рд╣рдо рдЗрд╕реЗ ???????
рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ) рдмреНрд▓реЙрдХ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде [2, 3]
ред рд░реИрдЦрд┐рдХ рд╕реЙрд▓реНрд╡рд░ рдПрдХ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛ ?X??XX?
рдЬрд╣рд╛рдБ X
рднрд░рд╛ рд╣реБрдЖ рд╕реЗрд▓ рд╣реИред рдкрдВрдХреНрддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддреЗ рд╕рдордп, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ 1, 4, 5 рд╡рд╛рд▓реЗ рдХреЙрд▓рдо рдмрджрд▓ рдЧрдП рд╣реИрдВ (рдЕрдиреБрдХреНрд░рдордг 0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╕рдВрдХреЗрддрд┐рдд рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рджрд┐рдЦрд╛рдИ рджреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ "рд░реИрдЦрд┐рдХ" рд╕реЙрд▓реНрд╡рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдЗрди рд╕реНрддрдВрднреЛрдВ рдХреЛ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ (рддрд╛рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд░реИрдЦрд┐рдХ рд╕реЙрд▓реНрд╡рд░ рдХреЛ рджреЗ рд╕рдХреЗрдВ)ред
def propagation(board): line_jobs = PriorityDict() for row_index in range(board.height): new_job = (False, row_index) line_jobs[new_job] = 0 for column_index in range(board.width): new_job = (True, column_index) line_jobs[new_job] = 0 for (is_column, index), priority in line_jobs.sorted_iter(): new_jobs = solve_and_update(board, index, is_column) for new_job in new_jobs:
( рдкреНрд░реЛрдмрд┐рдВрдЧ ) рдкреНрд░рддреНрдпреЗрдХ рдЕрдирд╕реБрд▓рдЭреЗ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рд░рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдирдИ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдкреНрд░рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдореЗрдВ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рд░рдВрдЧ рдХреЛ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рд░рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рдЪрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдЕрдВрдд рддрдХ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдорд╛рдзрд╛рди рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рд░рдВрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВ (рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрджрд┐ рд╣рдо рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдЧреЗ рд╣рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рддреЛ рд╣рдо рдмрд╕ рдПрдХ рдЕрд▓рдЧ рд░рдВрдЧ / рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред
рдХреЛрдбрдпрджрд┐ рдирдореВрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╕рд╣реА рд╣реИред
def probe(self, cell_state): board = self.board pos, assumption = cell_state.position, cell_state.color
( рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ ) рдпрджрд┐ рдкреНрд░реЛрдмрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЖрдк рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХреА рдЧрдИ рдкрд╣реЗрд▓реА рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд░реНрдгрдп рдкреЗрдбрд╝ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ)ред рдпрд╣рд╛рдВ, рдПрдХ рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдиреА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рдЕрдЧрд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреМрди рд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдЪреНрдЫрд╛ рд╢реЛрдз рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд╣реИ ред
рдХреЛрдбBacktracking рдореЗрд░реЗ рд╕рд╛рде рдмрд╣реБрдд рдЧрдбрд╝рдмрдбрд╝ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рд▓рдЧрднрдЧ рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдЦреЛрдЬ рдХреЗ рджреМрд░рд╛рди рд╣реЛрддрд╛ рд╣реИ
def search(self, search_directions, path=()): """ Return False if the given path is a dead end (no solutions can be found) """ board = self.board depth = len(path) save = board.make_snapshot() try: while search_directions: state = search_directions.popleft() assumption, pos = state.color, state.position cell_colors = board.cell_colors(pos) if assumption not in cell_colors: LOG.warning("The assumption '%s' is already expired. " "Possible colors for %s are %s", assumption, pos, cell_colors) continue if len(cell_colors) == 1: LOG.warning('Only one color for cell %r left: %s. Solve it unconditionally', pos, assumption) try: self._solve_without_search() except NonogramError: LOG.warning( "The last possible color '%s' for the cell '%s' " "lead to the contradiction. " "The path %s is invalid", assumption, pos, path) return False if board.is_solved_full: self._add_solution() LOG.warning( "The only color '%s' for the cell '%s' lead to full solution. " "No need to traverse the path %s anymore", assumption, pos, path) return True continue rate = board.solution_rate guess_save = board.make_snapshot() try: LOG.warning('Trying state: %s (depth=%d, rate=%.4f, previous=%s)', state, depth, rate, path) success = self._try_state(state, path) finally: board.restore(guess_save) if not success: try: LOG.warning( "Unset the color %s for cell '%s'. Solve it unconditionally", assumption, pos) board.unset_color(state) self._solve_without_search() except ValueError: LOG.warning( "The last possible color '%s' for the cell '%s' " "lead to the contradiction. " "The whole branch (depth=%d) is invalid. ", assumption, pos, depth) return False if board.is_solved_full: self._add_solution() LOG.warning( "The negation of color '%s' for the cell '%s' lead to full solution. " "No need to traverse the path %s anymore", assumption, pos, path) return True finally:
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдХреНрд░реЙрд╕рд╡рд░реНрдб рдкрд╣реЗрд▓реА рдХреЛ рджреВрд╕рд░реЗ рд╕реНрддрд░ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдкрд╣рд▓рд╛ рдХреЗрд╡рд▓ рдкрддрд┐рдд рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬрдм рдкреВрд░реЗ рдХреНрд░реЙрд╕рд╡рд░реНрдб рдкрд╣реЗрд▓реА рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдпрд╛ рд╕реНрддрдВрдн рд╣реЛрддрд╛ рд╣реИ) рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реНрддрд░реЛрдВ рдХреЛ рдКрдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХрдИ рдмрд╛рд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрддрд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдкрд░ рддреЗрдЬреА рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдЬрдЯрд┐рд▓ рдкрд╣реЗрд▓реА рдХреЗ рд▓рд┐рдП рд▓рд╛рдЦреЛрдВ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ (рдмрд▓реНрдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ) рдХрд┐ рдЕрдЬрдЧрд░ рдкреВрд░реЗ рдЙрдкрдХрд░рдг рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реАрдкреАрдпреВ-рдЧрд╣рди рдХрд╛рд░реНрдп рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ: рдЗрд╕рдореЗрдВ рд╕рднреА рдЧрдгрдирд╛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рдж рдЕрдХреНрд╖рдо рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдк рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдмрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рд░реВрдк рд╕реЗ рдмрдВрдж рдмреАрдЬреАрдпреВ рд╕реЙрд▓реНрд╡рд░ (рдЬрд╛рд╡рд╛ рдореЗрдВ), рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ 7-17 (рдХрднреА-рдХрднреА 27 рддрдХ) рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдирд┐рдХрд▓рд╛ред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА pynogram_my BGU_my рд╕реНрдкреАрдбрдЕрдк
рдирд░реНрддрдХреА 0.976 0.141 6.921986
рдмрд┐рд▓реНрд▓реА 1.064 0.110 9.672727
рд╕реНрдХрд┐рдб 1.084 0.101 10.732673
рд░реБрдкрдпреЗ 1.116 0.118 9.457627
рдмрдврд╝рдд 1.208 0.094 12.851064
рдзреБрдЖрдВ 1.464 0.120 12.200000
рдиреЙрдЯ 1.332 0.140 9.514286
рдЭреВрд▓рд╛ 1.784 0.138 12.927536
рдордо 2.108 0.147 14.340136
DiCap 2.076 0.176 11.795455
рджреБрдЦрдж 2.368 0.265 8.935849
рдорд░реНрдХрд╛ 2.084 0.196 10.632653
рдкреЗрдЯреНрд░реЛ 2.948 0.219 13.461187
рдПрдо рдПрдВрдб рдПрдо 3.588 0.375 9.568000
4.068 0.242 16.809917 рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП
рд▓рд╛рдЗрдЯ 3.848 0.488 7.885246
рдлреЙрд░рдПрд╡рд░ 111.000 13.570 8.179808
рдХреЗрдВрджреНрд░ 5.700 0.327 17.431193
рд╣реЙрдЯ 3.150 0.278 11.330935
рдХрд░рд╛рдЯреЗ 2.500 0.219 11.415525
9-рдбреЛрдо 510.000 70.416 7.242672
рдЭрдВрдбрд╛ 149.000 5.628 26.474769
рд╕рд┐рдВрд╣ 71.000 2.895 24.525043
рдорд╛рд░реНрд▓реЗ 12.108 4.405 2.748695
рдмрд╛рдд 321.000 46.166 6.953169
рдкреНрд░рдХреГрддрд┐ inf 433.138 inf
Sierp inf inf NaN
Gettys inf NaN
рдорд╛рдк рдореЗрд░реА рдХрд╛рд░ рдкрд░ рдХрд┐рдП рдЧрдП рдереЗ, рдкрд╣реЗрд▓рд┐рдпрд╛рдБ рдорд╛рдирдХ рд╕реЗрдЯ рд╕реЗ рд▓реА рдЧрдИ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЬрди рд╡реЛрд▓реНрдЯрд░ рдиреЗ рдЙрдирдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛
рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореИрдВрдиреЗ PyPy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рдорд╛рдирдХ CPython рдкрд░ рдЧрдгрдирд╛ рдХрд╛ рд╕рдордп PyPy рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 4-5 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рдерд╛! рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╕рдорд╛рди рдЬрд╛рд╡рд╛ рд╕реЙрд▓реНрд╡рд░ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╕реАрдкреАрдереЙрди рдХреЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 28-85 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рдирд┐рдХрд▓рд╛ред
рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ (cProfile, SnakeViz, line_profiler) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░реЗ рд╕реЙрд▓реНрд╡рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рддреЗрдЬреА рдЖрдИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджрд┐рдпрд╛ред
+ рд╕реЙрд▓реНрд╡рд░ рд╕рд╛рдЗрдЯреЛрдВ https://webpbn.com , http://nonograms.org рдФрд░ рдЗрд╕рдХреЗ рдЕрдкрдиреЗ (ini- рдЖрдзрд╛рд░рд┐рдд) рдкреНрд░рд╛рд░реВрдк рд╕реЗ рд╕рднреА рдкрд╣реЗрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
+ рдХрд┐рд╕реА рднреА рд░рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдФрд░ рдЧреИрд░-рд░рдВрдЧреАрди рд░рдВрдЧреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ (рд░рдВрдЧреЛрдВ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 10 рд╣реИ)
+ рд▓рд╛рдкрддрд╛ рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ (рдзрдмреНрдмрд╛) рдХреЗ рд╕рд╛рде рдкрд╣реЗрд▓рд┐рдпрд╛рдБ рд╣рд▓ рдХрд░рддреА рд╣реИред рдРрд╕реА рдкрд╣реЗрд▓реА рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ред
+ рдкрд╣реЗрд▓реА рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рд╢рд╛рдк / рдЦрд┐рдбрд╝рдХреА рдкрд░ рд╕рд╛рдВрддреНрд╡рдирд╛ / рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЕрддрд┐рд░рд┐рдХреНрдд pynogram-web рд╡рд┐рдХрд▓реНрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп)ред рд╕рднреА рдореЛрдб рдХреЗ рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдзреАрдореА рдЧрдгрдирд╛ (рд╕реЙрд▓реНрд╡рд░ рдХреА рд▓реЗрдЦ-рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рддрд╛рд▓рд┐рдХрд╛ рджреЗрдЦреЗрдВ)ред
- рдЕрдХреНрд╖рдо рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ: рдХреБрдЫ рдкрд╣реЗрд▓рд┐рдпреЛрдВ рдХреЛ рдШрдВрдЯреЛрдВ рддрдХ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рдирд┐рд░реНрдгрдп рдкреЗрдбрд╝ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ)ред
рд░рддреБрдЖ
рд╡рд░реНрд╖ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рд░рд╕реНрдЯ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдж рдмреБрдХ рдХреЗ рд╕рд╛рде, WASM рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реАрдЦрд╛, рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдЧреБрдЬрд░рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рдЪрд╛рд╣рддрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдЖрдк рднрд╛рд╖рд╛ рдХреА рддрд╛рдХрдд (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рд╕реБрдкрд░-рдкреНрд░рджрд░реНрд╢рди) рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХрд┐рд╕реА рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд┐рд╖реНрдХреГрдд рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдиреЙрдиреЛрдЧреНрд░рд╛рдореНрд╕ рдореЗрдВ рд▓реМрдЯ рдЖрдпрд╛ред рд▓реЗрдХрд┐рди рдЕрдм рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд╛рдпрдерди рдореЗрдВ рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдерд╛, рдЗрд╕реЗ "рдмрд╕" рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЕрдЪреНрдЫреА рдЦрдмрд░ рдореБрдЭреЗ рд╢реБрд░реВ рд╕реЗ рд╣реА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣реА рдереА: рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд░рд╕реНрдЯ рдЕрдкрдиреЗ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рд╛рде, рдореЗрд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреБрдирд┐рдпрд╛рджреА рдкрддреНрд░рд╛рдЪрд╛рд░ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╛рдЗрдирд░реАрдХреНрд▓рд░ + рдмрд╛рдЗрдирд░реАрдмреНрд▓реЙрдХ / рдорд▓реНрдЯреАрдХреЛрд▓рд░ + рдХрд▓рд░реНрдбрдмреНрд▓реЙрдХ рдЖрдкрдХреЛ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлрд╝реЗрдж рдФрд░ рд░рдВрдЧ рдиреЙрдиреЛрдЧреНрд░рд╛рдо рдХреЛ рд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ рд╣рдо рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдЗрдирд░реА рд╡рд┐рд╡рд░рдг рдмреНрд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рдВрдЧреАрди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЯрд╛рдЗрдк рдмреЗрдореЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред
рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ pub trait Color { fn blank() -> Self; fn is_solved(&self) -> bool; fn solution_rate(&self) -> f64; fn is_updated_with(&self, new: &Self) -> Result<bool, String>; fn variants(&self) -> Vec<Self>; fn as_color_id(&self) -> Option<ColorId>; fn from_color_ids(ids: &[ColorId]) -> Self; } pub trait Block { type Color: Color; fn from_str_and_color(s: &str, color: Option<ColorId>) -> Self { let size = s.parse::<usize>().expect("Non-integer block size given"); Self::from_size_and_color(size, color) } fn from_size_and_color(size: usize, color: Option<ColorId>) -> Self; fn size(&self) -> usize; fn color(&self) -> Self::Color; } #[derive(Debug, PartialEq, Eq, Hash, Clone)] pub struct Description<T: Block> where T: Block, { pub vec: Vec<T>, }
рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдЬреИрд╕реЗ рдХрд┐ рд░рд╕реНрдЯ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, C ++) рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рд▓рдХреНрд╖рдг рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рд╕реЗ рдмреЗрд╣рддрд░ рдбреЛрдореЗрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдкрд╛рдпрдерди рдХреЛрдб рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд░реИрдЦрд┐рдХ BguSolver
, BguSolver
рдФрд░ BguColoredSolver
рд▓рд┐рдП рджреЛ рдХрдХреНрд╖рд╛рдПрдВ BguColoredSolver
рдЬреЛ BguColoredSolver
рдПрдХ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рд▓рд╛рдЗрди рдФрд░ рдПрдХ рд░рдВрдЧ рд▓рд╛рдЗрди рдХреЛ рд╣рд▓ рдХрд░рддреА BguColoredSolver
ред рд░рд╕реНрдЯ рдХреЛрдб рдореЗрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдПрдХрдорд╛рддреНрд░ рдЬреЗрдиреЗрд░рд┐рдХ struct DynamicSolver<B: Block, S = <B as Block>::Color>
рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рддреЗ рд╕рдордп рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ( DynamicSolver<BinaryBlock>, DynamicSolver<ColoredBlock>
)ред рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдХреБрдЫ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдЬрдВрдЧ рдореЗрдВ рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдиреЗ рдореБрдЭреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЧрдП, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЯрди рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд┐рд╕ рдХрд┐рд╕реА рдиреЗ рднреА рд░рд╕реНрдЯ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рд╕рдВрдХрд▓рдХ рдореЗрдВ "рд╡рд┐рд╢реНрд╡рд╛рд╕" рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рджреЗрдЦрд╛, рдЬрдм рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рдореНрди рдЫрджреНрдо-рдореЗрдЯрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддреА рд╣реИ:
write_initial_code
рдЬрдмрдХрд┐ (рд╕рдВрдХрд▓рдХ_рд╣рдВрдЯ = $ (рдХрд╛рд░реНрдЧреЛ рдЪреЗрдХ))! = 0; рдХрд░рдирд╛
fix_errors (рд╕рдВрдХрд▓рдХ_рд╣рдВрдЯ)
рдЕрдВрдд
рдЬрдм рдХрдВрдкрд╛рдЗрд▓рд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЪреЗрддрд╛рд╡рдирд┐рдпреЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХрд╛ рдХреЛрдб рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЙрдзрд╛рд░ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдЪреЗрдХрд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ рдФрд░ рдЖрдк рд╕рдВрднрд╛рд╡рд┐рдд рдмрдЧ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рд╡рдзрд╛рди рдбрд┐рдЬрд╛рдЗрди рдХреЗ рдЕрдзреАрди) рдХреА рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреА рдШрдЯрдирд╛ рдХреЛ рдкреВрд░реНрд╡-рдЪреЗрддрд╛рд╡рдиреА рджреЗрдВрдЧреЗред
рдореИрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдБ рдЬреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд░рд╕реНрдЯ рдХреЛрдб рдХрд┐рддрдирд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдкрд╛рдпрдерди рд╕рдордХрдХреНрд╖реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ)ред
unsolved_neighboursрджрд┐рдП рдЧрдП рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдЕрдирд╕реБрд▓рдЭреЗ "рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ" рдХреА рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ (x, y)
def unsolved_neighbours(self, position): for pos in self.neighbours(position): if not self.is_cell_solved(*pos): yield pos
fn unsolved_neighbours(&self, point: &Point) -> impl Iterator<Item = Point> + '_ { self.neighbours(&point) .into_iter() .filter(move |n| !self.cell(n).is_solved()) }
partial_sumsрдПрдХ рдкрдВрдХреНрддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдВрд╢рд┐рдХ рд░рдХрдо рджреЗрдВ (рдмреНрд▓реЙрдХ рдХреЗ рдмреАрдЪ рдЖрд╡рд╢реНрдпрдХ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП)ред рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪрдХрд╛рдВрдХ рдиреНрдпреВрдирддрдо рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдмреНрд▓реЙрдХ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдмрд╛рдж рдореЗрдВ рдПрдХ рд░реИрдЦрд┐рдХ рд╕реЙрд▓реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ)ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреНрд▓реЙрдХ рдХреЗ рдРрд╕реЗ рд╕реЗрдЯ [2, 3, 1]
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдЙрдЯрдкреБрдЯ [2, 6, 8]
, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдмреНрд▓реЙрдХ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рдЕрдзрд┐рдХрддрдо рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рджрд╛рд╣рд┐рдирд╛ рдХрд┐рдирд╛рд░рд╛ 2 рд╕реЗрд▓ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗ, рдЗрд╕реА рддрд░рд╣ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рднреАред рдмреНрд▓реЙрдХ:
рез реи рей рек рел рем 9ред реп
_ _ _ _ _ _ _ _ _ _ _
2 3 1 | _ | _ | _ | _ | _ | _ | _ | _ | _ |
^ ^ ^
| | |
1 рдмреНрд▓реЙрдХ рдХрд╛ рдЕрдВрдд | | |
рдмреНрд▓реЙрдХ 2 рдХрд╛ рдЕрдВрдд -------- |
рдмреНрд▓реЙрдХ 3 рдХрд╛ рдЕрдВрдд ------------
@expand_generator def partial_sums(blocks): if not blocks: return sum_so_far = blocks[0] yield sum_so_far for block in blocks[1:]: sum_so_far += block + 1 yield sum_so_far
fn partial_sums(desc: &[Self]) -> Vec<usize> { desc.iter() .scan(None, |prev, block| { let current = if let Some(ref prev_size) = prev { prev_size + block.0 + 1 } else { block.0 }; *prev = Some(current); *prev }) .collect() }
рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдХрдИ рдмрджрд▓рд╛рд╡ рдХрд┐рдП
- рд╕реЙрд▓реНрд╡рд░ рдХреЛрд░ (рдПрд▓реНрдЧреЛрд░рд┐рджрдо) рдореЗрдВ рдорд╛рдореВрд▓реА рдмрджрд▓рд╛рд╡ рд╣реБрдП (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдФрд░ рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)
- рд▓реАрдирд┐рдпрд░ рд╕реЙрд▓реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ (рд╕рдмрд╕реЗ рддреЗрдЬ) рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЫреЛрдбрд╝ рджрд┐рдпрд╛
- ini рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрдЬрд╛рдп, рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд TOML рдкреНрд░рд╛рд░реВрдк рдкреЗрд╢ рдХрд┐рдпрд╛
- рджрд╛рдЧреА рд╣реБрдИ рдХреНрд░реЙрд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдХреНрдпреЛрдВрдХрд┐, рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдирд╛, рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рд╣реИ
рдЙрддреНрдкрд╛рджрди рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдмрдЪрд╛ рд╣реИ - рд╕рд┐рд░реНрдл рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП, рд▓реЗрдХрд┐рди рдЕрдм рдХрдВрд╕реЛрд▓ рдореЗрдВ рд░рдВрдЧреАрди рд╕реЗрд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд░рдВрдЧреАрди рд╣реИрдВ ( рдЗрд╕ рдЯреЛрдХрд░реЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)
рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдг
- clippy рдПрдХ рдорд╛рдирдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рд╣реИ рдЬреЛ рдХрднреА-рдХрднреА рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рдХрд░ рдХреЛрдб рдкреНрд░рджрд░реНрд╢рди рднреА рджреЗ рд╕рдХрддрд╛ рд╣реИред
- valgrind рдбрд╛рдпрдиреЗрдорд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИред рдореИрдВрдиреЗ рдЗрд╕реЗ рдмреЛрдЯрдиреЗрдХреНрд╕ (
valrgind --tool=callgrind
) рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ valrgind --tool=massif
рдХреЛрдб рдХреЗ valrgind --tool=massif
рд╡рд░реНрдЧреЛрдВ ( valrgind --tool=massif
) рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред рдпреБрдХреНрддрд┐: рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ [profile.release] debug = true to Cargo.toml рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВред рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдбреАрдмрдЧ рд╡рд░реНрдг рдЫреЛрдбрд╝ рджреЗрдЧрд╛ред - рдХреЙрд▓рдЧреНрд░рд┐рдВрдб рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП kcachegrindред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рдЙрдкрдХрд░рдгред
рдЙрддреНрдкрд╛рджрдХрддрд╛
рдХрд┐ рдХреНрдпрд╛ рдЬрдВрдЧ рдкрд░ рдкреБрдирд░реНрд▓реЗрдЦрди рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рддреБрд▓рдирд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╡рд░реНрдЧ рдкрд╣реЗрд▓реА рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕рд░реНрд╡реЛрддреНрддрдо рд╕реЙрд▓реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдореЛрдВ рдФрд░ рдпрд╣рд╛рдВ рд░рди рдХрд╛ рд╡рд░реНрдгрдиред рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдлрд╝рд╛рдЗрд▓ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рдкрд░ рдХреБрдЫ рдЧреНрд░рд╛рдлрд╝ рдмрдирд╛рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╕рдордп рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рд▓реЗрдХрд░ рджрд╕рд┐рдпреЛрдВ рдорд┐рдирдЯ рддрдХ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЧреНрд░рд╛рдлрд╝ рд▓реЙрдЧрд░рд┐рджрдорд┐рдХ рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬрдпреБрдкрд░ рд▓реИрдкрдЯреЙрдк рдореЗрдВ рдЪрд▓рд╛рдПрдВ import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline
рдЕрдЬрдЧрд░ рд╕реЙрд▓реНрд╡рд░

( рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ )
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддреБрдд рд╕рднреА рд╕реЙрд▓реНрд╡рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣рд╛рдБ pynogram рдзреАрдорд╛ рд╣реИред рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдкрд╡рд╛рдж рд╕реИрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рддрдореВрд░рд╛ / рдХреЙрдкреНрд░реА рд╕реЙрд▓реНрд╡рд░ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд╣реЗрд▓рд┐рдпреЛрдВ (рдЧреНрд░рд╛рдл рдХреЗ рдмрд╛рдПрдВ рд╣рд┐рд╕реНрд╕реЗ) рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ SAT-solvers рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рд╡реЗ рд╕реБрдкрд░ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдХреНрд░реЙрд╕рд╡рд░реНрдб рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реЙрд▓реНрд╡рд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдореЗрдВ рдлрдВрд╕ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЧреНрд░рд╛рдл рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рддрдореВрд░рд╛ / рдХреЙрдкрд┐рд╕ рд╕рдмрд╕реЗ рдХрдард┐рди рдкрд╣реЗрд▓реА рдХреЛ рджрд╕рд┐рдпреЛрдВ рдФрд░ рд╕реИрдХрдбрд╝реЛрдВ рдмрд╛рд░ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рддреЗрдЬреА рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
рдЬрдВрдЧ рд╕реЙрд▓реНрд╡рд░

( рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ )
рдпрд╣ рдЧреНрд░рд╛рдлрд╝ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЧреИрд░-рд╕рд░рдХрд╛рд░реА рднреА C рдпрд╛ C ++ ( рд╡реЛрд▓реНрдЯрд░ рдФрд░ рд╕рд┐рд░реЛрдореЛрд▓реЛрдЯреЛрд╡ ) рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд▓реЗ рд╕реЙрд▓реНрд╡рд░реЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛ рдЙрд╕рд╕реЗ рднреА рдмрджрддрд░ рд╣реИред рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рд╕реЙрд▓реНрд╡рд░ рд▓рдЧрднрдЧ BGU- рд╕реЙрд▓реНрд╡рд░ (рдЬрд╛рд╡рд╛) рдХреЗ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдорд╛рдг рдХреЗ рдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЗрд╕рд╕реЗ рдЖрдЧреЗ рд░рд╣рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдХрдард┐рди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рддрдореВрд░рд╛ / рдХреЙрдкрд┐рд╕ рд╣рдореЗрд╢рд╛ рд╕рднреА рд╕реЗ рдЖрдЧреЗ рд╣реЛрддрд╛ рд╣реИред
рдЬрдВрдЧ рдмрдирд╛рдо рдЕрдЬрдЧрд░

( рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ )
рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рджреЛ рд╕реЙрд▓реНрд╡рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдереЙрди рд╕реЙрд▓реНрд╡рд░ рдХреЗ рдЖрдЧреЗ рд░рд╕реНрдЯ рд╕реЙрд▓реНрд╡рд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдкрд░рд┐рдорд╛рдг рдХреЗ 1-3 рдХреНрд░рдо рд╣реИрдВред
+ рд╕реЙрд▓реНрд╡рд░ рд╕рд╛рдЗрдЯреЛрдВ https://webpbn.com рд╕реЗ рд╕рднреА рдкрд╣реЗрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЫрд┐рдкреЗ рд╣реБрдП рдмреНрд▓реЙрдХ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде - рджрд╛рдЧрджрд╛рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░), http://nonograms.org рдФрд░ рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ (TOML- рдЖрдзрд╛рд░рд┐рдд) рдкреНрд░рд╛рд░реВрдк
+ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдФрд░ рд░рдВрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЧреИрд░-рд░рдВрдЧреАрди рд╣рд▓ рдХрд░рддреА рд╣реИ
+ рдХрдВрд╕реЛрд▓ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (color c webpbn.com рдбреНрд░реЙ рдЕрд╕рд▓реА рд░рдВрдЧ)
+ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рд╕реЙрд▓реНрд╡рд░ рдХреА рд▓реЗрдЦ-рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рддрд╛рд▓рд┐рдХрд╛ рджреЗрдЦреЗрдВ)ред
- рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдЕрдкреНрд░рднрд╛рд╡реА рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╛рдпрдерди рд╕рдорд╛рдзрд╛рди рдореЗрдВ: рдХреБрдЫ рдкрд╣реЗрд▓рд┐рдпрд╛рдБ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП , рдРрд╕рд╛ рд╣рд╛рдирд┐рд░рд╣рд┐рдд 20x20 ) рдШрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЬрдм рдирд┐рд░реНрдгрдп рдкреЗрдбрд╝ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ)ред рд╢рд╛рдпрдж рдкреАрдЫреЗ рд╣рдЯрдиреЗ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рд╣рдм рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд╕реЙрд▓реНрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рд╕рдЪ рд╣реИ, рдПрдХрдорд╛рддреНрд░ рд╕реИрдЯ рд╕реЙрд▓реНрд╡рд░ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдЬрдВрдЧ рдкрд░ рдкрд╛рдпрд╛ рдерд╛ , рдЕрдзреВрд░рд╛ рдФрд░ рдкрд░рд┐рддреНрдпрдХреНрдд рд▓рдЧрддрд╛ рд╣реИред
WebAssembly
рдЗрд╕рд▓рд┐рдП, рд░рд╕реНрдЯ рдореЗрдВ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИ: рд╕реЙрд▓реНрд╡рд░ рдмрд╣реБрдд рддреЗрдЬ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд░рд╕реНрдЯ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рд╢рд╛рдВрдд рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: WebAssembly рдореЗрдВ рд╕рдВрдХрд▓рди рдФрд░ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдмрд╛рдБрдз рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреЗрдПрд╕ рдХреЛрдб рдореЗрдВ рд░рд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рджрд░реНрдж рд░рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ - рдпрд╣ wasm-pack (+ wasm-bindgen )ред рдЗрд╕рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдп рдФрд░ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдХрд░рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рд╕реНрдЯ рдФрд░ рд╡реЗрдмрдПрдЬрд╝рд╡реЗрд░реНрдо рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдмрд┐рдВрджреБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдерд╛:
рдкрдврд╝рддреЗ рд╕рдордп, рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЬреЗрдПрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд░реБрд╕реНрдд рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЦреИрд░, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА npm рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдПред рдореЗрд░реЗ рд▓рд┐рдП, рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рд╕реЗ рджреВрд░ рдХреЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдЬрд╛рдирдХрд░ рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ рдХрд┐ рдкреБрд╕реНрддрдХ рд╕реЗ рдорд╛рдирдХ рдЙрджрд╛рд╣рд░рдг рднреА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдЬреЛ npm run start
рд╕реЗ рдЕрд▓рдЧ рд╣реИред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, wasm-pack рдореЗрдВ рдПрдХ рдореЛрдб рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдирд┐рдпрдорд┐рдд JS рдХреЛрдб (рдЬреЛ рдХрд┐ рдПрдХ npm рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИ) рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред wasm-pack build --target no-modules --no-typescript
рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдВрдЧреА: рдкреНрд░реЛрдЬреЗрдХреНрдЯ-name.wasm - WebAssembly рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ- name.js рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд░рд╕реНрдЯ рдХреЛрдб рдХрд╛ рдмрд╛рдЗрдирд░реАред рдЕрдВрддрд┐рдо рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд┐рд╕реА рднреА HTML рдкреЗрдЬ <script src="project-name.js"></script>
рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ npm, webpack, ES6, рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЖрдзреБрдирд┐рдХ JS рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдЕрдиреНрдп рдЦреБрд╢рд┐рдпреЛрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реБрдП рдмрд┐рдирд╛ WASM рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред no-modules
рдореЛрдб WASM рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрджрд╛рд╣рд░рдгреЛрдВ рдФрд░ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдП рдЧреИрд░-рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдлреНрд░рдВрдЯ-рдПрдВрдб рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
WebAssembly рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рднрд╛рд░реА рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпреЗ рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдХрдИ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ WebAssembly рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрд┐рд╕рд╕реЗ рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ : рдЧреИрд░-рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬреЛ рдХрд┐ рдореЗрд░реЗ рд╕реЙрд▓реНрд╡рд░ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдореИрдВрдиреЗ рджреЗрдЦреА рдереАред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡реЗрдм рдХрд░реНрдордЪрд╛рд░реА рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, "рднрд╛рд░реА" WASM рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:
- рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ) рдПрдХ рднрд╛рд░реА рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВред
- , .
- - ()
WASM- JS, WASM . - ( ), HashMap
, . ( JS) , / .
, Mutex , thread-safe. smart- . thread-safe Rc Arc RefCell RwLock . : 30%. --features=threaded
thread-safe , WASM-.
6574 8098 ( 10 ):
, - 40..70% , , (32..37%) thread-safe ( cargo build --release --features=threaded
).
Firefox 67.0 Chromium 74.0.
WASM- ( ). https://webpbn.com/ http://www.nonograms.org/
TODO
"" /, / .
, . "" , , . .
( , 3600 ). WASM , ( , (!) , , WASM). , , - , nonogrid .
. : , , WASM . , ( ) , JS , .
JS. backtrace, .
( TOML- )
рдкрд░рд┐рдгрд╛рдо
, (, , etc).
Rust 1-3 PyPy 1.5-2 ( ).
Python Rust , Python (, , comprehensions), Rust-.
Rust WebAssembly . Rust , WASM, ( 1.5 ).
- The 'pbnsolve' Paint-by-Number Puzzle Solver by Jan Wolter and the survey
- The BGU Nonograms Project
- Solving Nonograms by combining relaxations
- An Efficient Approach to Solving Nonograms
- Color and black and white Japanese crosswords on-line
- 'Nonolib' library by Dr. Steven Simpson
- Rust and WebAssembly