рд▓рд╛рдВрдбрдЧрд╛, рд╢реЗрд│реА рдЖрдгрд┐ рдХреЛрдмреА рд╕рдорд╕реНрдпреЗрдЪреЗ рдЙрджрд╛рд╣рд░рдг рд╡рд╛рдкрд░реВрди рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди

рдорд╛рдЭреНрдпрд╛ рдорддреЗ, рдЗрдВрдЯрд░рдиреЗрдЯрдЪреНрдпрд╛ рд░рд╢рд┐рдпрди-рднрд╛рд╖реЗрдЪреНрдпрд╛ рдХреНрд╖реЗрддреНрд░рд╛рдд, рдФрдкрдЪрд╛рд░рд┐рдХ рдкрдбрддрд╛рд│рдгреАрдЪрд╛ рд╡рд┐рд╖рдп рдкреБрд░реЗрд╕рд╛ рдХрд╡реНрд╣рд░ рдХреЗрд▓реЗрд▓рд╛ рдирд╛рд╣реА рдЖрдгрд┐ рд╡рд┐рд╢реЗрд╖рддрдГ рд╕рд╛рдзреНрдпрд╛ рдЖрдгрд┐ рд╕реНрдкрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгрд╛рдВрдЪрд╛ рдЕрднрд╛рд╡ рдЖрд╣реЗ.

рдореА рдкрд░рджреЗрд╢реА рд╕реНрддреНрд░реЛрддрд╛рдХрдбреВрди рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдИрди рдЖрдгрд┐ рдирджреАрдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ рд▓рд╛рдВрдбрдЧрд╛, рдмрдХрд░реА рдЖрдгрд┐ рдХреЛрдмреА рдУрд▓рд╛рдВрдбрдгреНрдпрд╛рдЪреНрдпрд╛ рд╕реБрдкреНрд░рд╕рд┐рджреНрдз рд╕рдорд╕реНрдпреЗрд╡рд░ рдорд╛рдЭреЗ рд╕реНрд╡рддрдГрдЪреЗ рд╕рдорд╛рдзрд╛рди рдЬреЛрдбреЗрди.

рдкрд░рдВрддреБ рдкреНрд░рдердо, рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рддреНрдпрд╛рдкрди рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рдЖрдгрд┐ рддреЗ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдпрд╛рдЪреЗ рдореА рдереЛрдбрдХреНрдпрд╛рдд рд╡рд░реНрдгрди рдХрд░реЗрди.

рдФрдкрдЪрд╛рд░рд┐рдХ рдкрдбрддрд╛рд│рдгреА рдореНрд╣рдгрдЬреЗ рд╕рд╛рдорд╛рдиреНрдпрддрдГ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдВрд╡рд╛ рджреБрд╕рд░рд╛ рд╡рд╛рдкрд░реВрди рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рддрдкрд╛рд╕рдгреЗ.

рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдкреЗрдХреНрд╖реЗрдкреНрд░рдорд╛рдгреЗ рд╡рд╛рдЧрддреЛ рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рд╕реБрд░рдХреНрд╖рд┐рддрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

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

рддрдерд╛рдкрд┐, рдХреЛрдгрддреНрдпрд╛рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреАрдд, рддреАрдирдкреИрдХреА рдПрдХ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдИрд▓: рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд░реЛрдмрд░ рдЖрд╣реЗ, рдЪреБрдХреАрдЪрд╛ рдЖрд╣реЗ рдХрд┐рдВрд╡рд╛ рдЙрддреНрддрд░рд╛рдЪреА рдЧрдгрдирд╛ рдХрд░рдгреЗ рд╢рдХреНрдп рдирд╡реНрд╣рддреЗ.

рдЙрддреНрддрд░ рд╢реЛрдзрдгреЗ рдЕрд╢рдХреНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдп рдХрд┐рдВрд╡рд╛ рдирд╛рд╣реА рдЙрддреНрддрд░ рдорд┐рд│рд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА, рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреНрдпрд╛ рдЕрд╕реНрдкрд╖реНрдЯ рднрд╛рдЧрд╛рдВрд╡рд░ рдкреБрдиреНрд╣рд╛ рдХрд╛рдо рдХрд░рдгреЗ, рддреНрдпрд╛рдВрдЪреА рдЕрд▓реНрдЧреЛрд░рд┐рджрдорд┐рдХ рдЬрдЯрд┐рд▓рддрд╛ рдХрдореА рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ.

рдЖрдгрд┐ рдФрдкрдЪрд╛рд░рд┐рдХ рдкрдбрддрд╛рд│рдгреА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╡рд┐рдВрдбреЛрдЬ рдХрд░реНрдирд▓ рдЖрдгрд┐ рдбрд╛рд░реНрдкрд╛ рдбреНрд░реЛрди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдордордзреНрдпреЗ, рдХрдорд╛рд▓ рдкрд╛рддрд│реАрдЪреЗ рд╕рдВрд░рдХреНрд╖рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА.

рдЖрдореНрд╣реА 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 рдордзреНрдпреЗ рд╢реЗрддрдХрд▒реНрдпрд╛рд▓рд╛ рд╢реЗрд│реА рдкрд░рдд рдШреНрдпрд╛рд╡реА рд▓рд╛рдЧреЗрд▓.
рдЖрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЕрдЯрд┐рдХ рдкрджреНрдзрддреАрдиреЗ рд╕реЛрдбрд╡рд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░реВрдпрд╛.

рдЪрд▓рд╛ рд╢реЗрддрдХрд░реА, рд▓рд╛рдВрдбрдЧрд╛, рд╢реЗрд│реА рдЖрдгрд┐ рдХреЛрдмреА рд╣реЗ 4 рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рдореНрд╣рдгреВрди рджрд░реНрд╢рд╡реВ рдЬреЗ рдлрдХреНрдд 0 рдХрд┐рдВрд╡рд╛ 1 рдореВрд▓реНрдп рдШреЗрддрд╛рдд. рд╢реВрдиреНрдп рдореНрд╣рдгрдЬреЗ рддреЗ рдбрд╛рд╡реНрдпрд╛ рдмрд╛рдЬреВрд▓рд╛ рдЖрд╣реЗрдд рдЖрдгрд┐ рдПрдХ рдореНрд╣рдгрдЬреЗ рддреЗ рдЙрдЬрд╡реАрдХрдбреЗ рдЖрд╣реЗрдд.

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

рд╕рдВрдЦреНрдпрд╛ рдореНрд╣рдгрдЬреЗ рд╕реЛрдбрд╡рдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЪрд░рдгрд╛рдВрдЪреА рд╕рдВрдЦреНрдпрд╛. рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдпрд░реА рдирджреА, рдмреЛрдЯ рдЖрдгрд┐ рд╕рд░реНрд╡ рдШрдЯрдХрд╛рдВрдЪреА рд╕реНрдерд┐рддреА рджрд░реНрд╢рд╡рддреЗ.

рдЖрддрд╛рд╕рд╛рдареА, рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдкрдгреЗ рдЖрдгрд┐ рдлрд░рдХрд╛рдиреЗ рдирд┐рд╡рдбреВ рдпрд╛, 10 рдШреНрдпрд╛.

рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ 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 рдЖрдгрд┐ Python рдордзреНрдпреЗ рдкреНрд░рддреАрдХрд╛рддреНрдордХ VM рд▓рд┐рд╣рд┐рдгреЗ

рддреНрдпрд╛рдордзреНрдпреЗ рдореА рд╕рдорд╕реНрдпрд╛рдВрдЪреНрдпрд╛ рдФрдкрдЪрд╛рд░рд┐рдХ рдкрдбрддрд╛рд│рдгреАрдкрд╛рд╕реВрди рдкреНрд░реЛрдЧреНрд░рд╛рдореНрд╕рдХрдбреЗ рдЬрд╛рддреЛ рдЖрдгрд┐ рд╡рд░реНрдгрди рдХрд░рддреЛ
рддреЗ рдЖрдкреЛрдЖрдк рдФрдкрдЪрд╛рд░рд┐рдХ рдирд┐рдпрдо рдкреНрд░рдгрд╛рд▓реАрдВрдордзреНрдпреЗ рдХрд╕реЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд.

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛