# import pyodide from pyodide.http import open_url from pyodide.ffi import to_js from js import self, loc, console import sys, random, time, math print(f'loc = {loc}') #loc = loc.split('#') loc = loc.split('-') print(f'loc = {loc}') if len(loc) == 2: URL = f'/et2py/pieces_{loc[0]}/pieces_{loc[1]}.txt' else: URL = f'/et2py/{loc[0]}.txt' fp=open_url(URL) width, height = list(map(int,fp.readline().strip('\n').split(' '))) pieces = dict() piecenum=0 early_pieces = [0]*width*height for line in fp.read().splitlines(): t1 = tuple(map(int,line.split(' '))) for rot in range(4): if t1[rot] == 6 or t1[rot] == 7: early_pieces[piecenum] += 1 pieces[(piecenum,rot)] = t1[-rot:] + t1[:-rot] piecenum += 1 # console.log('early pieces:') # console.log([n+1 for n,v in enumerate(early_pieces) if v==1]) # console.log([n+1 for n,v in enumerate(early_pieces) if v>1]) # console.log(f'total = {sum(early_pieces)}') # early_count = 0 fp.close() placed = [False]*width*height Q = [None]*width*height fit = dict() for key1, val in pieces.items(): key2 = (val[0], val[3], val[1] == 0, val[2] == 0) fit[key2] = fit.get(key2, []) + [key1] for k in fit: random.shuffle(fit[k]) #print(fit) nodes = 0 best = 0 solutions=0 myoutput = '' def myprint(s): global myoutput myoutput += str(s + '\n') #console.log(s) self.postMessage({'output': s}) def print_puzz(): global myoutput piece_res = [] for r in range(height): for c in range(width): i = r*width+c if Q[i] == None: piece_res += [''] edges2 = [-1]*4 else: piece_res += [str(Q[i][0][0][0]+1)] edges = [] for i in range(width*height): if Q[i] == None: continue edges2 = [] for rot in range(4): edges2 += [Q[i][0][1][rot]] edges += [edges2] for i in range(width*height): if placed[i]: continue edges2 = [] for rot in range(4): edges2 += [pieces[(i, 0)][rot]] edges += [edges2] self.postMessage(to_js({'pieces': piece_res, 'edges': edges })) speed_report() def speed_report(): line = f"nodes={nodes} " t = int(time.time())-start_time line += f'time={t} ' line += f'best={best} ' line += f'rate={(nodes//t)//1000}k ' line += f'solutions={solutions} ' line += f'{running} ' self.postMessage(to_js({'status': line })) #myprint(line) funcs = [] for pos in range(width*height+1): r = pos // width c = pos % width src = '' src += 'def cell%d():\n' % pos src += ' # r%d c%d\n' % (r, c) src += ' global nodes, Q, best\n' src += ' \n' if pos == width*height: src += ' global solutions\n' src += ' solutions += 1\n' src += ' best = %d\n' % pos src += ' print_puzz()\n' src += f' return {pos-1}\n' else: #if True: if pos >= (height*width)//3: src += ' if %d > best:\n' % pos src += ' best = %d\n' % pos src += ' print_puzz()\n' # elif pos % (width//2) == 0 and pos <= 96: # #src += ' console.log("%d early_count = %%d" %% early_count)\n' % pos # src += ' if early_count < %d:\n' % [0, 4, 8, 16, 32, 39, 46, 53, 60, 67, 74, 81, 88][pos//8] # src += f' return {pos-1}\n' src += ' if Q[%d] == None:\n' % pos src += ' Q[%d] = [None]\n' % pos if r == 0: up = '0' else: up = 'Q[%d][0][1][2]' % (pos-width) if c == 0: left = '0' else: left = 'Q[%d][0][1][1]' % (pos-1) src += ' for k in fit.get((%s,%s,%s,%s),[]):\n' % (up, left, (c+1 == width), (r+1 == height)) if pos == 119: src += ' if pieces[k][2] != pieces[(138, 0)][0]:\n' src += ' continue\n' if pos < 135: src += ' if k[0] == 138:\n' src += ' continue\n' if pos == 135: src += ' if k != (138, 0):\n' src += ' continue\n' src += ' if placed[k[0]]:\n' src += ' continue\n' src += ' Q[%d] += [(k, pieces[k])]\n' % pos src += ' if Q[%d][0] != None:\n' % pos src += f' p = Q[{pos}][0][0][0]\n' src += ' placed[p] = False\n' #src += ' early_count -= early_pieces[p]\n' src += ' Q[%d] = Q[%d][1:]\n' % (pos, pos) src += ' if len(Q[%d]) > 0:\n' % pos src += f' p = Q[{pos}][0][0][0]\n' src += ' placed[p] = True\n' #src += ' early_count += early_pieces[p]\n' src += ' nodes += 1\n' src += ' if nodes % 400000 == 0:\n' src += ' speed_report()\n' src += ' return %d\n' % (pos+1) src += ' Q[%d] = None\n' % (pos) src += ' return %d\n' % (pos-1) src += 'funcs += [cell%d]' % pos # for i, line in enumerate(src.split('\n')): # console.log('%2d %s' % (i+1, line)) exec(src) pos=0 print('starting', flush=True) start_time = int(time.time()-1) running='Running' while pos >= 0: pos = funcs[pos]() running='Stopped' speed_report()