рдПрдордЖрдИрдЯреА 6.00x рдкрд╛рдареНрдпрдХреНрд░рдо (edx.org) рдкрд░ рдкреНрд░рд╛рдкреНрдд рдЬреНрдЮрд╛рди рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдирд╛

6.002x MITx рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рдкреЛрд╕реНрдЯ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ , рдореБрдЭреЗ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛ - рдХреНрдпрд╛ рд╕реАрдЦрд╛ рдЬреАрд╡рди рдореЗрдВ рдХрд╛рдо рдЖрдпрд╛ред рдФрд░ рдореИрдВрдиреЗ рдЙрддреНрддрд░ рджрд┐рдпрд╛ - рд╣рд╛рдБ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣рд╛рдБ рд╕реБрдмрд╣ рдЕрдкрдиреЗ рджрд╛рдБрдд рдмреНрд░рд╢ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдЖрд░рд╕реА рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХреА ... рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдмреВрдд рдирд╣реАрдВ рдереЗред рддрдм рд╕реЗ рдореИрдВрдиреЗ рджреЛ рдФрд░ рдкрд╛рдареНрдпрдХреНрд░рдо рдкреВрд░реЗ рдХрд░ рд▓рд┐рдП рд╣реИрдВ - UC рдмрд░реНрдХрд▓реЗ CS188.1x рдЖрд░реНрдЯрд┐рдлрд┐рд╢рд┐рдпрд▓ рдЗрдВрдЯреЗрд▓рд┐рдЬреЗрдВрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп (18 рдлрд░рд╡рд░реА рдХреЛ рдкрдВрдЬреАрдХрд░рдг рдЦреБрд▓рд╛) рдФрд░ MITx: 6.00x рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд╛рдЗрдВрд╕ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдкрд░рд┐рдЪрдп ред рдФрд░ рдЕрдЧрд░ CS188.1x рдХреЗ рдмрд╛рдж рдореИрдВ рд╕рд┐рд░реНрдл рднрд╛рд╡рдирд╛рдУрдВ рд╕реЗ рднрд░рд╛ рдерд╛ рдФрд░ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рд╣реМрд╕рд▓реЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЬреНрдЮрд╛рди рдХреЛ рдХреИрд╕реЗ рд░рдЦрд╛ рдЬрд╛рдП ( рдШреЛрдбрд╝реЗ рдХреА рдкреНрд░рдЧрддрд┐ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛), рддреЛ 6.00x рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореБрдЭреЗ рджрд┐рдЦрд╛рд╡рд╛ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓рд╛ред

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

рдЪреАрдиреА рдЪреЗрдХрд░реНрд╕


рдПрдХ рдореИрджрд╛рди рд╣реИ, рдореИрджрд╛рди рдкрд░ рдЪрд┐рдкреНрд╕ рд╣реИрдВред рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЦрд╛рд▓реА рд╣реИред рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдкрдбрд╝реЛрд╕реА рд╕реЗрд▓ рдкрд░ рдПрдХ рдЪреЗрдХрд░ рдЦрд╛рдХрд░, рдЙрд╕ рдкрд░ рдХреВрдж рдХрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рддрд┐рд░рдЫреЗ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрднрд╡ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐:
  ooooooooooooooooред  oooooooooooooooo 

рдирд┐рдореНрди рдЪрд╛рд▓ рд╕рдВрднрд╡ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣:
  ooooooooooooooред  ред  ooooooooooooooooo 

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

рдкрд╛рдареНрдпрдХреНрд░рдореЛрдВ рд╕реЗ рдореИрдВрдиреЗ рдЬрд╛рдирд╛ рдХрд┐ рд╕рднреА рдЦреЛрдЬ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдХреЗрд╡рд▓ рддреАрди рдЙрдкрдХреЗрдВрджреНрд░реЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рднрдЧрд╡рд╛рди, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдореВрд▓ рдмрд╛рддреЗрдВ рд╣реИрдВ):
  1. рдкреНрд░рдгрд╛рд▓реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдПрдирдХреЛрдб рдХрд░реЗрдВ
  2. рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ
  3. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рд╛рдЬреНрдп рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рднреА рдХрд┐рдпрд╛, рд░рд╛рдЬреНрдп рдХреЛрдбрд┐рдВрдЧ рд╕реЗ рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛, рдФрд░ рдЕрдВрддрддрдГ 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 == '.': ##we can move here res += self.getValidMoves(state, idx) idx += 1 return res def getValidMoves(self, state, idx): res = [] ## get North: if idx in [16,17,18,23,24,25,28,29,30,31,32,33,34,37,38,39,44,45]: sN = state[:] if sN[idx-7] == 'o': if sN[idx-14] =='o': sN = sN[0:idx-14]+'.'+sN[idx-13:idx-7]+'.'+sN[idx-6:idx]+'o'+sN[idx+1:] res.append(sN) ## get South: if idx in [2,3,4,9,10,11,14,15,16,17,18,19,20,23,24,25,30,31,32]: sS = state[:] if sS[idx+7] == 'o': if sS[idx+14] =='o': sS = sS[0:idx]+'o'+sS[idx+1:idx+7]+'.'+sS[idx+8:idx+14]+'.'+sS[idx+15:] res.append(sS) ## get West: if idx in [4,11,16,17,18,19,20,23,24,25,26,27,30,31,32,33,34,39,46]: sW = state[:] if sW[idx-1] == 'o': if sW[idx-2] =='o': sW = sW[0:idx-2]+'..o'+sW[idx+1:] res.append(sW) ## get East: if idx in [2,9,14,15,16,17,18,21,22,23,24,25,28,29,30,31,32,37,44]: sE = state[:] if sE[idx+1] == 'o': if sE[idx+2] =='o': sE = sE[:idx]+'o..'+sE[idx+3:] res.append(sE) return res def printState(self, state): res = '' for x in range(7): for y in range(7): res += state[x*7+y]+' ' res+='\r\n' print res 

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣рд╛рдВ рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдЗрдЯрдо 2 рдФрд░ 3 рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рддреЗ рд╣реИрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рд╣рдо рдЧрд┐рдирддреЗ рд╣реИрдВ рдХрд┐ рдмреЛрд░реНрдб рдореЗрдВ рдХрд┐рддрдиреЗ рдЪрд┐рдкреНрд╕ рдмрдЪреЗ рд╣реИрдВ - рдпрджрд┐ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ, рддреЛ рдлрд┐рд░ рд╣рдореЗрдВ рдЕрднреА рднреА рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдорд╛рдиреНрдп рдЕрдЧрд▓реА рдЪрд╛рд▓реЛрдВ рдХреА рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде, рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдиреБрдХрд╕рд╛рди рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рд▓рд╛рдЗрди рдПрдХ-рдЖрдпрд╛рдореА рд╣реИ, рдФрд░ рдмреЛрд░реНрдб рджреЛ-рдЖрдпрд╛рдореА рд╣реИред рдФрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдкрд╛рд╕ рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ред рд╢рд╛рдпрдж рдпрд╣ рднреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдореИрдВ nabydlokodil, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдмрдЪрд╛рд╡ рдореЗрдВ рдореИрдВ рдХрд╣рдирд╛ рд╣реИ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ KISS рд╕рд┐рджреНрдзрд╛рдВрдд, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрддрдирд╛ Habr├й рдкрдврд╝рдиреЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдо рдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рдЬрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдЦрд╛рд▓реА рд╕реЗрд▓ рдкрд░ рд╣рдо рд╕рднреА рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ - рдХреНрдпрд╛ рдЙрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рджреЛ рдЪрд┐рдкреНрд╕ рд╣реИрдВред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрди рдЪрд┐рдкреНрд╕ рдХреЛ рдЦрд╛рд▓реА рд╕реНрдерд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдЦрд╛рд▓реА рд╕реНрдерд╛рди рдХреЛ рдПрдХ рдЪрд┐рдк рдХреЗ рд╕рд╛рдеред рдФрд░ рджреЗ, рдЕрдЧрд▓реЗ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВред
рдХреБрдЫ рдЕрд╡рд▓реЛрдХрди:


рдЗрд╕рд▓рд┐рдП, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд░рд▓ рд╣реЛрдЧрд╛:

 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 ##print arr for row in arr: diag += row[idx] idx += 1 if sum(row) != 6: #print 'row', idx, 'is not 6' return False if diag !=6: #print 'diag 1 is not 6' return False diag = 0 idx = 3 arr = arr.transpose() for row in arr: diag += row[idx] idx -= 1 if sum(row) != 6: #print 'column', idx, 'is not 6' return False if diag != 6: #print 'diag 2 is not 6' return False return True 

рдХреЛрдИ рдирд┐рд░реНрдгрдп рдирд╣реАрдВ рдерд╛ред рдореИрдВрдиреЗ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреМрдбрд╝рд╛рдпрд╛ред рдлрд┐рд░ рдХреЛрдИ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рд╣реБрдЖред рдЕрдЧрд░ рдореИрдВ рдзреВрдореНрд░рдкрд╛рди рдХрд░рддрд╛, рддреЛ рдореИрдВ рдзреВрдореНрд░рдкрд╛рди рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ред рдпрд╣рд╛рдБ рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ред рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЬрд╛рдирд╡рд░ рдмрд▓ рдлрд╛рд░рд╡рд░реНрдбрд░ рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрд╛рдирд╡рд░ рдмрд▓ рдореЗрдВ рдЧрд▓рддреАред рдФрд░ рд╡рд╣ рдЧрд▓рддреА рдвреВрдВрдврдиреЗ рд▓рдЧрд╛ред рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдорд┐рд▓реАред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЙрдлреА рдкреАрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рдЦреЗрд▓рдиреЗ рдЧрдпрд╛ - рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЦреЗрд▓ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдореИрджрд╛рди рдкрд░ рдкреЛрд░реЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рдФрд░ ... рдЯрд░реНрди рдЖрдЙрдЯ! Brutforser рдиреЗ рдЕрдВрдЧреБрд▓реА рдирд╣реАрдВ рдШреБрдорд╛рдИ!
рдУрд╣, рдФрд░ рдпрд╣ рдХреИрд╕рд╛ рд╣реИ, рд▓рд╛рдирдд рд╣реИ, рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП? рдкреБрди: itertools, рд╣рдо рд░реЗрдВрдЬ (6) рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рд╕реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╕реБрдкрд░рд╕реЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдкреЛрд░ рдХреЛ рдШреБрдорд╛рддреЗ рд╣реИрдВред рдУрд╣ рдорд╛рдБред
 ###        allsubsets = lambda n: list(itertools.chain(*[itertools.combinations(range(n), ni) for ni in range(n+1)])) 

 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] #print 'This is subcom of comb #', cmbNum, ':' #print tc for c in itertools.permutations(tc): ''' I here loop through all re-combinations of the same set''' allNum = [] for a in c: allNum+=list(a) arr = pylab.array(allNum).reshape(4,4) if checkArr(arr): print 'Solution:', arr break print 'Solution was not found' 

рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рд╕реЗ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрдЯ рдореЗрдВ "рднрд╛рд░реА рд╣рдбреНрдбрд┐рдпрд╛рдВ" рд╣реИрдВ:
 This is comb # 3 : [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 1), (2, 5)] Solution was not found 

рд▓реЗрдХрд┐рди рдлрд┐рд░, nth рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде, рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ:
  [[реж реж рем реж]
  [рез рек реж рез]
  [рез реи реж рей]
  [рек реж реж реи]] 

Brutforser рдиреЗ рдореБрдЭреЗ рдЫрдХрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдХрд╛рдо рдХрд┐рдпрд╛ред
рдЦреИрд░, рдпрд╣ рд╕рдм рд╣реИред рдЕрдм, рдпрджрд┐ рдЖрдк рдореБрдЭрд╕реЗ рдкреВрдЫреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдореЗрд░реЗ рдЬреАрд╡рди рдореЗрдВ edx рдкрд╛рдареНрдпрдХреНрд░рдо рдХрд╛рдо рдЖрдпреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЧрд░реНрд╡ рд╕реЗ "рд╣рд╛рдБ!" рдХрд╛ рдЙрддреНрддрд░ рджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ рджреВрдВрдЧрд╛ред

Source: https://habr.com/ru/post/In166223/


All Articles