You've already forked HeurAMS-legacy
39 lines
1.4 KiB
Python
39 lines
1.4 KiB
Python
from .base import BasePuzzle
|
|
import random
|
|
|
|
class ClozePuzzle(BasePuzzle):
|
|
"""填空题谜题生成器
|
|
|
|
Args:
|
|
text: 原始字符串(需要 delimiter 分割句子, 末尾应有 delimiter)
|
|
min_denominator: 最小概率倒数(如占所有可生成填空数的 1/7 中的 7, 若期望值小于 1, 则取 1)
|
|
"""
|
|
|
|
def __init__(self, text: str, min_denominator: int, delimiter: str = "/"):
|
|
self.text = text
|
|
self.min_denominator = min_denominator
|
|
self.wording = "填空题 - 尚未刷新谜题"
|
|
self.answer = ["填空题 - 尚未刷新谜题"]
|
|
self.delimiter = delimiter
|
|
|
|
def refresh(self): # 刷新谜题
|
|
placeholder = "___SLASH___"
|
|
tmp_text = self.text.replace(self.delimiter, placeholder)
|
|
words = tmp_text.split(placeholder)
|
|
if not words:
|
|
return
|
|
words = [word for word in words if word]
|
|
num_blanks = min(max(1, len(words) // self.min_denominator), len(words))
|
|
indices_to_blank = random.sample(range(len(words)), num_blanks)
|
|
indices_to_blank.sort()
|
|
blanked_words = list(words)
|
|
answer = list()
|
|
for index in indices_to_blank:
|
|
blanked_words[index] = "__" * len(words[index])
|
|
answer.append(words[index])
|
|
self.answer = answer
|
|
self.wording = "".join(blanked_words)
|
|
|
|
def __str__(self):
|
|
return f"{self.wording}\n{str(self.answer)}"
|