
рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЪреИрдВрдкрд┐рдпрдирд╢рд┐рдк рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЖрд╡рд╛рд╕ред рдпреЛрдЧреНрдпрддрд╛ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рдЬреЛ рдлреНрд░рдВрдЯреЗрдВрдб рд╕реЗрдХреНрд╢рди рдЪреБрдирд╛ рдерд╛, рдЙрдиреНрд╣реЗрдВ рдмрд╣реБрдд рдЕрд▓рдЧ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдерд╛: рдкрд╣рд▓рд╛ (рд╣рдорд╛рд░реА рдЙрдореНрдореАрджреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░) 20 рдорд┐рдирдЯ, рдЖрдЦрд┐рд░реА - рд▓рдЧрднрдЧ рдПрдХ рдШрдВрдЯреЗред рд╣рдордиреЗ рдПрдХ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕рд╣рд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреМрд╢рд▓ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред
рдЙред рдЗрд╕реЗ рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░реЗрдВ
рд▓реЗрдЦрдХ: рдореИрдХреНрд╕рд┐рдо рд╕рд╛рдпрд╕реЛрд╡, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯрд┐рди рдкреЗрдЯреНрд░реАрд╡рдкрд╣рд▓рд╛ рдХрд╛рд░реНрдп рд╡рд╛рд░реНрдо-рдЕрдк рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рддрд┐рднрд╛рдЧреА рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЪрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд┐рд▓рд╛ред рд╣рдордиреЗ рди рдХреЗрд╡рд▓ рдПрдХ рд╢рд╛рдмреНрджрд┐рдХ рд╕реНрдерд┐рддрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреА, рдмрд▓реНрдХрд┐ рдПрдХ "рдЦрд░рд╛рдм" рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдорд╛рдзрд╛рди рднреА рдХрд┐рдпрд╛ред рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ (рдПрдХ рд▓рд╛рд▓рдЪреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рдерд╛), рдкреБрдирд░рд╛рд╡рд░реНрддрди рдФрд░ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЧрдгрдирд╛рдУрдВ рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдмрдХрд╡рд╛рд╕ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИред
рд╢рд░реНрдд
рдЖрдкрдХреЛ рдПрдВрдЯреАрдореИрдЯрд░ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдпреЛрдЧрд╢рд╛рд▓рд╛ рдореЗрдВ рдиреМрдХрд░реА рдорд┐рд▓реА, рдЬрд╣рд╛рдВ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рд╡рд┐рднрд╛рдЧ рдЙрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдкрджрд╛рд░реНрде рдФрд░ рдПрдВрдЯреАрдореИрдЯрд░ рдХреЛ рдорд┐рд▓рд╛рддреЗ рд╕рдордп рд╣реЛрддреА рд╣реИрдВред рдЖрдкрдХреЛ рдХреБрдЫ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдгреБрдУрдВ рдкрд░ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдкрдбрд╝реЛрд╕реА рд╡рд┐рднрд╛рдЧ рдиреЗ рдПрдХ рдЙрдкрдХрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдереЛрдбрд╝реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдВрдЯреАрдореИрдЯрд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЙрди рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХрд░рдиреЗ рдореЗрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрд┐рдирдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рд╣рдо рд╕рдмрд╕реЗ рднрд╛рд░реА рдЕрдгреБрдУрдВ рдореЗрдВ рд╕реЗ 2 рдкрд╛рддреЗ рд╣реИрдВред
- рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдПрдВрдЯреАрдореИрдЯрд░ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред
- рдЙрдиреНрд╣реЗрдВ рдорд┐рд▓рд╛рдПрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рд╡рдЬрди рд╕рдорд╛рди рд╣реИ, рддреЛ рдЙрдирдХрд╛ рд╕рддреНрдпрд╛рдирд╛рд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╡рдЬрди рдЕрд▓рдЧ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдЕрдгреБ рдорд┐рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡рдЬрди рдкрд┐рдЫрд▓реЗ рджреЛ рдХреЗ рд╡рдЬрди рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдЕрдгреБ рд╣реА рдкрджрд╛рд░реНрде рд╣реИред
- рдЕрдЧрд░ рдПрдХ рдЕрдгреБ рдмрдЪрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЙрд╕рдХрд╛ рд╡рдЬрди рдкрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдпрджрд┐ рдХрдИ рдЕрдгреБ рд╣реИрдВ, рддреЛ рд╣рдо рдЪрд░рдг 1 рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВред
рдЖрдкрдХреЛ рдкреНрд░рдпреЛрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╡рдЬрди рд░рд╣реЗрдЧрд╛, рдЗрд╕рдХреЗ рдЕрдгреБ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕ рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рджреВрд╕рд░реЗ рд╡рд┐рднрд╛рдЧ рдХреЗ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреЛ рд╣реИред
рдкрд┐рдЫрд▓реЗ рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдЗрди рдЧрдгрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХреЛрдб рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдгреБрдУрдВ рдкрд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХреЛрдб рдЧрдгрдирд╛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдкрд░рд┐рд╖реНрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдЙрдЪрд┐рдд рд╕рдордп рдкрд░ рдХрд╛рдо рдХрд░реЗред
рдХреЛрдб рдЖрдкрдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИрдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдгрд╡рд┐рдХ рднрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рд╣реЛрдЧреАред рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдЕрдгреБ рдХреЗ рд╡рдЬрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрдгреБ рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ 0 рд▓реМрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
var findLatestWeight = function(weights, i = weights.length - 1) { const cur = weights.length - 1 === i; if (i === 0) return weights[0]; weights.sort((a, b) => a - b); weights[i - 1] = (weights[i] === weights[i-1]) ? 0 : weights[i] - weights[i-1]; return findLatestWeight(weights, i - 1); }
рдЙрджрд╛рд╣рд░рдг рдФрд░ рдиреЛрдЯреНрд╕рдЙрджрд╛рд╣рд░рдг
рдкреНрд░рд╡реЗрд╢: [2,7,4,1,8,1]
рдЖрдЙрдЯрдкреБрдЯ: рез
рд╣рдо рдЕрдгреБрдУрдВ рдХреЛ 7 рдФрд░ 8 рдХреЗ рд╡рдЬрди рдХреЗ рд╕рд╛рде рд▓реЗрддреЗ рд╣реИрдВ, 7 рдХреЛ рдПрдХ рдПрдВрдЯреАрдореЛрд▓реЗрдХреНрдпреВрд▓ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рдЬрди рдХреЗ рдЕрдгреБ рд╕реЗ рдЯрдХрд░рд╛рддреЗ рд╣реИрдВред рд╡рдЬрди рдХрд╛ рдПрдХ рдЕрдгреБ рд░рд╣рддрд╛ рд╣реИред 1. рд╕реНрдЯреАрд▓ рдХреЗ рд╢реЗрд╖ рдЕрдгреБрдУрдВ рдХрд╛ рд╡рдЬрди [2,4,1,11,1]ред рд╣рдо 2 рдФрд░ 4 рдХреЗ рд╡рдЬрди рдХреЗ рд╕рд╛рде рдЕрдгреБрдУрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, 2 рдХреЛ рдПрдХ рдПрдВрдЯреАрдореЙрд▓реЗрдХреНрдпреВрд▓ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 4 рдЕрдгреБ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рддреЗ рд╣реИрдВред рд╡рдЬрди рдХрд╛ рдПрдХ рдЕрдгреБ рд░рд╣рддрд╛ рд╣реИ 2. рд╕реНрдЯреАрд▓ рдХреЗ рд╢реЗрд╖ рдЕрдгреБрдУрдВ рдХрд╛ рд╡рдЬрди [2,1,1,1]ред рд╣рдо рдЕрдгреБрдУрдВ рдХреЛ 2 рдФрд░ 1 рдХреЗ рд╡рдЬрди рдХреЗ рд╕рд╛рде рд▓реЗрддреЗ рд╣реИрдВ, 1 рдХреЛ рдПрдХ рдПрдВрдЯреАрдореЙрд▓реЗрдХреНрдпреВрд▓ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ 2 рдЕрдгреБ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рддреЗ рд╣реИрдВред рд╡рдЬрди рдХрд╛ рдПрдХ рдЕрдгреБ рд░рд╣рддрд╛ рд╣реИред рд╕реНрдЯреАрд▓ рдХреЗ рд╢реЗрд╖ рдЕрдгреБрдУрдВ рдХрд╛ рд╡рдЬрди [1,1,1]ред рд╣рдо 1 рдФрд░ 1 рдХреЗ рд╡рдЬрди рдХреЗ рд╕рд╛рде рдЕрдгреБрдУрдВ рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдПрдХ рдПрдВрдЯреАрдореЙрд▓реЗрдХреНрдпреВрд▓ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рддреЗ рд╣реИрдВред рдЙрдирдХрд╛ рд╕рд░реНрд╡рдирд╛рд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╢реЗрд╖ рдЕрдгреБрдУрдВ рдХреЗ рд╡рдЬрди [1]ред рдПрдХ рдЕрдгреБ рдмрдЪрд╛ред рдкрд░рд┐рдгрд╛рдо 1 рд╣реИред
рдиреЛрдЯ
рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ рдЬреЛ findLatestWeight рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреА рд╣реИ:
function findLatestWeight(weights) {
рд╕рдорд╛рдзрд╛рди Node.js 12 рдореЗрдВ рдЪрд▓реЗрдЧрд╛ред
рдирд┐рд░реНрдгрдп
рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП "рдЦрд░рд╛рдм" рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рд╕рд╛рде рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рдкрд╣рд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рддреБрд░рдВрдд рдПрдХ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
var findLatestWeight = function(weights) { let i = weights.length - 1; do { if (i === 0) return weights[0] || 0; weights.sort((a, b) => a - b); weights[i-1] = (weights[i]=== weights[i-1]) ? 0 : weights[i]-weights[i-1]; i--; } while (true); }
рдпрд╣рд╛рдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ - рдПрдХ рдирд┐рд░рдВрддрд░ рдкреБрди: рдЫрдВрдЯрд╛рдИ (рдЫреЛрдЯреЗ рд╕реЗ рдмрдбрд╝реЗ рддрдХ) рдФрд░ рд╕рд░рдгреА рдХреЗ рдЕрдВрдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред рдирддреАрдЬрддрди, рд╣рдореЗрдВ рд╕рд░рдгреА рдореЗрдВ penultimate рддрддреНрд╡ рдореЗрдВ рдХрдореА рдорд┐рд▓рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕рд░рдгреА рдХреЛ рдЯреНрд░рд┐рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рд▓рд╛рдЦ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╣рдо рдЗрд╕реЗ рдмрд╣реБрдд рдЕрдВрдд рддрдХ рдлрд┐рд░ рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░реЗрдВрдЧреЗред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╕рд░рдгреА рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЯреНрд░рд┐рдо рдХрд░реЗрдВред
var findLatestWeight = function(weights) { let i = weights.length - 1; do { if (i === 0) return weights[0] || 0; weights.sort((a, b) => a - b); weights[i-1] = (weights[i]=== weights[i-1]) ? 0 : weights[i]-weights[i-1]; weights.length = i;
рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЫрдВрдЯрд╛рдИ рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рдХрд┐рд╕реА рднреА рд╕рдордп, рдмрдбрд╝реЗ рдФрд░, рд╣рдо рд╕рд░рдгреА рдХреЗ 2 рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рджрд╕реНрдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦреЗрдВрдЧреЗред рдпрд╣реА рд╣реИ, рдпрд╣ рджреЛ рдКрдВрдЪрд╛рдЗрдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рд╣реИ, рдЬреЛ рдПрдХ рдкрд╛рд╕ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдРрд╕реА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВред
const maximumTwo = (arr) => { let max1 = arr[0]; let max2 = arr[1]; let max1I = 0; let max2I = 1; for(let i = 2; i < arr.length; i++) { if (arr[i] > max1) { if (max1 > max2) { max2 = arr[i]; max2I = i; } else { max1 = arr[i]; max1I = i; } } else if (arr[i] > max2) { max2 = arr[i]; max2I = i; } } if (max1 > max2) return [max2, max1, max2I, max1I]; return [max1, max2, max1I, max2I]; };
рдФрд░ рд╣рдо рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВ:
const fn = function(weights) { if (weights.length <= 1) { return weights[0]; } do { const [x, y, xI, yI] = maximumTwo(weights); if (x === 0) { return y; } weights[xI] = 0; weights[yI] = y - x; } while(true); };
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рд╣рдореЗрд╢рд╛ рджреЛ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдЫреЛрдЯреЗ рдХреЛ рд╢реВрдиреНрдп рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдмрдбрд╝реЗ рдХреЛ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдореЗрдВ рдмрджрд▓ рджреЗрдВрдЧреЗред рд╣рдореЗрдВ рдЫрдБрдЯрд╛рдИ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рд╛ рдФрд░ рдЗрд╕рдХреЗ рдмрджрд▓реЗ рдПрдХ рд░реИрдЦрд┐рдХ рдкрд╛рд╕ рдорд┐рд▓рд╛ред
рд╣рдордиреЗ рдЬрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрд╛, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдиреЗ рдЕрдзрд┐рдХрддрдо рддрддреНрд╡ рд▓рд┐рдпрд╛, рдЗрд╕реЗ -1 рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкрддреНрдерд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬреЛ рддрдм "рдЬреИрд╕рд╛ рд╣реИ" рдЧрдгрдирд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдп рдореЗрдВ рдПрдХ рдорд╛рдирд╕рд┐рдХ рдЬрд╛рд▓ рд╣реИ рдЬреЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЕрджреНрд╡рд┐рддреАрдп рд╡рдЬрди рдХреЗ рдкрддреНрдерд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдФрд░ рдЙрдирд╕реЗ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
B BEM
рд▓реЗрдЦрдХ: рдпреВрдЬреАрди рдорд┐рд╢реЗрдВрдХреЛ , рд╡реНрд▓рд╛рджрд┐рдореАрд░ рдЧреНрд░рд┐рдиреЗрдВрдХреЛ рддрджрд╛рддреБрддрд╛рд╢рд░реНрдд
рд▓реЗрдЖрдЙрдЯ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдмреАрдИрдПрдо рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдордХрд░рдг рдореЗрдВ рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреВрд░реНрдг рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рд▓реЛрдЧ рдмреНрд▓реЙрдХ, рддрддреНрд╡ рдФрд░ рд╕рдВрд╢реЛрдзрдХ (block__mod__val - elem, block - mod - val ___ elem) рдХреЗ рдмреАрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реАрдорд╛рдВрдХрдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рд░ рдмрд╛рд░ рдЙрд╕реЗ рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХреЛ рдПрдХ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ рдЬреЛ рд╡рд░реНрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд╛рдЬрдХ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ред рдкрд░рд┐рд╕реАрдорди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рдЕрдХреНрд╖рд░ рдирд╣реАрдВ)ред рд╕рдВрднрд╛рд╡рд┐рдд рдиреЛрдЯреЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг (рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрдХ рдмрд┐рдирд╛ рдореВрд▓реНрдп рдХреЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ):
block_mod__elem
рд╢реЛрдзрди:
- рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдХреЗрд╡рд▓ рдЫреЛрдЯреЗ рдЕрдХреНрд╖рд░реЛрдВ рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВред
- рдПрдХ рд╡реИрдз рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЗрдирдкреБрдЯ рдХреЛ рдЦрд┐рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореЙрдбреНрдпреВрд▓ рдХреЛ рдлреЙрд░реНрдо рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП:
{ mod: "_",
рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпJS рдореЙрдбреНрдпреВрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
module.exports = function(str) { }
рдирд┐рд░реНрдгрдп
рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдореЗрдВ рд▓рдЧрднрдЧ 20 рдорд┐рдирдЯ рд▓рдЧреЗред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рд╣рдо рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рдпрдорд┐рдд рднрд╛рд╡реЛрдВ рдХреЗ рдЬреНрдЮрд╛рди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рд╕реЗ, рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЗрдирдкреБрдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдз рд╕реАрдПрд╕рдПрд╕ рд╡рд░реНрдЧ рдпреБрдХреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЕрдХреНрд╖рд░ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЛ рдЧреИрд░-рдЕрдХреНрд╖рд░ рд╡рд░реНрдгреЛрдВ рдХреЗ рдордирдорд╛рдиреЗ рдЕрдиреБрдХреНрд░рдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ рдХрд╛рдо рд╡рд┐рднрд╛рдЬрдХреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдФрд░ рдЙрдирдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдордЭрдирд╛ рд╣реИред
рд╡рд░реНрдЧ рдирд╛рдо рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╣рдореЗрд╢рд╛ рдмреНрд▓реЙрдХ рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рдХреНрд░рдо рд╣реИред рд╣рдо рдЗрд╕реА рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ: [az] +ред
рд╣рдореЗрдВ рд╢реЗрд╖ рднрд╛рдЧреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдирд╛рдо рдФрд░ рдЙрд╕рдХрд╛ рдореВрд▓реНрдп рдпрд╛ рддрддреНрд╕рдВрдмрдВрдзреА рддрддреНрд╡ рдФрд░ рдЙрд╕рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рддрддреНрд╡ рдХрд╛ рдирд╛рдоред
рд╕реАрдорд╛рдВрдХрдХ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЧреИрд░-рдЕрдХреНрд╖рд░ рдЕрдиреБрдХреНрд░рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐: [^ az] + рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВ рдФрд░ рдЙрди рд╕рдореВрд╣реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рдирдХреЗ рдореВрд▓реНрдп рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
let [, mod, elem ] = str.match(/[az]+(?:([^az]+)[az]+(?:\1)?[az]+)([^az]+)[az]+(?:\2)?[az]+/);
рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдкрд╛рдпрд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рджреЛ рдмрд╛рд░ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдореВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдФрд░ рд╡рд┐рднрд╛рдЬрдХ рдХреЛ рд▓реЗ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдХрд┐ рдШрдЯрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
const substringCount = (source, substr) => (source.match(new RegExp('[az]' + substr + '[az]', 'g')) || []).length;
рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реАрдорд╛рдВрдХрдХ рджреЛ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореЙрдб - рдПрдХ рдмрд╛рд░, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд┐рдкрд░реАрдд рд╕рдЪ рд╣реИред рдЕрдВрддрд┐рдо рдирд┐рд░реНрдгрдп:
module.exports = function(str) { let [, mod, elem ] = str.match(/[az]+(?:([^az]+)[az]+(?:\1)?[az]+)([^az]+)[az]+(?:\2)?[az]+/); const substringCount = (source, substr) => (source.match(new RegExp('[az]' + substr + '[az]', 'g')) || []).length; if (substringCount(str, elem) === 2 && substringCount(str, mod) === 1) { [mod, elem] = [elem, mod]; } return { mod, elem }; }
рд╕реАред рдХреНрд▓реЛрди рдлреИрдХреНрдЯреНрд░реА
рд▓реЗрдЦрдХ: рджрд┐рдорд┐рддреНрд░реА рдПрдВрдбреНрд░рд┐рдпрд╛рдиреЛрд╡ dima117 , рдПрд▓реЗрдХреНрд╕реА рдЧреБрд╕реЗрд╡рд╢рд░реНрдд
рдЦрд┐рдбрд╝рдХреА рдХреЗ рдмрд╛рд╣рд░ 2319 рд╣реИред рдирд┐рдЧрдо рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдлрд▓ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдХреНрд▓реЛрди рдХрд░рддрд╛ рд╣реИред
рдХреНрд▓реЛрди рдХреЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдирдП "рдЙрддреНрдкрд╛рджреЛрдВ" рдХреЛ рдЕрдкрдиреЗ рдХрдВрдзреЗ рдкрд░ рдПрдХ рдмрд╛рд░рдХреЛрдб рдЯреИрдЯреВ рдХреЗ рд╕рд╛рде рд▓реЗрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдХреНрд▓реЛрди рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдХрд╛рд░рдЦрд╛рдиреЗ рдХреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ рдЬреЛ рдХреНрд▓реЛрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд░рдХреЛрдб рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдЧрд╛ред
рдХреНрд▓реЛрди рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рд░реВрдкрдХреНрд▓реЛрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ:
type CloneInfo = { sex: string; id: string; name: string; }
рдмрд╛рд░рдХреЛрдб рдкреНрд░рддрд┐рдкрд╛рджрди рдПрд▓реНрдЧреЛрд░рд┐рдердордХреНрд▓реЛрди рдлреИрдХреНрдЯреНрд░реА рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рд░рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

рдмрд╛рд░рдХреЛрдб рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рд╣реИ - 148 рдмрд╛рдп 156 рдкрд┐рдХреНрд╕реЗрд▓ред рдмрд╛рд░рдХреЛрдб рдХреА рдкрд░рд┐рдзрд┐ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ 3 рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдлреНрд░реЗрдо рд╣реИрдВред рдлрд╝реНрд░реЗрдо рдХреЗ рдЕрдВрджрд░ рдмрд╛рд░рдХреЛрдб рд╕рд╛рдордЧреНрд░реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддрд┐ рдкрдВрдХреНрддрд┐ 17 рдХрд╛рд▓реЗ рдпрд╛ рд╕рдлреЗрдж рд╡рд░реНрдЧреЛрдВ рдХреА 18 рд▓рд╛рдЗрдиреЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХрд╛ рдЖрдХрд╛рд░ 8 рд╕реЗ 8 рдкрд┐рдХреНрд╕реЗрд▓ рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕рдлреЗрдж рд╡рд░реНрдЧ 0, рдХрд╛рд▓реЗ - 1 рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ред
рдмрд╛рд░рдХреЛрдб рдХрдВрдЯреЗрдВрдЯ рдЬреЗрдирд░реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдердордкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдкрд╣рд▓реЗ рд╕реНрддрдВрдн рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░, рдПрдХ рд╡рд░реНрдЧ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреНрд▓реЛрди рдХреЗ рд▓рд┐рдВрдЧ рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд░рддрд╛ рд╣реИред рдорд╣рд┐рд▓рд╛ рдХрд╛ рдореВрд▓реНрдп рд╢реВрдиреНрдп (рд╢реНрд╡реЗрдд), рдкреБрд░реБрд╖ рджреНрд╡рд╛рд░рд╛ рдПрдХ (рдХрд╛рд▓рд╛) рджреНрд╡рд╛рд░рд╛ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рдкрддреНрд░ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ <id> <name> рдлрд╝реАрд▓реНрдб рдЖрдИрдбреА рдФрд░ рдирд╛рдо рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИред рдирд╛рдо рдлрд╝реАрд▓реНрдб 26 рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдВрдд рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рд╕рд╛рде рдЧрджреНрджреЗрджрд╛рд░ рд╣реИред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдмрд╛рдЗрдЯ рд╕рд░рдгреА рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд ASCII рдХреЛрдб (0 рд╕реЗ 255 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛) рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореА рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдмрд╛рдЗрдирд░реА рдиреЛрдЯреЗрд╢рди (рдЖрда рд╡рд░реНрдг 0 рдпрд╛ 1) рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрда рд╡рд░реНрдЧреЛрдВ (0 - рд╕рдлреЗрдж рдХреНрд╡рд╛рд░реНрдЯреЗрдЯ, 1 - рдХрд╛рд▓рд╛ рд╡рд░реНрдЧ) рдХреЗ рдЕрдиреБрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд░реНрдЧреЛрдВ рдХреЛ рдмрд╛рд░рдХреЛрдб рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд▓рд╛рдЗрди рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдордЧреНрд░реА рдХреА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред
рдирд┐рдпрдВрддреНрд░рдг рд╕реВрдЪрдирд╛ рдЧрдгрдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдордирд┐рдпрдВрддреНрд░рдг рд╕реВрдЪрдирд╛ рдХреА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓рдо рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рдпреЛрдЧ рдХреА рд╕рдорддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЙрд▓рдо рдореЗрдВ рд╢реВрдиреНрдп рдФрд░ рд▓реЛрдЧреЛрдВ рдХрд╛ рдпреЛрдЧ рд╕рдо рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдг рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рдПрдХ рд╕рдлреЗрдж рд╡рд░реНрдЧ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛, рдПрдХ рдХрд╛рд▓рд╛ рд╡рд░реНрдЧред
рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рд░реВрдк рдФрд░ рдЙрджрд╛рд╣рд░рдгрд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рд░реВрдкрдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд░реЗрдВрдбрд░ рдмрд╛рд░рдХреЛрдб рдлрд╝рдВрдХреНрд╢рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
function renderBarcode(cloneInfo, element) {
рдмрд╛рд░рдХреЛрдб:

рдЙрджрд╛рд╣рд░рдг 2
рдХреНрд▓реЛрди рдЬрд╛рдирдХрд╛рд░реА:
{ "sex": "female", "id": "0owrgqqwfw", "name": "Dazdraperma Petrovna" }
рдмрд╛рд░рдХреЛрдб:

рдирд┐рд░реНрдгрдп
рдбреЗрдЯрд╛ рдХреЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪреЗрдХрд╕рдо рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВред рдЖрдЗрдП рдЗрд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдФрд░ рдорд╛рдереЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ - рдХреЛрдб рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛ред
рдЖрдЗрдП рдмрд╛рдЗрдирд░реА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░реЗрдВ:
рд╣рдо рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рд╕реЗ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╢реВрдиреНрдп рдФрд░ рдЕрдиреНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
let dataString = (cloneInfo.sex === 'female' ? '0' : '1') + cloneInfo.id.split('').map(charToByte).map(byteToString).join('') + cloneInfo.name.padEnd(26, ' ').split('').map(charToByte).map(byteToString).join('');
рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдмрд╛рд░рдХреЛрдб рдХреЗ рд▓рд┐рдП рд▓реЗрдЖрдЙрдЯ рдФрд░ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦреЗрдВ:
рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд░реЗрдВрдбрд░ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛:
dataString .split('') .forEach((bit) => { const bitDiv = document.createElement('div'); bitDiv.className = 'content__bit content__bit_' + (bit === '0' ? 'zero' : 'one'); contentDiv.appendChild(bitDiv); });
рдпрд╣ рдЪреЗрдХрд╕рдо рдХреА рдЧрдгрдирд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
for (let i = 0; i < 17; i++) {
D. рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░реЗрдВ
рд▓реЗрдЦрдХ: рд╡реНрд▓рд╛рджрд┐рдореАрд░ рд░реБрд╕реЛрд╡, рджрд┐рдорд┐рддреНрд░реА рдХрдирд╛рдЯрдирд┐рдХреЛрд╡рдпреЛрдЧреНрдпрддрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ, рдПрдХ рдХрд╛рд░реНрдп рдерд╛ рдЬрд╣рд╛рдВ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЯреЗрдмрд▓ рдпрд╛ рд╕реВрдЪреА рд╡рд╛рд▓рд╛ рдПрдХ HTML рдкреГрд╖реНрда рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдЕрд▓рдЧ рдХрд┐рдВрд╡рджрдВрддреА рдереА, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рднреА рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрдм рдЧрдП рдереЗ рдХрд┐ рдЖрдкрдХреЛ рдкреЗрдЬ рдХреЛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдХреЗ рд╕рдорд╛рди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪрд▓реЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред
рд╢рд░реНрдд
рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдкреНрд░рд╛рд╡рдзрд╛рди рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдкреЛрд░реНрдЯрд▓ рдкрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЖрд╡реЗрджрди рдЬрдорд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛ рджрд┐рдпрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рднрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣ рдбреЗрдЯрд╛ рддрдм рдЖрдВрддрд░рд┐рдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕рд╣рд┐рдд рдХрдИ рдкреНрд░рд╛рдзрд┐рдХрд░рдгреЛрдВ рдХреЛ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдВрддрд░рд┐рдХ рдорд╛рдорд▓реЛрдВ рдХреЗ рдордВрддреНрд░рд╛рд▓рдп рдорд╛рд░реНрдХрдбрд╛рдЙрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд░рд╛рдЬреНрдп рд╕реЗрд╡рд╛рдПрдБ HTML рдкреНрд░рд╛рд░реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдореБрдЭреЗ рдПрдХ рдкреНрд░рд╛рд░реВрдк рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВ рддрд╛рдХрд┐ рд▓реЛрдЧ рдЬрд▓реНрдж рд╕реЗ рдЬрд▓реНрдж рд╢реБрд░реВ рд╣реЛ рд╕рдХреЗрдВред
рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдПрдХ HTML рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди-рдЬреИрд╕реЗ рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ .js рдлрд╝рд╛рдЗрд▓ рднреЗрдЬреЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
function solution(input) {
рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк рдФрд░ рдиреЛрдЯреНрд╕рдЗрдирдкреБрдЯ рдкреНрд░рд╛рд░реВрдк
HTML рддрд╛рд▓рд┐рдХрд╛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрддреА рд╣реИ:
<table> <colgroup> <col align="right" /> <col /> <col align="center" /> </colgroup> <thead> <tr> <td>Command </td> <td>Description </td> <th>Is implemented </th> </tr> </thead> <tbody> <tr> <th>git status</th> <td>List all new or modified files</td> <th>Yes</th> </tr> <tr> <th>git diff</th> <td>Show file differences that haven't been staged</td> <td>No</td> </tr> </tbody> </table>
рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рдореЗрдВ рдХреЛрд▓рдЧреНрд░реБрдк, рдереНрд░реЗрдб рдФрд░ tbody рдЯреИрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рд╕рднреА рдЯреИрдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдереНрд░реЗрдб рдпрд╛ tbody рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд░рд╣реЗрдВрдЧреЗред
- рдХреЛрд▓рдЧреНрд░реБрдк рдореЗрдВ рдРрд╕реЗ рдХреЛрд▓ рдЯреИрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рддреАрди рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рди рдХреЗ рд╕рд╛рде рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрд░реЗрдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдмрд╛рдПрдВ | рдХреЗрдВрджреНрд░ | рджрд╛рдпрд╛рдВ |
- thead рдФрд░ tbody рдореЗрдВ 1 рдпрд╛ рдЕрдзрд┐рдХ tr рд╣реЛрддреЗ рд╣реИрдВ
- tr, рдмрджрд▓реЗ рдореЗрдВ, td рдФрд░ th рджреЛрдиреЛрдВ рд╣реЛрддреЗ рд╣реИрдВ
- рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрдЧреАред - рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╕реЗрд▓ рд╣реЛрдЧрд╛ред - рд╕реЗрд▓ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреИрд░-рд╡реНрд╣рд╛рдЯреНрд╕рдПрдк рдкреНрд░рддреАрдХ рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд╣реЛрддрд╛ рд╣реИред
- рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд╡реЗрдВ / td рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣рдореЗрд╢рд╛ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рдФрд░ рдХреЛрд▓рдЧреНрд░реБрдк рдореЗрдВ рдХреЛрд▓ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмреАрдЪ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдЕрдЧрд░ рдХреЛрд▓рдЧреНрд░реБрдк рд╣реИред
- рд╕реНрд░реЛрдд HTML рдореЗрдВ рд╕реНрдкреЗрд╕ рдФрд░ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдХрд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ HTML рдХреА рд╡реИрдзрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЖрдЙрдЯрдкреБрдЯ рд╕реНрд╡рд░реВрдк
рдЖрдЙрдЯрдкреБрдЯ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:
| Command | Description | **Is implemented** |
| ---: | :--- | :---: |
| **git status** | List all new or modified files | **Yes** |
| **git diff** | Show file differences that haven't been staged | No |
- рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдИ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╣рдореЗрд╢рд╛ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рд╣реЗрдбрд░ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдЕрдиреНрдп рд╕рднреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдЬрд╛рддреА рд╣реИрдВред
- рд╣реЗрдбрд░ рд╕реЗрдкрд░реЗрдЯрд░ рд╣рдореЗрд╢рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред
- td рдХреА рд╕рд╛рдордЧреНрд░реА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИ, рд╡реЗрдВ рдХреА рд╕рд╛рдордЧреНрд░реА ** рдХреЗ рд░реВрдк рдореЗрдВ рдмреЛрд▓реНрдб **ред
- рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдФрд░ рд╕реЗрд▓ рдбрд┐рд▓реАрдорд┐рдЯрд░ (()) рдореЗрдВ рд╕реЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмреАрдЪ рд╣рдореЗрд╢рд╛ рдПрдХ рд╕реНрдерд╛рди рд╣реЛрддрд╛ рд╣реИред
- td рдФрд░ рд╡реЗрдВ рдЯреИрдЧреНрд╕ рдХреЗ рдХрдВрдЯреЗрдВрдЯ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рд╕реНрдкреЗрд╕ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рд╕реЗрд▓ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд▓рд╛рдЗрди рдмреНрд░реЗрдХ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред
- рдХрдХреНрд╖реЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдПрдХ рд╕реНрдерд╛рди рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
- рдорд╛рд░реНрдХрдбрд╛рдЙрди рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕реНрддрдВрднреЛрдВ рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП, рд╣реЗрдбрд░ рд╡рд┐рднрд╛рдЬрдХ рдХрд╛ рдкреНрд░рд╛рд░реВрдкрдг рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ:
| : --- | рдХрд╛ рдЕрд░реНрде рд╣реИ рдмрд╛рдПрдВ рд╕рдВрд░реЗрдЦрдг
| : ---: | рдХреЗрдВрджреНрд░ рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдорддрд▓рдм рд╣реИ
| ---: | рд╕рд╣реА рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдорддрд▓рдм рд╣реИ
рдпрджрд┐ рдХреЙрд▓ рдЯреИрдЧ рдореЗрдВ рдХреЛрдИ рд╕рдВрд░реЗрдЦрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдВрд░реЗрдЦрдг рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдиреЛрдЯ
- рд▓рд╛рдЗрди рдлрд╝реАрдб рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ \ n рд╡рд░реНрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
- рд╕рдорд╛рдзрд╛рди рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рддрд╛рд╡рд░рдг
(рдХреНрд░реЛрдо 78) рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
- рдЖрдк рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ
es2018 рд╕рдорд╛рд╡реЗрд╢реА рддрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд░реНрдгрдп
рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ DOM рдЯреНрд░реА рдХреЛ рдЯреНрд░реЗрд╕ рдХрд░рдХреЗ рд╣рд▓ рдХреА рдЧрдИ рд╣реИред DOM рдЯреНрд░реА рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрддрд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЗрд╕рдХрд╛ рдПрдХ рдЕрднрд┐рдиреНрди рдЕрдВрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдЪрдЯреАрдПрдордПрд▓ рд╕реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдорд╛рд░реНрдХрдЕрдк рдореЗрдВ рдбреЛрдо рдЯреНрд░реА рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдиреАрдЪреЗ рдХреЛрдб рд╣реИ рдЬреЛ рд╕рдорд╛рдзрд╛рди (рдЗрдирдкреБрдЯ) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рдХрд╛рдп рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ HTML рд╕реЗ DOM рдЯреНрд░реА рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
const div = document.createElement('div'); div.innerHTML = input; const table = div.firstChild;
DOM рдЯреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдмрд╕ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди DOM рдиреЛрдбреНрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╡рд┐рднрд┐рдиреНрди DOM рддрддреНрд╡реЛрдВ рдХреЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
const processors = { 'colgroup': processColgroup, 'thead': processThead, 'tbody': processTbody, }; for (let child of table.children) { processors[child.tagName.toLowerCase()](child); }
Colgroup рдФрд░ col рдЯреИрдЧреНрд╕ рд╕реЗ, рд╣рдо рдЯреЗрдмрд▓ рдХреЙрд▓рдо рдХреЗ рд╕рдВрд░реЗрдЦрдг рдХреЛ рдЬрд╛рдирдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
const alignments = []; const defaultAlign = 'left'; const processColgroup = (colgroup) => { alignments.push(...Array(...colgroup.children).map(col => { return col.align || defaultAlign; })); };
рдереНрд░реЗрдб, tbody рдФрд░ tr рдЯреИрдЧреНрд╕ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдмрдЪреНрдЪреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ:
const rows = []; const processThead = (thead) => { rows.push(...Array(...thead.children).map(processTr)); }; const processTbody = (tbody) => { rows.push(...Array(...tbody.children).map(processTr)); }; const processTr = (tr) => { return Array(...tr.children).map(processCell); };
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рди рднреВрд▓реЗрдВ рдХрд┐, рдХрдиреНрд╡реЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛, td рдФрд░ th рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
const processCell = (cell) => { const tag = cell.tagName.toLowerCase(); const content = clearString(cell.innerHTML); return { 'td': content, 'th': `**${content}**`, }[tag]; };
DOM рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╢рд░реНрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
const clearLineBreaks = (str) => str.replace(/\r?\n|\r/g, ''); const clearSpaces = (str) => str.replace(/\s+/g, ' '); const clearString = (str) => clearSpaces(clearLineBreaks(str)).trim();
рдбреЛрдо рдЯреНрд░реА рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реА рдореЗрдЬ рдХреЗ рдмрдбрд╝реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛:
[
["Command","Description","**Is implemented**"],
["**git status**","List all new or modified files","**Yes**"],
["**git diff**","Show file differences that haven't been staged","No"]
]
рдХреЙрд▓рдо рд╕рдВрд░реЗрдЦрдг рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрд░реЗрдЦрдг рд╕рд░рдгреА рдореЗрдВ рдереА:
["right","left","center"]
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЙрд▓рдо рд╕рдВрд░реЗрдЦрдг рдЬрд╛рдирдХрд╛рд░реА рдЗрдирдкреБрдЯ рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ:
const updateAlignments = () => { if (alignments.length > 0) return; alignments.push(...rows[0].map(x => defaultAlign)); }; updateAlignments();
рд╕рдВрд░реЗрдЦрдг рдХреЛ рдЕрдВрддрд┐рдо рд░реВрдк рдореЗрдВ рдмрджрд▓реЗрдВ:
const alignmentsContents = alignments.map(align => { return { 'left': ' :--- ', 'center': ' :---: ', 'right': ' ---: ' }[align]; }); const delimiter = `|${alignmentsContents.join('|')}|`;
рдЙрджрд╛рд╣рд░рдг рд╕реАрдорд╛рдВрдХрдХ рдорд╛рди:
"| ---: | :--- | :---: |"
рдЕрдВрддрд┐рдо рдЪрд░рдг рдПрдХ рдорд╛рд░реНрдХрдбрд╛рдЙрди рд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ HTML рд╕реЗ рдкрдврд╝реЗ рдЧрдП рд╕рднреА рдбреЗрдЯрд╛ рд╣реЛрдВрдЧреЗ:
const lineEnd = '\n'; rows.forEach((row, i) => { if (i > 0) markdown += lineEnd; const mdRow = `| ${row.join(' | ')} |`; markdown += mdRow; if (i === 0) { markdown += lineEnd; markdown += delimiter; } }); return markdown;
рд╡рд╛рдкрд╕реА рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛрдб рд╕рдорд╛рдзрд╛рди (рдЗрдирдкреБрдЯ) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рдХрд╛рдп рдерд╛ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдХрд╛рд░реНрдп рд╕реНрдерд┐рддрд┐ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдорд╛рд░реНрдХрдбрд╛рдЙрди рддрд╛рд▓рд┐рдХрд╛ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
рдИред рдорд╣рд╛рдорд╛рд░реА рд╡рд╛рдпрд░рд╕
рд▓реЗрдЦрдХ: рдПрдВрдбреНрд░реА рдореЛрдЦреНрд░реБрд╕реЗрд╡, рдЗрд╡рд╛рди рдкреЗрдЯреБрдЦреЛрд╡рд╡рд┐рд╢реНрд╡ рд╕реНрд╡рд╛рд╕реНрдереНрдп рд╕рдВрдЧрдарди рдиреЗ рдПрдХ рдирдП рд╡рд╛рдпрд░рд╕ рдХреЗ рдЖрд╕рдиреНрди рдорд╣рд╛рдорд╛рд░реА рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдкрд░ рдПрдХ рд░рд┐рдкреЛрд░реНрдЯ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреА рд╣реИ рдЬреЛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЦрддрд░рд╛ рд╣реИред рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рд╡рд╛рдпрд░рд╕ рддрдм рддрдХ рдЦреБрдж рдХреЛ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдореЗрдЬрдмрд╛рди рдЬреЗрдПрд╕ рдХреЛрдб рдХреЛ рдХреБрдЫ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдирд╣реАрдВ рджреЗрдЦрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕рдВрдХреНрд░рдорд┐рдд рд╡реНрдпрдХреНрддрд┐ рдиреЗ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рджреЗрдЦрд╛, рд╡рд╣ рдЬреЗрдПрд╕ рдореЗрдВ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдкрдиреА рдХреНрд╖рдорддрд╛ рдЦреЛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдлреЛрд░рдЯреНрд░рд╛рди рдореЗрдВ рдЕрдирд╛рдпрд╛рд╕ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред
рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ Zyn рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЗ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреЗрдЦрдХрд░ рд╡рд╛рдпрд░рд╕ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕рдВрдХреНрд░рдорд┐рдд рд╡реНрдпрдХреНрддрд┐ Zyn (рдлрд╝рдВрдХреНрд╢рди (a, b, c) {рдХрдВрд╕реЛрд▓ .log (a)}) рдЬреИрд╕реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЧрд▓рддреА рд╕реЗ рдЕрдкрдиреЗ рд╕рднреА рдлреНрд░рдВрдЯ-рдПрдВрдб рдХреЛ рдЦреЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдПрдПрд╕рдЯреА рдПрдВрдб рдХрдВрдкрдиреА рдиреЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдЙрдирдХреЗ рдХреЛрдб рдореЗрдВ рдЙрдкрд░реЛрдХреНрдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред рдХрдВрдкрдиреА рдХреЗ рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рдРрд╕рд╛ рдЪреЗрдХ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВред
рдПрдПрд╕рдЯреА рдПрдВрдб рдХрдВрдкрдиреА рдХреЗ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐:
- рдпрд╣ ES3 рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ,
- рдПрдХ рдмрд┐рдВрджреБ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рдХреЛрд╖реНрдардХ (рдЕрдм рдФрд░ ['рдмреА']) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЧреБрдгреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдВрднрд╡ рд╣реИ,
- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдПрдХ рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ (рдП (рдПрдХреНрд╕) - рдирд┐рд╖рд┐рджреНрдз) рджреНрд╡рд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрднреА рдирд╣реАрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
- рдХреЛрдИ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ,
тАФ , ,
тАФ (a[x], x тАФ ),
тАФ , . . var a = x; a = y; var a = b = 1.
рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рд░реВрдк
CommonJS-, , (ast) .
ast-, callback-, Zyn , .
module.exports = function (ast) { ... return [...]; }
рдиреЛрдЯ
.
function traverse( ast, onNodeEnter = (node, scope) => {}, onNodeLeave = (node, scope) => {} ) { const rootScope = new Scope(ast); _inner(ast, rootScope); function resolveScope(astNode, currentScope) { let isFunctionExpression = ast.type === 'FunctionExpression', isFunctionDeclaration = ast.type === 'FunctionDeclaration'; if (!isFunctionExpression && !isFunctionDeclaration) {
рдирд┐рд░реНрдгрдп
.
тАФ ES3
, . , .
тАФ , (ab a['b'])
Zyn, Z['y'].n, Zy['n'] Z['y']['n'].
, (a(x) тАФ )
, . , : var x = Zy; xn(...).
тАФ , ,
тАФ , ,
тАФ , .. var a = x; a = y; var a = b = 1.
( ) , - .
тАФ , (a[x], x тАФ )
, : var x = 'y'; Z[x].n(...).
C :
1. , , .
2. , .
, , тАФ . 2.
: Zyn(function(a, b, c){...}), тАФ .
FunctionExpression тАФ CallExpression, callee тАФ MemberExpression. property тАФ n, object ( MemberExpression object property y) тАФ Z.
, тАФ тАФ . тАФ Identifier , MemberExpression ObjectLiteral (xa var x = {a: ...} ).
+++ b/traverse.js @@ -120,3 +120,59 @@ Scope.prototype = { return this._vars.has(name) || (this._parent && this._parent.isDefined(name)); } }; + +module.exports = function (ast) { + var result = []; + + traverse(ast, (node, scope) => { + if (node.type !== 'CallExpression') { + return; + } + let args = node.arguments; + if (args.length !== 1 || + args[0].type !== 'FunctionExpression') { + return; + } + let callee = node.callee; + if (callee.type !== 'MemberExpression') { + return; + } + let property = callee.property, + object = callee.object; + if (property.name !== 'n') { + return; + } + if (object.type !== 'MemberExpression') { + return; + } + property = object.property; + object = object.object; + if (property.name !== 'y') { + return; + } + if (object.type !== 'Identifier' || + object.name !== 'Z') { + return; + } + + checkFunction(args[0]); + }); + + function checkFunction(ast) { + let firstArg = ast.params[0]; + if (!firstArg) { + return; + } + + traverse(ast.body, (node, scope) => { + if (node.type !== 'Identifier') { + return; + } + if (node.name === firstArg.name) { + result.push(node); + } + }); + } + + return result; +};
traverse , , MemberExpression ObjectProperty. :
--- a/traverse.js +++ b/traverse.js @@ -60,16 +60,16 @@ function traverse( * @param {object} astNode ast- * @param {Scope} scope ast- */ - function _inner(astNode, scope) { + function _inner(astNode, scope, parent) { if (Array.isArray(astNode)) { astNode.forEach(node => { /* . * , , */ - _inner(node, scope); + _inner(node, scope, parent); }); } else if (astNode && typeof astNode === 'object') { - onNodeEnter(astNode, scope); + onNodeEnter(astNode, scope, parent); const innerScope = resolveScope(astNode, scope), keys = Object.keys(astNode).filter(key => { @@ -80,10 +80,10 @@ function traverse( keys.forEach(key => { // - _inner(astNode[key], innerScope); + _inner(astNode[key], innerScope, astNode); }); - onNodeLeave(astNode, scope); + onNodeLeave(astNode, scope, parent); } } } @@ -164,10 +164,22 @@ module.exports = function (ast) { return; } - traverse(ast.body, (node, scope) => { + traverse(ast.body, (node, scope, parent) => { if (node.type !== 'Identifier') { return; } + if (!parent) { + return; + } + if (parent.type === 'MemberExpression' && + parent.computed === false && + parent.property === node) { + return; + } + if (parent.type === 'ObjectProperty' && + parent.key === node) { + return; + } if (node.name === firstArg.name) { result.push(node); }
. getPropName:
--- a/traverse.js +++ b/traverse.js @@ -121,6 +121,18 @@ Scope.prototype = { } }; +function getPropName(node) { + let prop = node.property; + + if (!node.computed) { + return prop.name; + } + + if (prop.type === 'StringLiteral') { + return prop.value; + } +} + module.exports = function (ast) { var result = []; @@ -137,17 +149,17 @@ module.exports = function (ast) { if (callee.type !== 'MemberExpression') { return; } - let property = callee.property, + let property = getPropName(callee), object = callee.object; - if (property.name !== 'n') { + if (property !== 'n') { return; } if (object.type !== 'MemberExpression') { return; } - property = object.property; + property = getPropName(object); object = object.object; - if (property.name !== 'y') { + if (property !== 'y') { return; } if (object.type !== 'Identifier' ||
: . . 1.
ScopeScope . , , traverse:
--- a/traverse.js +++ b/traverse.js @@ -1,3 +1,12 @@ +const scopeStorage = new Map(); + +function getScopeFor(ast, outerScope) { + if (!scopeStorage.has(ast)) { + scopeStorage.set(ast, new Scope(ast, outerScope)); + } + + return scopeStorage.get(ast); +} - add(name) { - this._vars.add(name); + add(name, value) { + this._vars.set(name, { + value: value, + scope: this + }); + }, + resolve(node) { + if (!node) { + return node; + } + if (node.type === 'Identifier') { + let value = this._vars.get(node.name); + if (value) { + return value; + } + value = (this._parent && this._parent.resolve(node)); + return value; + } }, /** * . @@ -136,6 +161,12 @@ function getPropName(node) { module.exports = function (ast) { var result = []; + traverse(ast, (node, scope) => { + if (node.type === 'VariableDeclarator') { + scope.add(node.id.name, node.init); + } + }); + traverse(ast, (node, scope) => { if (node.type !== 'CallExpression') { return;
Scope. , Scope . , Scope , :
--- a/traverse.js +++ b/traverse.js @@ -146,13 +146,17 @@ Scope.prototype = { } }; -function getPropName(node) { +function getPropName(node, scope) { let prop = node.property; if (!node.computed) { return prop.name; } + let resolved = scope.resolve(prop); + if (resolved) { + prop = resolved.value; + } if (prop.type === 'StringLiteral') { return prop.value; } @@ -177,22 +181,43 @@ module.exports = function (ast) { return; } let callee = node.callee; + + let resolved = scope.resolve(callee); + if (resolved) { + callee = resolved.value; + scope = resolved.scope; + } + if (callee.type !== 'MemberExpression') { return; } - let property = getPropName(callee), + let property = getPropName(callee, scope), object = callee.object; if (property !== 'n') { return; } + + resolved = scope.resolve(object); + if (resolved) { + object = resolved.value; + scope = resolved.scope; + } + if (object.type !== 'MemberExpression') { return; } - property = getPropName(object); + property = getPropName(object, scope); object = object.object; if (property !== 'y') { return; } + + resolved = scope.resolve(object); + if (resolved) { + object = resolved.value; + scope = resolved.scope; + } + if (object.type !== 'Identifier' || object.name !== 'Z') { return;
: . :
тАФ , Z тАФ , - .
тАФ , , .
тАФ , var a = 'x', b = a.
, .
--- a/traverse.js +++ b/traverse.js @@ -128,10 +128,23 @@ Scope.prototype = { } if (node.type === 'Identifier') { let value = this._vars.get(node.name); - if (value) { - return value; + if (!value) { + if (this._parent) { + value = this._parent.resolve(node); + } else { +
:
const scopeStorage = new Map(); function getScopeFor(ast, outerScope) { if (!scopeStorage.has(ast)) { scopeStorage.set(ast, new Scope(ast, outerScope)); } return scopeStorage.get(ast); } function traverse( ast, onNodeEnter = (node, scope) => {}, onNodeLeave = (node, scope) => {} ) { const rootScope = getScopeFor(ast); _inner(ast, rootScope); function resolveScope(ast, currentScope) { let isFunctionExpression = ast.type === 'FunctionExpression', isFunctionDeclaration = ast.type === 'FunctionDeclaration'; if (!isFunctionExpression && !isFunctionDeclaration) {
F. Framework-
: , collapsusAPI. тАФ , . .
тАФ . . , . !
. , . , , , ( ). , , 0 (0 , 0 , 0 ).
, , . JavaScript JS- Framework.
: , . ( , ). () . ( ).
0. , ( time) .
const ONE_SECOND_DEGREES = 6; const ONE_SECOND_FACTOR = 1 / Framework.SPEED * ONE_SECOND_DEGREES; class MyClock extends Framework.Clock { constructor() { super(); this.arrows.push(new Framework.Arrow("seconds", { color: "red" })); this.arrows.push(new Framework.Arrow("minutes", { weight: 3, length: 80 })); this.arrows.push(new Framework.Arrow("hours", { weight: 3, length: 60 })); this.buttons.push(new Framework.Button("A", () => { alert("A"); })); this.tick = 0; } onBeforeTick() { const [arrow] = this.arrows; this.tick++; arrow.rotateFactor = this.tick % 10 ? 0 : ONE_SECOND_FACTOR; console.log("before: " + arrow.pos); } onAfterTick() { const [arrow] = this.arrows; console.log("after: " + arrow.pos); } }
:
тАФ тАФ , ,
тАФ ,
тАФ , ; (100 ) ; , .
рдирд┐рд░реНрдгрдп
, -, ┬л ┬╗, . , , , .
: , . . , , .
:
const TPS = 1000 / Framework.INTERVAL;
// .
function getTarget(ticks, planet) { const { h, m, s } = planet;
, тАФ rotateFactor. getRotateFactor, , , . :
1. ,
2. .
. .
function getRotateFactor(pos, target, forward = true) { let angle = target - pos;
, MAX_SPEED . getRotateFactor.
const MAX_FACTOR = Framework.MAX_SPEED / Framework.SPEED; function getRotateFactor(pos, target, forward = true) { let angle = target - pos; if (forward) { angle < 0 && (angle += 360); } else { Math.abs(angle) > 180 && (angle -= Math.sign(angle) * 360) } const factor = angle / Framework.SPEED;
:
buttonAHandler() {
, :
onBeforeTick() { const [sec, min, hour] = this.arrows; const time = ++this.ticks; const planet = this.planets[this.pos];
:
const TPS = 1000 / Framework.INTERVAL; const MAX_FACTOR = Framework.MAX_SPEED / Framework.SPEED; function getTarget(ticks, planet) { const { h, m, s } = planet; const ts = Math.floor(ticks / TPS);
. . , , , .
: , , , , (, , ).
рдирд┐рд╖реНрдХрд░реНрд╖. . тАФ , . .
, . , ( ) 18 .
:
тАФ
ML-тАФ
-тАФ
-