mirror of https://github.com/dnomd343/klotski.git
				
				
			
				 3 changed files with 155 additions and 16 deletions
			
			
		| @ -0,0 +1,19 @@ | |||
| #!/usr/bin/env python3 | |||
| 
 | |||
| import json | |||
| 
 | |||
| data_legacy = json.loads(open('legacy.json').read()) | |||
| data_next = json.loads(open('data.json').read()) | |||
| 
 | |||
| assert len(data_legacy) == len(data_next) | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     for info in data_legacy: | |||
|         code = f'{info['code']}00' | |||
|         info_next = data_next[code] | |||
| 
 | |||
|         assert info['min_solution_step'] == info_next['min_step'] | |||
|         assert info['farthest_step'] == info_next['max_step'] | |||
| 
 | |||
|         assert info['min_solution_case'] == sorted([x[:7] for x in info_next['solutions']]) | |||
|         assert info['farthest_case'] == sorted([x[:7] for x in info_next['furthest']]) | |||
| @ -0,0 +1,65 @@ | |||
| #!/usr/bin/env python3 | |||
| 
 | |||
| import re | |||
| import json | |||
| 
 | |||
| 
 | |||
| def split_item(raw: str) -> list[tuple[str, int]]: | |||
|     assert raw[0] == '\n' | |||
|     matched = [re.match(r'^([\dA-F]{9}) \((\d+)\)$', x) for x in raw[1:].splitlines()] | |||
|     return [(x[1], int(x[2]) - 1) for x in matched] | |||
| 
 | |||
| 
 | |||
| def load_file(file_name: str) -> dict[str, dict]: | |||
|     raw = open(file_name).read() | |||
|     assert raw[0] == '[' | |||
|     assert raw[-1] == '\n' | |||
| 
 | |||
|     result = {} | |||
|     for item in raw[1:-1].split('\n['): | |||
|         item = item.split('--------') | |||
|         assert len(item) == 7 | |||
|         assert item[-1] == '' | |||
|         assert item[2] == item[4] | |||
|         assert item[2] == item[5] | |||
|         code = re.match(r'^([\dA-F]{9})]\n$', item[0])[1] | |||
| 
 | |||
|         min_solutions = split_item(item[1]) | |||
|         assert len(min_solutions) in [0, 1] | |||
|         solutions = split_item(item[3]) | |||
|         assert len(set([x[1] for x in solutions])) in [0, 1] | |||
|         assert len(set([x[0] for x in solutions])) == len(solutions) | |||
| 
 | |||
|         if not min_solutions: | |||
|             min_step = -1 | |||
|             assert len(solutions) == 0 | |||
|         else: | |||
|             min_step = solutions[0][1] | |||
|             assert min_solutions[0] in solutions | |||
| 
 | |||
|         furthest = split_item(item[2]) | |||
|         assert len(set([x[1] for x in furthest])) == 1 | |||
|         assert len(set([x[0] for x in furthest])) == len(furthest) | |||
| 
 | |||
|         result[code] = { | |||
|             'min_step': min_step, | |||
|             'max_step': furthest[0][1], | |||
|             'solutions': [x[0] for x in solutions], | |||
|             'furthest': [x[0] for x in furthest], | |||
|         } | |||
|     return result | |||
| 
 | |||
| 
 | |||
| def load_all(files: list[str]) -> dict[str, dict]: | |||
|     data = {} | |||
|     [data.update(load_file(x)) for x in files] | |||
|     data = {x: data[x] for x in sorted(data)} | |||
|     return data | |||
| 
 | |||
| 
 | |||
| if __name__ == '__main__': | |||
|     content = json.dumps(load_all([ | |||
|         'data_149.txt', 'data_154.txt', 'data_159.txt', | |||
|         'data_164.txt', 'data_169.txt', 'data_174.txt' | |||
|     ])) | |||
|     print(content) | |||
					Loading…
					
					
				
		Reference in new issue