P╠╢y Japaneset╠╢h╠╢╠╢o╠╢nust рдЬрдВрдЧ рдФрд░ WebAssembly рдХреЗ рд╕рд╛рде рдЬрд╛рдкрд╛рдиреА рдХреНрд░реЙрд╕рд╡рд░реНрдб рдХреЛ рд╣рд▓ рдХрд░рдирд╛

рдиреЙрдиреЛрдЧреНрд░рд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЬрдВрдЧ рд▓реЛрдЧреЛ


рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЙрдиреЛрдЧреНрд░рд╛рдо рд╕реЙрд▓реНрд╡рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЗрд╕реЗ рд░рд╕реНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ, рддрд╛рдХрд┐ рдЗрд╕реЗ рд╕реАрдзреЗ 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: # upgrade priority new_priority = priority - 1 line_jobs[new_job] = new_priority def solve_and_update(board, index, is_column): if is_column: row_desc = board.columns_descriptions[index] row = tuple(board.get_column(index)) else: row_desc = board.rows_descriptions[index] row = tuple(board.get_row(index)) updated = line_solver(row_desc, row) if row != updated: for i, (pre, post) in enumerate(zip(row, updated)): if _is_pixel_updated(pre, post): yield (not is_column, i) if is_column: board.set_column(index, updated) else: board.set_row(index, updated) 



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


    рдХреЛрдб

    рдпрджрд┐ рдирдореВрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╕рд╣реА рд╣реИред


     def probe(self, cell_state): board = self.board pos, assumption = cell_state.position, cell_state.color # already solved if board.is_cell_solved(pos): return False if assumption not in board.cell_colors(pos): LOG.warning("The probe is useless: color '%s' already unset", assumption) return False save = board.make_snapshot() try: board.set_color(cell_state) propagation( board, row_indexes=(cell_state.row_index,), column_indexes=(cell_state.column_index,)) except NonogramError: LOG.debug('Contradiction', exc_info=True) # rollback solved cells board.restore(save) else: if board.is_solved_full: self._add_solution() board.restore(save) return False LOG.info('Found contradiction at (%i, %i)', *pos) try: board.unset_color(cell_state) except ValueError as ex: raise NonogramError(str(ex)) propagation( board, row_indexes=(pos.row_index,), column_indexes=(pos.column_index,)) return True 



  • ( рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ ) рдпрджрд┐ рдкреНрд░реЛрдмрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЖрдк рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХреА рдЧрдИ рдкрд╣реЗрд▓реА рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд░рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмреИрдХрдЯреНрд░реИрдХрд┐рдВрдЧ рдХрд░рддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рд░реНрдгрдп рдкреЗрдбрд╝ рдХреА рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ)ред рдпрд╣рд╛рдВ, рдПрдХ рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдиреА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рдЕрдЧрд▓реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреМрди рд╕реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЪреБрдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдЪреНрдЫрд╛ рд╢реЛрдз рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рд╣реИ ред


    рдХреЛрдб

    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: # do not restore the solved cells on a root path - they are really solved! if path: board.restore(save) return True def _try_state(self, state, path): board = self.board full_path = path + (state,) probe_jobs = self._get_all_unsolved_jobs(board) try: # update with more prioritized cells for new_job, priority in self._set_guess(state): probe_jobs[new_job] = priority __, best_candidates = self._solve_jobs(probe_jobs) except NonogramError as ex: LOG.warning('Dead end found (%s): %s', full_path[-1], str(ex)) return False rate = board.solution_rate LOG.info('Reached rate %.4f on %s path', rate, full_path) if rate == 1: return True cells_left = round((1 - rate) * board.width * board.height) LOG.info('Unsolved cells left: %d', cells_left) if best_candidates: return self.search(best_candidates, path=full_path) return True 



рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдХреНрд░реЙрд╕рд╡рд░реНрдб рдкрд╣реЗрд▓реА рдХреЛ рджреВрд╕рд░реЗ рд╕реНрддрд░ рд╕реЗ рд╣рд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рдкрд╣рд▓рд╛ рдХреЗрд╡рд▓ рдкрддрд┐рдд рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬрдм рдкреВрд░реЗ рдХреНрд░реЙрд╕рд╡рд░реНрдб рдкрд╣реЗрд▓реА рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдпрд╛ рд╕реНрддрдВрдн рд╣реЛрддрд╛ рд╣реИ) рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реНрддрд░реЛрдВ рдХреЛ рдКрдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдХрдИ рдмрд╛рд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕реНрддрд░ рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рд╕реНрддрд░ рдкрд░ рддреЗрдЬреА рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рд╕реЗ рдЬрдЯрд┐рд▓ рдкрд╣реЗрд▓реА рдХреЗ рд▓рд┐рдП рд▓рд╛рдЦреЛрдВ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ (рдмрд▓реНрдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ) рдХрд┐ рдЕрдЬрдЧрд░ рдкреВрд░реЗ рдЙрдкрдХрд░рдг рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕реАрдкреАрдпреВ-рдЧрд╣рди рдХрд╛рд░реНрдп рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ: рдЗрд╕рдореЗрдВ рд╕рднреА рдЧрдгрдирд╛ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЗрд╣рдж рдЕрдХреНрд╖рдо рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдк рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдмрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рд░реВрдк рд╕реЗ рдмрдВрдж рдмреАрдЬреАрдпреВ рд╕реЙрд▓реНрд╡рд░ (рдЬрд╛рд╡рд╛ рдореЗрдВ), рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ 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>, } // for black-and-white puzzles #[derive(Debug, PartialEq, Eq, Hash, Copy, Clone, PartialOrd)] pub enum BinaryColor { Undefined, White, Black, BlackOrWhite, } impl Color for BinaryColor { // omitted } #[derive(Debug, PartialEq, Eq, Hash, Default, Clone)] pub struct BinaryBlock(pub usize); impl Block for BinaryBlock { type Color = BinaryColor; // omitted } // for multicolor puzzles #[derive(Debug, PartialEq, Eq, Hash, Default, Copy, Clone, PartialOrd, Ord)] pub struct MultiColor(pub ColorId); impl Color for MultiColor { // omitted } #[derive(Debug, PartialEq, Eq, Hash, Default, Clone)] pub struct ColoredBlock { size: usize, color: ColorId, } impl Block for ColoredBlock { type Color = MultiColor; // omitted } 

рдХреЛрдб рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╕рдордп, рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдХрд┐ рдПрдХ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдЬреИрд╕реЗ рдХрд┐ рд░рд╕реНрдЯ (рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 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 # strip the spaces df = pd.read_csv('perf.csv', skipinitialspace=True) df.columns = df.columns.str.strip() df['name'] = df['name'].str.strip() # convert to numeric df = df.replace('\+\ *', np.inf, regex=True) ALL_SOLVERS = list(df.columns[3:]) df.loc[:,ALL_SOLVERS] = df.loc[:,ALL_SOLVERS].apply(pd.to_numeric) # it cannot be a total zero df = df.replace(0, 0.001) #df.set_index('name', inplace=True) SURVEY_SOLVERS = [s for s in ALL_SOLVERS if not s.endswith('_my')] MY_MACHINE_SOLVERS = [s for s in ALL_SOLVERS if s.endswith('_my') and s[:-3] in SURVEY_SOLVERS] MY_SOLVERS = [s for s in ALL_SOLVERS if s.endswith('_my') and s[:-3] not in SURVEY_SOLVERS] bar_width = 0.17 df_compare = df.replace(np.inf, 10000, regex=True) plt.rcParams.update({'font.size': 20}) def compare(first, others): bars = [first] + list(others) index = np.arange(len(df)) fig, ax = plt.subplots(figsize=(30,10)) df_compare.sort_values(first, inplace=True) for i, column in enumerate(bars): ax.bar(index + bar_width*i, df_compare[column], bar_width, label=column[:-3]) ax.set_xlabel("puzzles") ax.set_ylabel("Time, s (log)") ax.set_title("Compare '{}' with others (lower is better)".format(first[:-3])) ax.set_xticks(index + bar_width / 2) ax.set_xticklabels("#" + df_compare['ID'].astype(str) + ": " + df_compare['name'].astype(str)) ax.legend() plt.yscale('log') plt.xticks(rotation=90) plt.show() fig.savefig(first[:-3] + '.png', bbox_inches='tight') for my in MY_SOLVERS: compare(my, MY_MACHINE_SOLVERS) compare(MY_SOLVERS[0], MY_SOLVERS[1:]) 

рдЕрдЬрдЧрд░ рд╕реЙрд▓реНрд╡рд░

pynogram рдкреНрд░рджрд░реНрд╢рди

( рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ )


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


рдЬрдВрдЧ рд╕реЙрд▓реНрд╡рд░

nonogrid рдкреНрд░рджрд░реНрд╢рди

( рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ )


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


рдЬрдВрдЧ рдмрдирд╛рдо рдЕрдЬрдЧрд░

py-рдмрдирд╛рдо-рдЬрдВрдЧ рдкреНрд░рджрд░реНрд╢рди

( рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ )


рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рджреЛ рд╕реЙрд▓реНрд╡рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдереЙрди рд╕реЙрд▓реНрд╡рд░ рдХреЗ рдЖрдЧреЗ рд░рд╕реНрдЯ рд╕реЙрд▓реНрд╡рд░ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдкрд░рд┐рдорд╛рдг рдХреЗ 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 рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддреА рд╣реИ:


    1. рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ) рдПрдХ рднрд╛рд░реА рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВред
    2. , .
    3. - ()


WASM- JS, WASM . - ( ), HashMap , . ( JS) , / .


, Mutex , thread-safe. smart- . thread-safe Rc Arc RefCell RwLock . : 30%. --features=threaded thread-safe , WASM-.


6574 8098 ( 10 ):


idnon-thread-safethread-safeweb-interface
65745.47.49.2
809821.528.429.9

, - 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 ).




  1. The 'pbnsolve' Paint-by-Number Puzzle Solver by Jan Wolter and the survey
  2. The BGU Nonograms Project
  3. Solving Nonograms by combining relaxations
  4. An Efficient Approach to Solving Nonograms
  5. Color and black and white Japanese crosswords on-line
  6. 'Nonolib' library by Dr. Steven Simpson
  7. Rust and WebAssembly

Source: https://habr.com/ru/post/hi454586/


All Articles