From 2fb0703df5743fe1eb9f3794505d9e2353652c3c Mon Sep 17 00:00:00 2001 From: Kento HASEGAWA Date: Thu, 15 Aug 2019 00:23:48 +0900 Subject: [PATCH] Add support for splitting a pattern-repeating problem --- utils/data.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 5 deletions(-) diff --git a/utils/data.py b/utils/data.py index 177f517..c070708 100644 --- a/utils/data.py +++ b/utils/data.py @@ -1,5 +1,6 @@ import datetime import json +import math import os import queue import re @@ -69,6 +70,45 @@ class Problem(object): _text += '\n' return _text + + @property + def group_problem_text(self): + + group_problems = list() + + for g in self.block_groups: + problem_text = '' + num_tiles = 0 + line_remap_list = list() + block_text = '' + for bi, bn in enumerate(g): + b = self.blocks[bn] + num_tiles += b['num_tiles'] + + block_text += f'BLOCK#{bi+1} {b["w"]}X{b["h"]}\n' + + for br in b['cells']: + br_cells = list() + for bc in br: + if isinstance(bc, int) and bc > 0: + if not bc in line_remap_list: + line_remap_list.append(bc) + remapped_index = line_remap_list.index(bc) + 1 + br_cells.append(str(remapped_index)) + else: + br_cells.append(str(bc)) + block_text += ','.join(br_cells) + '\n' + block_text += '\n' + + board_xy = math.ceil(2 * math.sqrt(num_tiles)) + problem_text += f'SIZE {board_xy}X{board_xy}\n' + problem_text += f'BLOCK_NUM {len(g)}\n' + problem_text += '\n' + problem_text += block_text + + group_problems.append(problem_text) + + return group_problems @property def status(self): @@ -133,8 +173,10 @@ class Problem(object): 'index': bi, 'w': bw, 'h': bh, - 'cells': list() + 'cells': list(), + 'num_tiles': 0 } + num_block_tile = 0 for _h in range(bh): li += 1 _l = q_lines[li].strip() @@ -146,7 +188,7 @@ class Problem(object): if not _line_num in line_number_list: line_number_list.append(_line_num) # _line_num = line_number_list.index(_line_num) - tile_num += 1 + num_block_tile += 1 # Make connection list if not bi in block_to_line: @@ -155,9 +197,12 @@ class Problem(object): if not _line_num in line_to_block: line_to_block[_line_num] = list() line_to_block[_line_num].append(bi) + elif _line_num == '+': + num_block_tile += 1 _block_row.append(_line_num) blocks[bi]['cells'].append(_block_row) - # blocks[bi]['cells'].append([intplus(v.strip()) for v in _l.split(',')]) + blocks[bi]['num_tiles'] = num_block_tile + tile_num += num_block_tile li += 1 @@ -171,7 +216,6 @@ class Problem(object): self.problem = q_text self.line_numbers = line_number_list self.connection = (line_to_block, block_to_line) - # self.status = 'Ready' self._analyze_block_groups() @@ -228,7 +272,8 @@ class Problem(object): 'size_str': self.size_str, 'block_num': self.block_num, 'problem': self.problem, - # 'status': self.status + 'group_problems': self.group_problem_text, + 'status': self.status } def get_d3json(self): -- 2.22.0