Esempio n. 1
0
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))
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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