เชตเชฐเซ, เชฌเช•เชฐเซ€ เช…เชจเซ‡ เช•เซ‹เชฌเซ€ เชธเชฎเชธเซเชฏเชพเชจเชพ เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช”เชชเชšเชพเชฐเชฟเช• เชšเช•เชพเชธเชฃเซ€

เชฎเชพเชฐเชพ เชฎเชคเซ‡, เช‡เชจเซเชŸเชฐเชจเซ‡เชŸเชจเชพ เชฐเชถเชฟเชฏเชจ-เชญเชพเชทเชพเชจเชพ เช•เซเชทเซ‡เชคเซเชฐเชฎเชพเช‚, เช”เชชเชšเชพเชฐเชฟเช• เชšเช•เชพเชธเชฃเซ€เชจเซ‹ เชตเชฟเชทเชฏ เชชเชฐเซเชฏเชพเชชเซเชค เชฐเซ€เชคเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชจเชฅเซ€, เช…เชจเซ‡ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชธเชฐเชณ เช…เชจเซ‡ เชธเซเชชเชทเซเชŸ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‹ เช…เชญเชพเชต เช›เซ‡.

เชนเซเช‚ เชตเชฟเชฆเซ‡เชถเซ€ เชธเซเชคเซเชฐเซ‹เชคเชฎเชพเช‚เชฅเซ€ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เช†เชชเซ€เชถ, เช…เชจเซ‡ เชจเชฆเซ€เชจเซ€ เชฌเซ€เชœเซ€ เชฌเชพเชœเซ เชตเชฐเซ, เชฌเช•เชฐเซ€ เช…เชจเซ‡ เช•เซ‹เชฌเซ€เชจเซ‡ เชชเชพเชฐ เช•เชฐเชตเชพเชจเซ€ เชœเชพเชฃเซ€เชคเซ€ เชธเชฎเชธเซเชฏเชพ เชฎเชพเชŸเซ‡ เชฎเชพเชฐเซ‹ เชชเซ‹เชคเชพเชจเซ‹ เช‰เช•เซ‡เชฒ เช‰เชฎเซ‡เชฐเซ€เชถ.

เชชเชฐเช‚เชคเซ เชชเซเชฐเชฅเชฎ, เชนเซเช‚ เชŸเซ‚เช‚เช•เชฎเชพเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ€เชถ เช•เซ‡ เช”เชชเชšเชพเชฐเชฟเช• เชšเช•เชพเชธเชฃเซ€ เชถเซเช‚ เช›เซ‡ เช…เชจเซ‡ เชถเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช”เชชเชšเชพเชฐเชฟเช• เชšเช•เชพเชธเชฃเซ€เชจเซ‹ เช…เชฐเซเชฅ เชฅเชพเชฏ เช›เซ‡ เชเช• เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช…เชฅเชตเชพ เชฌเซ€เชœเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชคเชชเชพเชธเชตเซเช‚.

เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช…เชชเซ‡เช•เซเชทเชพ เชฎเซเชœเชฌ เชตเชฐเซเชคเซ‡ เชคเซ‡เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเซเชฐเช•เซเชทเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชœเชฐเซ‚เชฐเซ€ เช›เซ‡.

เช”เชชเชšเชพเชฐเชฟเช• เชšเช•เชพเชธเชฃเซ€ เช เชจเชฌเชณเชพเชˆเช“ เชถเซ‹เชงเชตเชพ เช…เชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชธเซŒเชฅเซ€ เชถเช•เซเชคเชฟเชถเชพเชณเซ€ เชฎเชพเชงเซเชฏเชฎ เช›เซ‡: เชคเซ‡ เชคเชฎเชจเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชฐเชนเซ‡เชฒเชพ เชคเชฎเชพเชฎ เช›เชฟเชฆเซเชฐเซ‹ เช…เชจเซ‡ เชฌเช—เซเชธ เชถเซ‹เชงเชตเชพ เช…เชฅเชตเชพ เชธเชพเชฌเชฟเชค เช•เชฐเชตเชพ เชฆเซ‡ เช›เซ‡ เช•เซ‡ เชคเซ‡เช“ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เชจเชฅเซ€.
เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เช•เซ‡เชŸเชฒเชพเช• เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เช† เช…เชถเช•เซเชฏ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ 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

Num เช เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชชเช—เชฒเชพเช‚เช“เชจเซ€ เชธเช‚เช–เซเชฏเชพ เช›เซ‡. เชฆเชฐเซ‡เช• เชชเช—เชฒเซเช‚ เชจเชฆเซ€, เชนเซ‹เชกเซ€ เช…เชจเซ‡ เชคเชฎเชพเชฎ เชธเช‚เชธเซเชฅเชพเช“เชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซเช‚ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเชคเซเชต เช•เชฐเซ‡ เช›เซ‡.

เชนเชฎเชฃเชพเช‚ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชฐเซ‡เชจเซเชกเชฎ เช…เชจเซ‡ เชฎเชพเชฐเซเชœเชฟเชจ เชธเชพเชฅเซ‡ เชชเชธเช‚เชฆ เช•เชฐเซ€เช, 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹