рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд░ рдЧреЛрднреА рд╕рдорд╕реНрдпрд╛рдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг

рдореЗрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рдЗрдиреНрдЯрд░рдиреЗрдЯрдХреЛ рд░реВрд╕реА-рднрд╛рд╖рд╛ рдХреНрд╖реЗрддреНрд░рдорд╛, рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдгрдХреЛ рд╡рд┐рд╖рдп рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдкрдорд╛ рдХрднрд░ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рд░ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рд╕рд░рд▓ рд░ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдХреЛ рдЕрднрд╛рд╡ рдЫред

рдо рд╡рд┐рджреЗрд╢реА рд╕реНрд░реЛрддрдмрд╛рдЯ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рджрд┐рдиреЗрдЫреБ, рд░ рдирджреАрдХреЛ рдЕрд░реНрдХреЛ рдЫреЗрдЙрдорд╛ рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд░ рдЧреЛрднреА рдкрд╛рд░ рдЧрд░реНрдиреЗ рдЬреНрдЮрд╛рдд рд╕рдорд╕реНрдпрд╛рдХреЛ рдЖрдлреНрдиреИ рд╕рдорд╛рдзрд╛рди рдердкреНрдиреЗрдЫреБред

рддрд░ рдкрд╣рд┐рд▓реЗ, рдо рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЗ рд╣реЛ рд░ рдпреЛ рдХрд┐рди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдкрдорд╛ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫреБред

рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгрд┐рдХрд░рдг рднрдиреЗрдХреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЕрд░реНрдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБ рд╣реЛред

рдпреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрдиреЗ рд░ рдпрд╕рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрдордЬреЛрд░реАрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдиреЗ рд░ рд╣рдЯрд╛рдЙрдиреЗ рд╕рдмреИрднрдиреНрджрд╛ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдорд╛рдзреНрдпрдо рд╣реЛ: рдпрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░реЛрдЧреНрд░рд╛рдордорд╛ рдЕрд╡рд╕реНрдерд┐рдд рд╕рдмреИ рдкреНрд╡рд╛рд▓рд╣рд░реВ рд░ рдмрдЧрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╡рд╛ рддрд┐рдиреАрд╣рд░реВ рдЕрд╡рд╕реНрдерд┐рдд рдЫреИрдирдиреН рднрдиреА рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред
рдпреЛ рдзреНрдпрд╛рди рджрд┐рди рд▓рд╛рдпрдХ рдЫ рдХрд┐ рдХреЗрд╣рд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпреЛ рдЕрд╕рдореНрднрд╡ рдЫ, рдЬрд╕реНрддреИ 8 рд╡рд░реНрдЧ рдХреЛ рдмреЛрд░реНрдб рдЪреМрдбрд╛рдЗ рд╕рдВрдЧ 1000 рд░рд╛рдиреА рдХреЛ рд╕рдорд╕реНрдпрд╛ рдорд╛: рдпреЛ рд╕рдмреИ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рд╡рд╛ рд░реЛрдХреНрди рд╕рдорд╕реНрдпрд╛ рдорд╛ рдЖрдЙрдБрдЫред

рдпрджреНрдпрдкрд┐, рдХреБрдиреИ рдкрдирд┐ рдЕрд╡рд╕реНрдерд╛рдорд╛, рддреАрди рдордзреНрдпреЗ рдПрдЙрдЯрд╛ рдЬрд╡рд╛рдл рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреЗрдЫ: рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╣реА рдЫ, рдЧрд▓рдд, рд╡рд╛ рдпреЛ рдЬрд╡рд╛рдл рдЧрдгрдирд╛ рдЧрд░реНрди рд╕рдореНрднрд╡ рдерд┐рдПрдиред

рдпрджрд┐ рдпреЛ рдЬрд╡рд╛рдл рдкрд╛рдЙрди рдЕрд╕рдореНрднрд╡ рдЫ рднрдиреЗ, рдпреЛ рдкреНрд░рд╛рдпрдГ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рднрд╛рдЧрд╣рд░реВ рдкреБрди: рдХрд╛рдо рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫ, рддрд┐рдиреАрд╣рд░реВрдХреЛ рдПрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХрдо рдЧрд░реНрджреИ, рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╣реЛ рд╡рд╛ рд╣реЛрдЗрди рдЬрд╡рд╛рдл рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиред

рд░ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Windows рдХрд░реНрдиреЗрд▓ рд░ Darpa рдбреНрд░реЛрди рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдорд╣рд░реВрдорд╛, рдЕрдзрд┐рдХрддрдо рд╕реНрддрд░рдХреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрдиред

рд╣рд╛рдореА Z3Prover рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рдореЗрдп рдкреНрд░рдорд╛рдгрд┐рдд рд░ рд╕рдореАрдХрд░рдг рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреА рдПрдХ рдзреЗрд░реИ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдгред

рдпрд╕рдмрд╛рд╣реЗрдХ, Z3 рд▓реЗ рд╕рдореАрдХрд░рдгрд╣рд░реВ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрджрдЫ, рд░ рдмреНрд░реВрдЯ рдмрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдорд╛рдирд╣рд░реВ рдЪрдпрди рдЧрд░реНрджреИрдиред
рдпрд╕рдХреЛ рдорддрд▓рдм рдпреЛ рдЙрддреНрддрд░ рдЦреЛрдЬреНрди рд╕рдХреНрд╖рдо рдЫ, рдЬрд╣рд╛рдБ 10^100 рдЗрдирдкреБрдЯ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВрдХреЛ рд╕рдВрдпреЛрдЬрдирд╣рд░реВ рдЫрдиреНред

рддрд░ рдпреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░рдХреЛ рдПрдХ рджрд░реНрдЬрди рдЗрдирдкреБрдЯ рддрд░реНрдХ рдорд╛рддреНрд░ рд╣реЛ, рд░ рдпреЛ рдкреНрд░рд╛рдпрдГ рд╡реНрдпрд╡рд╣рд╛рд░рдорд╛ рд╕рд╛рдордирд╛ рдЧрд░рд┐рдиреНрдЫред

8 рд░рд╛рдиреАрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕рдорд╕реНрдпрд╛ (рдЕрдВрдЧреНрд░реЗрдЬреАрдмрд╛рдЯ рд▓рд┐рдЗрдПрдХреЛ рдореНрдпрд╛рдиреБрдЕрд▓).

рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд░ рдЧреЛрднреА рд╕рдорд╕реНрдпрд╛рдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг

# We know each queen must be in a different row.
# So, we represent each queen by a single integer: the column position
Q = [ Int('Q_%i' % (i + 1)) for i in range(8) ]

# Each queen is in a column {1, ... 8 }
val_c = [ And(1 <= Q[i], Q[i] <= 8) for i in range(8) ]

# At most one queen per column
col_c = [ Distinct(Q) ]

# Diagonal constraint
diag_c = [ If(i == j,
              True,
              And(Q[i] - Q[j] != i - j, Q[i] - Q[j] != j - i))
           for i in range(8) for j in range(i) ]

solve(val_c + col_c + diag_c)

Z3 рдЪрд▓рд╛рдЙрдБрджреИ, рд╣рд╛рдореА рд╕рдорд╛рдзрд╛рди рдкрд╛рдЙрдБрдЫреМрдВ:

[Q_5 = 1,
 Q_8 = 7,
 Q_3 = 8,
 Q_2 = 2,
 Q_6 = 3,
 Q_4 = 6,
 Q_7 = 5,
 Q_1 = 4]

рд░рд╛рдиреА рд╕рдорд╕реНрдпрд╛ 8 рд░рд╛рдиреАрд╣рд░реВрдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдЗрдирдкреБрдЯрдХреЛ рд░реВрдкрдорд╛ рд▓рд┐рдиреЗ рд░ рд░рд╛рдиреАрд╣рд░реВрд▓реЗ рдПрдХрдЕрд░реНрдХрд╛рд▓рд╛рдИ рд╣рд░рд╛рдП рдХрд┐ рднрдиреЗрд░ рдЬрд╡рд╛рдл рджрд┐рдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдорд╕рдБрдЧ рддреБрд▓рдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

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

рд▓рдЧрднрдЧ рдПрдЙрдЯреИ рдХреБрд░рд╛ рдХрдордЬреЛрд░реАрд╣рд░реВрдХреЛ рдЦреЛрдЬреАрдХреЛ рдорд╛рдорд▓рд╛рдорд╛ рд╣реБрдиреЗрдЫ: рд╣рд╛рдореАрд▓реЗ рднрд░реНрдЦрд░ рд╣рд╛рдореАрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕рд░реНрддрд╣рд░реВ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдкреНрд░рд╢рд╛рд╕рдХ рдкрд╛рд╕рд╡рд░реНрдб, рд╕реНрд░реЛрдд рд╡рд╛ рд╡рд┐рдШрдЯрд┐рдд рдХреЛрдбрд▓рд╛рдИ рдкреНрд░рдорд╛рдгреАрдХрд░рдгрд╕рдБрдЧ рдорд┐рд▓реНрджреЛ рд╕рдореАрдХрд░рдгрд╣рд░реВрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдХреЗрдХреЛ рд░реВрдкрдорд╛ рдЬрд╡рд╛рдл рдкрд╛рдЙрдиреБрд╣реЛрд╕реНред рд▓рдХреНрд╖реНрдп рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдбрд╛рдЯрд╛ рдЗрдирдкреБрдЯ рд░реВрдкрдорд╛ рдЖрдкреВрд░реНрддрд┐ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдореЗрд░реЛ рд╡рд┐рдЪрд╛рд░рдорд╛, рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд░ рдЧреЛрднреА рдХреЛ рдмрд╛рд░реЗ рдорд╛ рд╕рдорд╕реНрдпрд╛ рдЕрдЭ рд░реЛрдЪрдХ рдЫ, рдХрд┐рдирдХрд┐ рдпрд╕рд▓рд╛рдИ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдкрд╣рд┐рд▓реЗ рдиреИ рдзреЗрд░реИ (7) рдЪрд░рдгрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫред

рдпрджрд┐ рд░рд╛рдиреА рд╕рдорд╕реНрдпрд╛ рдПрдХрд▓ GET рд╡рд╛ POST рдЕрдиреБрд░реЛрдз рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕рд░реНрднрд░ рдШреБрд╕рд╛рдЙрди рд╕рдХреНрдиреЗ рдХреЗрд╕рд╕рдБрдЧ рддреБрд▓рдирд╛рддреНрдордХ рдЫ рднрдиреЗ, рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд░ рдмрдиреНрджрдХреЛрдмреАрд▓реЗ рдзреЗрд░реИ рдЬрдЯрд┐рд▓ рд░ рдлрд░рд╛рдХрд┐рд▓реЛ рд╡рд░реНрдЧрдмрд╛рдЯ тАЛтАЛрдЙрджрд╛рд╣рд░рдг рджреЗрдЦрд╛рдЙрдБрджрдЫ, рдЬрд╕рдорд╛ рд▓рдХреНрд╖реНрдп рдорд╛рддреНрд░ рд╣рд╛рд╕рд┐рд▓ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдзреЗрд░реИ рдЕрдиреБрд░реЛрдз рджреНрд╡рд╛рд░рд╛ред

рдпреЛ рддреБрд▓рдирд╛рддреНрдордХ рдЫ, рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд╛рдЧреА, рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рд▓рд╛рдЧреА рдЬрд╣рд╛рдБ рддрдкрд╛рдЗрдБ рдПрдХ SQL рдЗрдВрдЬреЗрдХреНрд╢рди рдЦреЛрдЬреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдпрд╕рдХреЛ рдорд╛рдзреНрдпрдордмрд╛рдЯ рдПрдХ рдлрд╛рдЗрд▓ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН, рддреНрдпрд╕рдкрдЫрд┐ рдЖрдлреНрдиреЛ рдЕрдзрд┐рдХрд╛рд░ рдорд╛рдерд┐ рдЙрдард╛рдЙрдиреБрд╣реЛрд╕реН рд░ рддреНрдпрд╕рдкрдЫрд┐ рдорд╛рддреНрд░ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рд╕рдорд╕реНрдпрд╛рдХреЛ рдЕрд╡рд╕реНрдерд╛ рд░ рдпрд╕рдХреЛ рд╕рдорд╛рдзрд╛рдирдХреГрд╖рдХрд▓реЗ рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд░ рдЧреЛрднреАрд▓рд╛рдИ рдирджреА рдкрд╛рд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдХрд┐рд╕рд╛рдирд╕рдБрдЧ рдПрдЙрдЯрд╛ рдбреБрдЩреНрдЧрд╛ рдЫ рдЬрд╕рдорд╛ рдХрд┐рд╕рд╛рди рдЖрдлреИрдВ рдмрд╛рд╣реЗрдХ рдПрдЙрдЯрд╛ рд╡рд╕реНрддреБ рдорд╛рддреНрд░ рд░рд╛рдЦреНрди рд╕рдХреНрдЫред рдмреНрд╡рд╛рдБрд╕реЛрд▓реЗ рдмрд╛рдЦреНрд░рд╛ рдЦрд╛рдиреНрдЫ рд░ рдХрд┐рд╕рд╛рдирд▓реЗ рдЫрд╛рдбреЗ рднрдиреЗ рдмрд╛рдЦреНрд░рд╛рд▓реЗ рдЧреЛрднреА рдЦрд╛рдиреЗрдЫред

рд╕рдорд╛рдзрд╛рди рдпреЛ рд╣реЛ рдХрд┐ рдЪрд░рдг 4 рдорд╛ рдХрд┐рд╕рд╛рдирд▓реЗ рдмрд╛рдЦреНрд░рд╛ рдлрд┐рд░реНрддрд╛ рд▓рд┐рдиреБ рдкрд░реНрдЫред
рдЕрдм рдпрд╕рд▓рд╛рдИ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдкрдорд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реМрдВред

рдХреГрд╖рдХ, рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд░ рдмрдиреНрджрд╛рдЧреЛрднреАрд▓рд╛рдИ реж рд╡рд╛ рез рдорд╛рддреНрд░ рдорд╛рди рд▓рд┐рдиреЗ рек рдЪрд░рдХрд╛ рд░реВрдкрдорд╛ рдмреБрдЭреМрдВред рд╢реВрдиреНрдпрдХреЛ рдЕрд░реНрде рддрд┐рдиреАрд╣рд░реВ рдмрд╛рдпрд╛рдБ рдХрд┐рдирд╛рд░рдорд╛ рдЫрдиреН, рд░ рдПрдЙрдЯрд╛рдХреЛ рдЕрд░реНрде рддрд┐рдиреАрд╣рд░реВ рджрд╛рдпрд╛рдБ рддрд░реНрдл рдЫрдиреНред

import json
from z3 import *
s = Solver()
Num= 8

Human = [ Int('Human_%i' % (i + 1)) for i in range(Num) ]
Wolf = [ Int('Wolf_%i' % (i + 1)) for i in range(Num) ]
Goat = [ Int('Goat_%i' % (i + 1)) for i in range(Num) ]
Cabbage = [ Int('Cabbage_%i' % (i + 1)) for i in range(Num) ]

# Each creature can be only on left (0) or right side (1) on every state
HumanSide = [ Or(Human[i] == 0, Human[i] == 1) for i in range(Num) ]
WolfSide = [ Or(Wolf[i] == 0, Wolf[i] == 1) for i in range(Num) ]
GoatSide = [ Or(Goat[i] == 0, Goat[i] == 1) for i in range(Num) ]
CabbageSide = [ Or(Cabbage[i] == 0, Cabbage[i] == 1) for i in range(Num) ]
Side = HumanSide+WolfSide+GoatSide+CabbageSide

Num рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЪрд░рдгрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдгрд▓реЗ рдирджреАрдХреЛ рдЕрд╡рд╕реНрдерд╛, рдбреБрдЩреНрдЧрд╛ рд░ рд╕рдмреИ рдирд┐рдХрд╛рдпрд╣рд░реВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫред

рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐, рдпрд╕рд▓рд╛рдИ рдЕрдирд┐рдпрдорд┐рдд рд░ рдорд╛рд░реНрдЬрд┐рдирдорд╛ рдЫрдиреЛрдЯ рдЧрд░реМрдВ, резреж рд▓рд┐рдиреБрд╣реЛрд╕реНред

рдкреНрд░рддреНрдпреЗрдХ рдПрдХрд╛рдЗрд▓рд╛рдИ 10 рдкреНрд░рддрд┐рд▓рд┐рдкрд┐рд╣рд░реВрдорд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░рд┐рдиреНрдЫ - рдпреЛ рдкреНрд░рддреНрдпреЗрдХ 10 рдЪрд░рдгрд╣рд░реВрдорд╛ рдпрд╕рдХреЛ рдорд╛рди рд╣реЛред

рдЕрдм рд╕реБрд░реБ рд░ рд╕рдорд╛рдкреНрддрдХреЛ рд▓рд╛рдЧрд┐ рд╕рд░реНрддрд╣рд░реВ рд╕реЗрдЯ рдЧрд░реМрдВред

Start = [ Human[0] == 0, Wolf[0] == 0, Goat[0] == 0, Cabbage[0] == 0 ]
Finish = [ Human[9] == 1, Wolf[9] == 1, Goat[9] == 1, Cabbage[9] == 1 ]

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

# Wolf cant stand with goat, and goat with cabbage without human. Not 2, not 0 which means that they are one the same side
Safe = [ And( Or(Wolf[i] != Goat[i], Wolf[i] == Human[i]), Or(Goat[i] != Cabbage[i], Goat[i] == Human[i])) for i in range(Num) ]

рд░ рдЕрдиреНрддрдорд╛, рд╣рд╛рдореА рдХрд┐рд╕рд╛рдирдХреЛ рд╕рдмреИ рд╕рдореНрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпрд╣рд░реВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдЧрд░реНрдиреЗрдЫреМрдВ рдЬрдм рддреНрдпрд╣рд╛рдБ рд╡рд╛ рдкрдЫрд╛рдбрд┐ рдкрд╛рд░ рдЧрд░реНрджрд╛ред
рдЙрд╕рд▓реЗ рдпрд╛ рдд рдмреНрд╡рд╛рдБрд╕реЛ, рдмрд╛рдЦреНрд░рд╛ рд╡рд╛ рдЧреЛрднреА рдЖрдлреВрд╕рдБрдЧ рд▓реИрдЬрд╛рди рд╕рдХреНрдЫ, рд╡рд╛ рдХрд╕реИрд▓рд╛рдИ рдкрдирд┐ рд▓реИрдЬрд╛рди рд╕рдХреНрджреИрди, рд╡рд╛ рдХрд╣рд┐рдБ рдкрдирд┐ рдЬрд╛рди рд╕рдХреНрджреИрдиред

рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рдХрд┐рд╕рд╛рди рдмрд┐рдирд╛ рдХрд╕реИрд▓реЗ рдкрд╛рд░ рдЧрд░реНрди рд╕рдХреНрджреИрдиред

рдпреЛ рддрдереНрдп рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрдХреНрдд рдЧрд░рд┐рдиреЗрдЫ рдХрд┐ рдирджреА, рдбреБрдЩреНрдЧрд╛ рд░ рд╕рдВрд╕реНрдерд╛рд╣рд░реВрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрдЫрд┐рдХреЛ рдЕрд╡рд╕реНрдерд╛ рдкрд╣рд┐рд▓реЗрдХреЛ рднрдиреНрджрд╛ рдХрдбрд╛ рд░реВрдкрдорд╛ рд╕реАрдорд┐рдд рддрд░рд┐рдХрд╛рдорд╛ рдорд╛рддреНрд░ рдлрд░рдХ рд╣реБрди рд╕рдХреНрдЫред

2 рдмрд┐рдЯреНрд╕ рднрдиреНрджрд╛ рдмрдврд┐ рдЫреИрди, рд░ рдзреЗрд░реИ рдЕрдиреНрдп рд╕реАрдорд╛рд╣рд░реБ рд╕рдВрдЧ, рдХрд┐рдирдХрд┐ рдХрд┐рд╕рд╛рдирд▓реЗ рдПрдХ рд╕рдордпрдорд╛ рдПрдХ рдЗрдХрд╛рдИ рдорд╛рддреНрд░ рдвреБрд╡рд╛рдиреА рдЧрд░реНрди рд╕рдХреНрдЫ рд░ рд╕рдмреИ рд╕рдБрдЧреИ рдЫреЛрдбреНрди рд╕рдХреНрджреИрдиред

Travel = [ Or(
And(Human[i] == Human[i+1] + 1, Wolf[i] == Wolf[i+1] + 1, Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] + 1, Goat[i] == Goat[i+1] + 1, Wolf[i] == Wolf[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] + 1, Cabbage[i] == Cabbage[i+1] + 1, Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1]),
And(Human[i] == Human[i+1] - 1, Wolf[i] == Wolf[i+1] - 1, Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] - 1, Goat[i] == Goat[i+1] - 1, Wolf[i] == Wolf[i+1], Cabbage[i] == Cabbage[i+1]),
And(Human[i] == Human[i+1] - 1, Cabbage[i] == Cabbage[i+1] - 1, Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1]),
And(Wolf[i] == Wolf[i+1], Goat[i] == Goat[i+1], Cabbage[i] == Cabbage[i+1])) for i in range(Num-1) ]

рд╕рдорд╛рдзрд╛рди рдЪрд▓рд╛рдФрдВред

solve(Side + Start + Finish + Safe + Travel)

рд░ рд╣рд╛рдореА рдЬрд╡рд╛рдл рдкрд╛рдЙрдБрдЫреМрдВ!

Z3 рд▓реЗ рд░рд╛рдЬреНрдпрд╣рд░реВрдХреЛ рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╕реЗрдЯ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдпреЛ рдЬрд╕рд▓реЗ рд╕рдмреИ рд╕рд░реНрддрд╣рд░реВ рдкреВрд░рд╛ рдЧрд░реНрдЫред
рд╕реНрдкреЗрд╕-рдЯрд╛рдЗрдордХреЛ рдЪрд╛рд░-рдЖрдпрд╛рдореА рдХрд╛рд╕реНрдЯрдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ред

рдХреЗ рднрдпреЛ рдмреБрдЭреМрдВред

рд╣рд╛рдореА рджреЗрдЦреНрдЫреМрдВ рдХрд┐ рдЕрдиреНрддрдорд╛ рд╕рдмреИрд▓реЗ рдкрд╛рд░ рдЧрд░реЗ, рд╕реБрд░реБрдорд╛ рдорд╛рддреНрд░ рд╣рд╛рдореНрд░реЛ рдХрд┐рд╕рд╛рдирд▓реЗ рдЖрд░рд╛рдо рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реЗ, рд░ рдкрд╣рд┐рд▓реЛ 2 рдкрд╛рдЗрд▓рд╛рд╣рд░реВрдорд╛ рдК рдХрд╣рд┐рдБ рдкрдирд┐ рдкреМрдбреАрдПрдиред

Human_2 = 0
Human_3 = 0

рдпрд╕рд▓реЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдиреНрдЫ рдХрд┐ рд╣рд╛рдореАрд▓реЗ рд░реЛрдЬреЗрдХрд╛ рд░рд╛рдЬреНрдпрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдЕрддреНрдпрдзрд┐рдХ рдЫ, рд░ 8 рдкрд░реНрдпрд╛рдкреНрдд рд╣реБрдиреЗрдЫред

рд╣рд╛рдореНрд░реЛ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдХрд┐рд╕рд╛рдирд▓реЗ рдпреЛ рдЧрд░реНрдпреЛ: рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЖрд░рд╛рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЖрд░рд╛рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдмрд╛рдЦреНрд░рд╛ рдХреНрд░рд╕ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдкрдЫрд╛рдбрд┐ рдкрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЧреЛрднреА рдкрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдмрд╛рдЦреНрд░рд╛рд╕рдБрдЧ рдлрд░реНрдХрдиреБрд╣реЛрд╕реН, рдмреНрд╡рд╛рдБрд╕реЛ рдкрд╛рд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдПрдХреНрд▓реИ рдлрд░реНрдХрдиреБрд╣реЛрд╕реН, рдмрд╛рдЦреНрд░рд╛рд▓рд╛рдИ рдкреБрди: рд╡рд┐рддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рддрд░ рдЕрдиреНрддреНрдпрдорд╛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рднрдпреЛ ред

#╨б╤В╨░╤А╤В.
 Human_1 = 0
 Wolf_1 = 0
 Goat_1 = 0
 Cabbage_1 = 0
 
 #╨д╨╡╤А╨╝╨╡╤А ╨╛╤В╨┤╤Л╤Е╨░╨╡╤В.
 Human_2 = 0
 Wolf_2 = 0
 Goat_2 = 0
 Cabbage_2 = 0
 
 #╨д╨╡╤А╨╝╨╡╤А ╨╛╤В╨┤╤Л╤Е╨░╨╡╤В.
 Human_3 = 0
 Wolf_3 = 0
 Goat_3 = 0
 Cabbage_3 = 0
 
 #╨д╨╡╤А╨╝╨╡╤А ╨╛╤В╨▓╨╛╨╖╨╕╤В ╨║╨╛╨╖╤Г ╨╜╨░ ╨╜╤Г╨╢╨╜╤Л╨╣ ╨▒╨╡╤А╨╡╨│.
 Human_4 = 1
 Wolf_4 = 0
 Goat_4 = 1
 Cabbage_4 = 0
 
 #╨д╨╡╤А╨╝╨╡╤А ╨▓╨╛╨╖╨▓╤А╨░╤Й╨░╨╡╤В╤Б╤П.
 Human_5 = 0
 Wolf_5 = 0
 Goat_5 = 1
 Cabbage_5 = 0
 
 #╨д╨╡╤А╨╝╨╡╤А ╨╛╤В╨▓╨╛╨╖╨╕╤В ╨║╨░╨┐╤Г╤Б╤В╤Г ╨╜╨░ ╨╜╤Г╨╢╨╜╤Л╨╣ ╨▒╨╡╤А╨╡╨│.
 Human_6 = 1
 Wolf_6 = 0
 Cabbage_6 = 1
 Goat_6 = 1
 
 #╨Ъ╨╗╤О╤З╨╡╨▓╨░╤П ╤З╨░╤Б╤В╤М ╨╛╨┐╨╡╤А╨░╤Ж╨╕╨╕: ╤Д╨╡╤А╨╝╨╡╤А ╨▓╨╛╨╖╨▓╤А╨░╤Й╨░╨╡╤В ╨║╨╛╨╖╤Г ╨╛╨▒╤А╨░╤В╨╜╨╛.
 Human_7 = 0
 Wolf_7 = 0
 Goat_7 = 0
 Cabbage_7 = 1
 
 #╨д╨╡╤А╨╝╨╡╤А ╨╛╤В╨▓╨╛╨╖╨╕╤В ╨▓╨╛╨╗╨║╨░ ╨╜╨░ ╨┤╤А╤Г╨│╨╛╨╣ ╨▒╨╡╤А╨╡╨│, ╨│╨┤╨╡ ╨╛╨╜ ╤В╨╡╨┐╨╡╤А╤М ╨╜╨░╤Е╨╛╨┤╨╕╤В╤Б╤П ╨▓╨╝╨╡╤Б╤В╨╡ ╤Б ╨║╨░╨┐╤Г╤Б╤В╨╛╨╣.
 Human_8 = 1
 Wolf_8 = 1
 Goat_8 = 0
 Cabbage_8 = 1
 
 #╨д╨╡╤А╨╝╨╡╤А ╨▓╨╛╨╖╨▓╤А╨░╤Й╨░╨╡╤В╤Б╤П ╨╖╨░ ╨║╨╛╨╖╨╛╨╣.
 Human_9 = 0
 Wolf_9 = 1
 Goat_9 = 0
 Cabbage_9 = 1
 
 #╨д╨╡╤А╨╝╨╡╤А ╨┐╨╛╨▓╤В╨╛╤А╨╜╨╛ ╨┤╨╛╤Б╤В╨░╨▓╨╗╤П╨╡╤В ╨║╨╛╨╖╤Г ╨╜╨░ ╨╜╤Г╨╢╨╜╤Л╨╣ ╨▒╨╡╤А╨╡╨│ ╨╕ ╨╖╨░╨▓╨╡╤А╤И╨░╤О╤В ╨┐╨╡╤А╨╡╨┐╤А╨░╨▓╤Г.
 Human_10 = 1
 Wolf_10 = 1
 Goat_10 = 1
 Cabbage_10 = 1

рдЕрдм рдкрд░рд┐рд╕реНрдерд┐рддрд┐рд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ рд░ рдХреБрдиреИ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗрд░ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реМрдВред

рдпреЛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рдмреНрд╡рд╛рдБрд╕реЛ рдЬрдбреАрдмреБрдЯреА рджрд┐рдиреЗрдЫреМрдВ, рд░ рдЙрд╕рд▓реЗ рдЧреЛрднреА рдЦрд╛рди рдЪрд╛рд╣рдиреНрдЫред
рдпреЛ рдХреЗрд╕рдорд╛ рддреБрд▓рдирд╛ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЬрд╕рдорд╛ рд╣рд╛рдореНрд░реЛ рд▓рдХреНрд╖реНрдп рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрдиреБ рд╣реЛ рд░ рд╣рд╛рдореАрд▓реЗ рдХреБрдиреИ рдХрдореАрд╣рд░реВ рдЫреИрдирдиреН рднрдиреЗрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

 Safe = [ And( Or(Wolf[i] != Goat[i], Wolf[i] == Human[i]), Or(Goat[i] != Cabbage[i], Goat[i] == Human[i]), Or(Wolf[i] != Cabbage[i], Goat[i] == Human[i])) for i in range(Num) ]

Z3 рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдирд┐рдореНрди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджрд┐рдпреЛ:

 no solution

рдпрд╕рдХреЛ рдорддрд▓рдм рддреНрдпрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡рдорд╛ рдХреБрдиреИ рд╕рдорд╛рдзрд╛рдирд╣рд░реВ рдЫреИрдирдиреНред

рдпрд╕рд░реА, рд╣рд╛рдореАрд▓реЗ рдХрд┐рд╕рд╛рдирдХреЛ рд▓рд╛рдЧрд┐ рдиреЛрдХреНрд╕рд╛рди рдмрд┐рдирд╛ рд╕рд░реНрд╡рднрдХреНрд╖реА рдмреНрд╡рд╛рдБрд╕реЛ рд╕рдВрдЧ рдкрд╛рд░ рдЧрд░реНрди рдЕрд╕рдореНрднрд╡ рдкреНрд░реЛрдЧреНрд░рд╛рдореИрдЯрд┐рдХ рд░реВрдкрдорд╛ рдкреНрд░рдорд╛рдгрд┐рдд рдЧрд░реНрдпреМрдВред

рдпрджрд┐ рд╢реНрд░реЛрддрд╛рд╣рд░реВрд▓реЗ рдпреЛ рд╡рд┐рд╖рдп рдЪрд╛рдЦрд▓рд╛рдЧреНрджреЛ рдкрд╛рдЙрдиреБрднрдпреЛ рднрдиреЗ, рддреНрдпрд╕рдкрдЫрд┐ рднрд╡рд┐рд╖реНрдпрдХрд╛ рд▓реЗрдЦрд╣рд░реВрдорд╛ рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд┐рдзрд┐рд╣рд░реВрд╕рдБрдЧ рдорд┐рд▓реНрджреЛ рд╕рдореАрдХрд░рдгрдорд╛ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд╛ рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд╕рд░реА рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рд░ рдпрд╕рд▓рд╛рдИ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдмрддрд╛рдЙрдиреЗрдЫреБ, рдЬрд╕рд▓реЗ рдЧрд░реНрджрд╛ рд╕рдмреИ рд╡реИрдз рдкрд░рд┐рджреГрд╢реНрдпрд╣рд░реВ рд░ рдХрдордЬреЛрд░реАрд╣рд░реВ рдкреНрд░рдХрдЯ рдЧрд░реНрджрдЫред рдкрд╣рд┐рд▓реЗ, рдПрдЙрдЯреИ рдХрд╛рд░реНрдпрдорд╛, рддрд░ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд░реВрдкрдорд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░рд┐рдпреЛ, рд░ рддреНрдпрд╕рдкрдЫрд┐ рдмрд┐рд╕реНрддрд╛рд░реИ рдпрд╕рд▓рд╛рдИ рдЬрдЯрд┐рд▓ рдмрдирд╛рдЙрдБрджреИ рд░ рд╕рдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕рдХреЛ рд╕рдВрд╕рд╛рд░рдмрд╛рдЯ рд╡рд░реНрддрдорд╛рди рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдорд╛ рд╕рд░реНрджреИред

рдЕрд░реНрдХреЛ рд▓реЗрдЦ рдкрд╣рд┐рд▓реЗ рдиреИ рддрдпрд╛рд░ рдЫ:
рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ: PHP рд░ рдкрд╛рдЗрдердирдорд╛ рдкреНрд░рддреАрдХрд╛рддреНрдордХ VM рд▓реЗрдЦреНрджреИ

рдпрд╕рдорд╛ рдо рд╕рдорд╕реНрдпрд╛рд╣рд░реВрдХреЛ рдФрдкрдЪрд╛рд░рд┐рдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдгрдмрд╛рдЯ рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВрдорд╛ рд╕рд░реНрдЫреБ, рд░ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫреБ
рдХрд╕рд░реА рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рдирд┐рдпрдо рдкреНрд░рдгрд╛рд▓реАрдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди