def generateLine1(line1): if isPrime(line1[0] * 100 + line1[1] * 10 + line1[2]): def generateLine2(line1, line2): if isPrime(line2[0] * 100 + line2[1] * 10 + line2[2]): def generateLine3(line1, line2, line3): if not isPrime(line3[0] * 100 + line3[1] * 10 + line3[2]): return if not isPrime(line1[0] * 100 + line2[0] * 10 + line3[0]): return if not isPrime(line1[1] * 100 + line2[1] * 10 + line3[1]): return if not isPrime(line1[2] * 100 + line2[2] * 10 + line3[2]): return if not isPrime(line1[0] * 100 + line2[1] * 10 + line3[2]): return if not isPrime(line1[2] * 100 + line2[1] * 10 + line3[0]): return # print("{}\n{}\n{}\n".format(line1, line2, line3)) global cnt cnt += 1 hpapply(l, 3, lambda line3: generateLine3(line1, line2, line3)) hpapply(l, 3, lambda line2: generateLine2(line1, line2))
def evalAnAlgorithm(algorithm, max_num=6, length=4, can_repeat=True): # init possible_ans and all_ans possible_ans = [] if can_repeat: hpapply(max_num, length, possible_ans.append) else: papply(max_num, length, possible_ans.append) all_ans = possible_ans.copy() def list2str(l): return ("".join(list(map(str, l)))) def dfs(possible_ans, depth=1): dfs_result = {} ab_cnt = {} print("Waiting algorithm response...") new_guess = algorithm(possible_ans, all_ans) print("Generated guess:", new_guess) for ans in possible_ans: guess_result = scoring(new_guess, ans) ab_cnt[guess_result] = ab_cnt.get(guess_result, []) + [ans] for key in ab_cnt: if key == (length, 0): dfs_result.update({list2str(ab_cnt[key][0]): depth}) else: dfs_result.update(dfs(ab_cnt[key], depth + 1)) return dfs_result result = dfs(possible_ans) return (result)
def generateLine1(line1): if isPrime(line1[0] * 100 + line1[1] * 10 + line1[2]): def generateLine2(line1, line2): if isPrime(line2[0] * 100 + line2[1] * 10 + line2[2]): def generateLine3(line1, line2, line3): if not isPrime(line3[0] * 100 + line3[1] * 10 + line3[2]): return if not isPrime(line1[0] * 100 + line2[0] * 10 + line3[0]): return if not isPrime(line1[1] * 100 + line2[1] * 10 + line3[1]): return if not isPrime(line1[2] * 100 + line2[2] * 10 + line3[2]): return if not isPrime(line1[0] * 100 + line2[1] * 10 + line3[2]): return if not isPrime(line1[2] * 100 + line2[1] * 10 + line3[0]): return # print("{}\n{}\n{}\n".format(line1, line2, line3)) global cnt cnt += 1 hpapply(l, 3, lambda line3: generateLine3(line1, line2, line3)) hpapply(l, 3, lambda line2: generateLine2(line1, line2)) print(timeit.timeit(lambda: hpapply(l, 3, generateLine1), number=1)) print(cnt)
def autoGuess(secret, length=4, can_repeat=False, max_num=10, DEBUG=False): # print("Now tring to guess", secret) # init possible answers possible_ans = [] if can_repeat: hpapply(max_num, length, possible_ans.append) else: papply(max_num, length, possible_ans.append) all_ans = possible_ans.copy() if DEBUG: print("finished init possible_ans", possible_ans) print(len(possible_ans)) # return a filtered result after a guess def possible_ans_filtered_by_a_guess(possibilities, guess, result): return (list( filter(lambda x: scoring(guess, x) == result, possibilities))) # return the min number that an answer can remove from possible answer def eval_a_guess(g): ab_cnt = dict() for ans in possible_ans: guess_result = scoring(g, ans) ab_cnt[guess_result] = ab_cnt.get(guess_result, 0) + 1 if DEBUG: print("evaling", g, "return with", -max(ab_cnt.values())) # print(ab_cnt) # print(max(ab_cnt.values())) # return the group size with max number(negative) return (-max(ab_cnt.values())) # generate a guess by Knuth's algorithm def get_choice(all_ans, possible_ans): best = -len(possible_ans) if best == -1: return possible_ans[0] should_guess = 0 for ans in all_ans: ans_score = eval_a_guess(ans) if ans_score > best: if DEBUG: print("if guess", ans, "the score will be", ans_score, "which is better.") best = ans_score should_guess = ans return (should_guess) def list2str(g): return ("".join(list(map(str, g)))) # start guessing last_res = (0, 0) is_first_guess = True steps = 0 while not last_res == (length, 0): # decide what to guess if is_first_guess: # User may input the first guess last_guess = [0, 0, 0, 0] is_first_guess = False else: last_guess = get_choice(all_ans, possible_ans) steps += 1 last_res = scoring(last_guess, secret) if DEBUG: print("Guessed", last_guess) print("Get result", last_res) # eliminate the possible answers with the last result possible_ans = list( filter(lambda x: scoring(last_guess, x) == last_res, possible_ans)) if DEBUG: print("There are {} answers left.".format(len(possible_ans))) if len(possible_ans) == 0: print("No answers left. Did you input correctly?") return print("Guessing {} used {} steps.".format(secret, steps)) # record the worst situation global worst_steps, hardest_secret if worst_steps < steps: worst_steps = steps hardest_secret = secret print("New record! Guessing {} used {} steps.".format(secret, steps)) global total_steps total_steps += steps