6.002x MITx рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ
, рдореБрдЭреЗ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛ - рдХреНрдпрд╛ рд╕реАрдЦрд╛ рдЬреАрд╡рди рдореЗрдВ рдХрд╛рдо рдЖрдпрд╛ред рдФрд░ рдореИрдВрдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ - рд╣рд╛рдБ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдБ рд╕реБрдмрд╣ рдЕрдкрдиреЗ рджрд╛рдБрдд рдмреНрд░рд╢ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдЖрд░рд╕реА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреА ... рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдмреВрдд рдирд╣реАрдВ рдереЗред рддрдм рд╕реЗ рдореИрдВрдиреЗ рджреЛ рдФрд░ рдкрд╛рдареНрдпрдХреНрд░рдо рдкреВрд░реЗ рдХрд░ рд▓рд┐рдП рд╣реИрдВ -
UC рдмрд░реНрдХрд▓реЗ CS188.1x рдЖрд░реНрдЯрд┐рдлрд┐рд╢рд┐рдпрд▓ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп (18 рдлрд░рд╡рд░реА рдХреЛ рдкрдВрдЬреАрдХрд░рдг рдЦреБрд▓рд╛) рдФрд░
MITx: 6.00x рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд╛рдЗрдВрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдкрд░рд┐рдЪрдп ред рдФрд░ рдЕрдЧрд░ CS188.1x рдХреЗ рдмрд╛рдж рдореИрдВ рд╕рд┐рд░реНрдл рднрд╛рд╡рдирд╛рдУрдВ рд╕реЗ рднрд░рд╛ рдерд╛ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рд╣реМрд╕рд▓реЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЬреНрдЮрд╛рди рдХреЛ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП (
рдШреЛрдбрд╝реЗ рдХреА рдкреНрд░рдЧрддрд┐ рдХреА
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛), рддреЛ 6.00x рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛ред
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдПрдкрд╕реНрдЯреЛрд░
рдореЗрдВ рдорд╛рдЗрдВрдб рдЧреЗрдо рдХреА рдкрд╣реЗрд▓рд┐рдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИред рдФрд░ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рд░реВрдк рд╕реЗ "рдЪреАрдиреА рдбреНрд░рд╛рдлреНрдЯ" рдХреЗ рд╕реНрддрд░ рдкрд░ рдЕрдЯрдХ рдЧрдпрд╛ред рдЖрдк
рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдПрдХ
рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдм рд╣рдорд╛рд░реА рдкрджреНрдзрддрд┐ рдирд╣реАрдВ рд╣реИред рдЕрдм рд╣рдо рдЦреБрдж рдореВрдВрдЫ рдХреЗ рд╕рд╛рдеред рджреБрдирд┐рдпрд╛ рдлрд┐рд░ рдХрднреА рдПрдХ рдЬреИрд╕реА рдирд╣реАрдВ рд╣реЛрдЧреАред
рдЪреАрдиреА рдЪреЗрдХрд░реНрд╕
рдПрдХ рдореИрджрд╛рди рд╣реИ, рдореИрджрд╛рди рдкрд░ рдЪрд┐рдкреНрд╕ рд╣реИрдВред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЦрд╛рд▓реА рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкрдбрд╝реЛрд╕реА рд╕реЗрд▓ рдкрд░ рдПрдХ рдЪреЗрдХрд░ рдЦрд╛рдХрд░, рдЙрд╕ рдкрд░ рдХреВрдж рдХрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рддрд┐рд░рдЫреЗ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐:
ooooooooooooooooред oooooooooooooooo
рдирд┐рдореНрди рдЪрд╛рд▓ рд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:
ooooooooooooooред ред ooooooooooooooooo
рдирддреАрдЬрддрди, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдХрд╛рдо рд╣реИред рд╣реЗрд╣, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдПрдХ рдлреИрд╕рд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рддреАрди рдорд┐рдирдЯред рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдХрд╕рдХрд░ рдЦрд░реЛрдВрдЪ рджрд┐рдпрд╛ рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдХреНрд░рд┐рдп рд░рдгрдиреАрддрд┐ рдХреЛ рдЬрдиреНрдо рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╕рдорд╕реНрдпрд╛, ****, рд╣рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рд╕реЗ рдореИрдВрдиреЗ рдЬрд╛рдирд╛ рдХрд┐ рд╕рднреА рдЦреЛрдЬ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдХреЗрд╡рд▓ рддреАрди рдЙрдкрдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рднрдЧрд╡рд╛рди, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдореВрд▓ рдмрд╛рддреЗрдВ рд╣реИрдВ):
- рдкреНрд░рдгрд╛рд▓реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдирдХреЛрдб рдХрд░реЗрдВ
- рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ
- рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рд╛рдЬреНрдп рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ
рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛, рд░рд╛рдЬреНрдп рдХреЛрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛, рдФрд░ рдЕрдВрддрддрдГ 49 рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рд▓ рд░реЗрдЦрд╛ рдкрд░ рдмрд╕ рдЧрдпрд╛:
initState = ' ooo '+' ooo '+'ooooooo'+'o..oooo'+'ooooooo'+' ooo '+' ooo '
рдпрд╣ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреАрд╕рд░реЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдзрдордХреА рджреЗрддрд╛ рд╣реИред рдЕрдЪреНрдЫрд╛, рдареАрдХ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рд╕рд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╣рдо рд╕рдорд╕реНрдпрд╛ рд╡рд░реНрдЧ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
class Problem(object): def __init__(self, initState): self.initState = initState def isGoal(self, state): if state.count('o') > 1: return False else: return True def generateSuccessors(self, state): res = [] idx = 0 for c in state: if c == '.':
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЗрдЯрдо 2 рдФрд░ 3 рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЧрд┐рдирддреЗ рд╣реИрдВ рдХрд┐ рдмреЛрд░реНрдб рдореЗрдВ рдХрд┐рддрдиреЗ рдЪрд┐рдкреНрд╕ рдмрдЪреЗ рд╣реИрдВ - рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ, рддреЛ рдлрд┐рд░ рд╣рдореЗрдВ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдорд╛рдиреНрдп рдЕрдЧрд▓реА рдЪрд╛рд▓реЛрдВ рдХреА рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдиреБрдХрд╕рд╛рди рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрди рдПрдХ-рдЖрдпрд╛рдореА рд╣реИ, рдФрд░ рдмреЛрд░реНрдб рджреЛ-рдЖрдпрд╛рдореА рд╣реИред рдФрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдкрд╛рд╕ рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдпрд╣ рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдореИрдВ nabydlokodil, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдореИрдВ рдХрд╣рдирд╛ рд╣реИ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ KISS рд╕рд┐рджреНрдзрд╛рдВрдд, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ Habr├й рдкрдврд╝рдиреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рд▓реА рд╕реЗрд▓ рдкрд░ рд╣рдо рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ - рдХреНрдпрд╛ рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рджреЛ рдЪрд┐рдкреНрд╕ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрди рдЪрд┐рдкреНрд╕ рдХреЛ рдЦрд╛рд▓реА рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреЛ рдПрдХ рдЪрд┐рдк рдХреЗ рд╕рд╛рдеред рдФрд░ рджреЗ, рдЕрдЧрд▓реЗ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВред
рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди:
- рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдореЗрдВ, рд╕рдорд╛рдзрд╛рди рд╣рдореЗрд╢рд╛ рдЧреНрд░рд╛рдл рдХреЗ рдиреАрдЪреЗ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЪреМрдбрд╝рд╛рдИ-рдкрд╣рд▓реА рдЦреЛрдЬ рд╣рдореЗрд╢рд╛ рдпрдерд╛рд╕рдВрднрд╡ рд▓рдВрдмреА рд░рд╣реЗрдЧреАред
- рдЗрд╕ рдХрд╛рд░реНрдп рдореЗрдВ рдкрд┐рдЫрд▓реЗ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЖрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЖрдк рдЧреНрд░рд╛рдл рд▓реВрдк рдХреА рдЬрд╛рдВрдЪ рдХрд░рдХреЗ рднрд╛рдк рд╕реНрдирд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдЧреЗ рджреЗрдЦреЗрдВ, рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ), рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдмрд╕ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рд┐рдЦрд╛рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рдпрд╛
- рд╣реЗрдпреБрд░рд┐рд╕реНрдЯрд┐рдХ рдХреЛ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рд╡рд╣ рдЕрднреА рдирд╣реАрдВ рдЖрдпрд╛ рд╣реИ рдХрд┐рд╕реА рднреА рдХрджрдо рд╕реЗ рдЪрд┐рдкреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ 1. рдХрдореА рдЖрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЪрд┐рдкреНрд╕ рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд┐рддрд┐ рд╕реЗ рд░рд╛рдЬреНрдп рдХреА "рдЕрдЪреНрдЫрд╛рдИ" рдпрд╛ "рдЦрд░рд╛рдмрддрд╛" рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдФрд░ рдпрд╣ nontrivial рд╣реИ
рдЗрд╕рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реЛрдЧрд╛:
def dfs(p): fringe = [[p.initState]] tried = set() while fringe: cur = fringe.pop() tried.add(cur[-1]) for lm in p.generateSuccessors(cur[-1]): if p.isGoal(lm): return cur+[lm] else: if lm not in tried: fringe.append(cur+[lm]) return None
рдпрд╣рд╛рдБ p рдХреНрд▓рд╛рд╕ рдкреНрд░реЙрдмреНрд▓рдо рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ
p = Problem(initState)
рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИ, рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рдЪрд╛рдп рдкреАрдирд╛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВред рдмрд╛рд░рд╣ рд╕рд╛рд▓, рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ 2 ^ 32 рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдЫрд╛рдБрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдореИрдВрдиреЗ рдзреЛрдЦрд╛ рджрд┐рдпрд╛ рдФрд░ рддреБрд░рдВрдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЖрдзреЗ рд╕реЗ рдХрдо рдХрд░ рджрд┐рдпрд╛, рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХрджрдо рдмрдирд╛рдпрд╛ рдФрд░ рдкрд╣рд▓реА рдЪрд╛рд▓ рдХреЗ рдмрд╛рдж рдЪрд┐рдкреНрд╕ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдмреЛрд░реНрдб рдХреЗрдВрджреНрд░реАрдп рд░реВрдк рд╕реЗ рд╕рдордорд┐рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛ рдЪрд╛рд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд░рд╛рдЬреНрдп рд╣реЛрдВрдЧреЗ, рдмреЛрд░реНрдб рдХреЗ рд░реЛрдЯреЗрд╢рди рдХреЛ 90, 180 рдФрд░ 270 рдбрд┐рдЧреНрд░реА рддрдХ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдЖрдЗрдП рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдВ:
def rotateField(field): res = '' for i in range(7): for j in range(7): res += field[7*j+i] return res
...
if lm not in tried: lmr = rotateField(lm) if lmr not in tried: if rotateField(lmr) not in tried: if rotateField(lm) not in tried: fringe.append(cur+[lm])
рдареАрдХ рд╣реИ, рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдХрдИ рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬрдм рдмреЛрд░реНрдб рдкрд░ рдЪрд┐рдкреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рджреВрд░ рд░рд╣рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ:
oooooo
ред ред ред ред ред ред ред
ред ред ред ред ред ред ред
ред ред ред ред ред ред ред
oooooo
def checkDeadCombinations(state): ''' False = dead True - combination is OK''' if '.'*21 in state: if '.' in state[:14] and '.' in state[-15:]: return False if '.'*21 in rotateField(state): if '.' in state[:14] and '.' in state[-15:]: return False
рдЦреИрд░, рдЕрдм рдПрдХ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рдХреНрд╖рдг рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реВрдВрдЧрд╛ рдЬрдм рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ рдХрд░реЗрдЧрд╛ :-)
рдорд╛рд╕реНрдХ
рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рдореЗрд░реА рдкрддреНрдиреА рдХреЛ рдкреНрд░рд╢рдВрд╕рд╛ рдореЗрдВ рд▓рд╛рдпрд╛, рдФрд░ рддреБрд░рдВрдд рдЕрдЧрд▓реЗ рдореЗрдВ рдЦреБрдж рдХреЛ рджрдлрди рдХрд░ рджрд┐рдпрд╛ред рдбреЛрдорд┐рдиреЛрдЬрд╝ рдХрд╛ рдПрдХ рдмреЙрдХреНрд╕ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (28 рдЯреБрдХрдбрд╝реЗ, рдорд╛рдирдХ)ред рдЖрдкрдХреЛ 8 рдкреЛрд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ 4x4 рд╡рд░реНрдЧ рдореЗрдВ рдореЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЪрд╛рд░ рдкреЛрд░ рдХреА рджреЛ рдЦрдбрд╝реА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдорд┐рд▓реЗрдВред
HHHH
HHHH
рдкрдВрдХреНрддрд┐рдпреЛрдВ, рд╕реНрддрдВрднреЛрдВ рдФрд░ рд╡рд┐рдХрд░реНрдгреЛрдВ рдХрд╛ рдпреЛрдЧ рдЫрд╣ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
рдпрд╣рд╛рдВ рдЖрдк рдкреНрд░рддрд┐рдмрдВрдз рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЦреЛрдЬ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЕрднреА рднреА рдпрд╣ рдирд╣реАрдВ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдмрд▓ рдкрд░ рд╣рдорд▓рд╛ рдХрд░реЗрдВрдЧреЗред
рдкреЛрд░ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ:
dices = [] for i in range(7): for j in range(i,7): dices.append((i,j))
рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рдХрд╛рд░ (0,0), (1,0), рдЖрджрд┐ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╢реАрдЯ рд╣реИред рд╣рд░ рдбреЛрдорд┐рдиреЛрдЬрд╝ рдмреЛрди рдХреЗ рд▓рд┐рдПред
рдЪреВрдБрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдпреЛрдЧ рдЫрд╣, рдЪрд╛рд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдХреБрд▓ 24 рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рдкреНрд╕ рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВ рд╡рд╣реАрдВ рдмреИрдард╛ рд░рд╣рд╛, рдЗрди рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдХреЛ рдЪрдХрд┐рдд рдХрд░ рджрд┐рдпрд╛, рдлрд┐рд░ рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рдЕрдЬрдЧрд░ рдореЗрдВ рдмреИрдЯрд░реА рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИ рдФрд░ рдмрд╕ рдпрд╛рдж рдЖрддреА рд╣реИ рдкрд╛рд╡рд░ рдмрдЯрди рдкрд░:
def iterWorkingSets(dices): for cmb in itertools.combinations(dices, 8): ds = 0 for dice in cmb: ds += dice[0] ds += dice[1] if ds == 24: yield cmb
рдирддреАрдЬрддрди, рд╣рдордиреЗ рд╕рднреА рдЕрдВрдЧреБрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рджреЗрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдлрд┐рд░ рдореИрдВрдиреЗ рдмрд╕ рд╕рднреА рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдкреЛрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛, рдЕрдЧрд░ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдерд╛:
def checkArr(arr): diag = 0 idx = 0
рдХреЛрдИ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝рд╛рдпрд╛ред рдлрд┐рд░ рдХреЛрдИ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рд╣реБрдЖред рдЕрдЧрд░ рдореИрдВ рдзреВрдореНрд░рдкрд╛рди рдХрд░рддрд╛, рддреЛ рдореИрдВ рдзреВрдореНрд░рдкрд╛рди рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ред рдпрд╣рд╛рдБ рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ред рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдирд╡рд░ рдмрд▓ рдлрд╛рд░рд╡рд░реНрдбрд░ рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрд╛рдирд╡рд░ рдмрд▓ рдореЗрдВ рдЧрд▓рддреАред рдФрд░ рд╡рд╣ рдЧрд▓рддреА рдвреВрдВрдврдиреЗ рд▓рдЧрд╛ред рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реАред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЙрдлреА рдкреАрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рдЦреЗрд▓рдиреЗ рдЧрдпрд╛ - рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдореИрджрд╛рди рдкрд░ рдкреЛрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдФрд░ ... рдЯрд░реНрди рдЖрдЙрдЯ! Brutforser рдиреЗ рдЕрдВрдЧреБрд▓реА рдирд╣реАрдВ рдШреБрдорд╛рдИ!
рдУрд╣, рдФрд░ рдпрд╣ рдХреИрд╕рд╛ рд╣реИ, рд▓рд╛рдирдд рд╣реИ, рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП? рдкреБрди: itertools, рд╣рдо рд░реЗрдВрдЬ (6) рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рд╕реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕реБрдкрд░рд╕реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдкреЛрд░ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВред рдУрд╣ рдорд╛рдБред
for wc in iterWorkingSets(dices): wc = list(wc) print 'I here loop through all set of dices that produce 24' print 'This is comb #', cmbNum, ':' print wc cmbNum += 1 for turn in allsubsets(6): tc = wc[:] for k in range(6): if k in turn: tc[k] = wc[k][::-1] else: tc[k] = wc[k]
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрдЯ рдореЗрдВ "рднрд╛рд░реА рд╣рдбреНрдбрд┐рдпрд╛рдВ" рд╣реИрдВ:
This is comb
рд▓реЗрдХрд┐рди рдлрд┐рд░, nth рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде, рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ:
[[реж реж рем реж]
[рез рек реж рез]
[рез реи реж рей]
[рек реж реж реи]]
Brutforser рдиреЗ рдореБрдЭреЗ рдЫрдХрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд┐рдпрд╛ред
рдЦреИрд░, рдпрд╣ рд╕рдм рд╣реИред рдЕрдм, рдпрджрд┐ рдЖрдк рдореБрдЭрд╕реЗ рдкреВрдЫреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдЬреАрд╡рди рдореЗрдВ edx рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛рдо рдЖрдпреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЧрд░реНрд╡ рд╕реЗ "рд╣рд╛рдБ!" рдХрд╛ рдЙрддреНрддрд░ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рджреВрдВрдЧрд╛ред