mirror of
https://github.com/InternLM/InternBootcamp.git
synced 2026-04-19 12:58:04 +00:00
127 lines
4.6 KiB
Python
Executable file
127 lines
4.6 KiB
Python
Executable file
from random import randint, randrange, random
|
|
from libs.futoshiki.Futoshiki import FutoshikiPuzzle
|
|
from libs.futoshiki.config import ConfigReader
|
|
from libs.futoshiki.log import output_log
|
|
|
|
rand_puzzle = FutoshikiPuzzle.empty_array_returner(5, 5, 'range')
|
|
creader = ConfigReader()
|
|
config:dict = creader._load_config()
|
|
|
|
class FutoshikiGenerator(FutoshikiPuzzle):
|
|
@staticmethod
|
|
def generate_logic(size, threshold=0.1):
|
|
logic = []
|
|
for j in range(2*size - 1):
|
|
line = []
|
|
# if j is odd then it's an up or down line
|
|
if (j+1) % 2 == 0: # j odd
|
|
for i in range(size):
|
|
a = random()
|
|
if a >= threshold and a <= 1 - threshold:
|
|
line.append('')
|
|
elif a < threshold:
|
|
line.append(u"\u2228")
|
|
elif a > 1 - threshold:
|
|
line.append(u"\u2227")
|
|
else: # Even line
|
|
for i in range(size - 1):
|
|
a = random()
|
|
if a >= threshold and a <= 1 - threshold:
|
|
line.append('')
|
|
elif a < threshold:
|
|
line.append('<')
|
|
elif a > 1 - threshold:
|
|
line.append('>')
|
|
logic.append(line)
|
|
return logic
|
|
|
|
def generate_numbers(self, max_brute_force_level=2):
|
|
self.index += 1
|
|
if config["DEBUG"]:
|
|
print("目前迭代次数 {},最大迭代次数 {}".format(self.index, self.max_iter))
|
|
|
|
# 超过最大迭代次数
|
|
if self.index >= self.max_iter:
|
|
raise StopIteration("超过最大迭代次数,无法生成有效谜题")
|
|
|
|
try:
|
|
self.solve()
|
|
except KeyError:
|
|
# 重新生成逻辑并递归调用
|
|
self.generated_logic = self.generate_logic(self.size)
|
|
return self.generate_numbers(max_brute_force_level)
|
|
|
|
if self.solved:
|
|
if config["DEBUG"]:
|
|
print("Humans can solve this puzzle without numbers:")
|
|
print(self.puzzle_printer(self.solvable_puzzle_numbers, self.puzzle_logic))
|
|
print("正常生成成功")
|
|
return self.solvable_puzzle_numbers, self.puzzle_logic
|
|
else:
|
|
self.brute_force(max_brute_force_level=max_brute_force_level, dlog = self.zzlog)
|
|
if self.solved:
|
|
if config["DEBUG"]:
|
|
print("Found a set of numbers the computer could solve:")
|
|
print(self.puzzle_printer(self.solvable_puzzle_numbers, self.puzzle_logic))
|
|
print("暴力破解生成成功")
|
|
return self.solvable_puzzle_numbers, self.puzzle_logic
|
|
else:
|
|
# 重新生成逻辑并递归调用
|
|
self.generated_logic = self.generate_logic(self.size)
|
|
return self.generate_numbers(max_brute_force_level)
|
|
|
|
|
|
def __init__(self, size,iter_depth ,threshold=None):
|
|
self.size = size
|
|
self.index = 0
|
|
self.max_iter = int(pow(iter_depth,self.size))
|
|
self.generated_logic = self.generate_logic(size)
|
|
self.zzlog = output_log()
|
|
super().__init__(FutoshikiPuzzle.empty_array_returner(size, 1, 0), self.generated_logic,self.zzlog,gen_mode = True)
|
|
|
|
|
|
|
|
|
|
# l = FutoshikiGenerator.generate_logic(5, 0.1)
|
|
# p = FutoshikiPuzzle.empty_array_returner(5, 1, 0)
|
|
# # FutoshikiPuzzle.puzzle_printer(p, l)
|
|
# fp = FutoshikiPuzzle(p, l)
|
|
|
|
def test():
|
|
fp = FutoshikiGenerator(5,config["gen_depth"])
|
|
fp.generate_numbers(1)
|
|
|
|
def generate_futoshiki_puzzle(size: int = 5):
|
|
is_gen_success = False
|
|
puzzle = None
|
|
logic = None
|
|
|
|
while not is_gen_success:
|
|
try:
|
|
fp = FutoshikiGenerator(size, config["gen_depth"])
|
|
result = fp.generate_numbers(1)
|
|
if result:
|
|
puzzle, logic = result
|
|
is_gen_success = True
|
|
except StopIteration as e:
|
|
if config["DEBUG"]:
|
|
print("遇到 StopIteration 异常,重新尝试生成谜题...")
|
|
continue # 捕获异常后重新循环
|
|
except Exception as e:
|
|
print(f"遇到意外错误: {e}")
|
|
break # 避免死循环,退出
|
|
|
|
return puzzle, logic
|
|
|
|
|
|
|
|
# large_fp = FutoshikiGenerator(9, 0.5)
|
|
# large_fp.generate_numbers()
|
|
# all_solved = True
|
|
# while all_solved:
|
|
# fp = FutoshikiGenerator(5)
|
|
# fp.generate_numbers()
|
|
# all_solved = fp.solved
|
|
# if not fp.solved:
|
|
# print("Unable to solve puzzle:")
|
|
# print(fp)
|