Last active
July 12, 2019 05:55
-
-
Save doraneko94/69a2f680a95a4d82370f3b224d2fd0e5 to your computer and use it in GitHub Desktop.
Full search of the game "krypto".
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
lst = [11, 10, 22, 10, 25] | |
ans = 1 | |
tolerance = 1e-4 | |
size = len(lst) | |
def n_merge(N): | |
ans = N | |
for i in range(1, N): | |
ans *= i**2 | |
return ans | |
def merge(size, n, ope): | |
pos_num1 = n % size | |
n = n // size | |
pos_num2 = n % (size-1) | |
n = n // (size-1) | |
num1 = calc_lst[size-1][pos_num1] | |
if pos_num1 < size-1: | |
temp = calc_lst[size-1][:pos_num1] + calc_lst[size-1][pos_num1+1:] | |
else: | |
temp = calc_lst[size-1][:pos_num1] | |
num2 = temp[pos_num2] | |
if ope == 0: | |
num = num1 + num2 | |
elif ope == 1: | |
num = num1 - num2 | |
elif ope == 2: | |
num = num1 * num2 | |
else: | |
if num2 == 0: | |
return None | |
num = num1 / num2 | |
if pos_num2 < size - 2: | |
calc_lst[size-2] = [num] + temp[:pos_num2] + temp[pos_num2+1:] | |
else: | |
calc_lst[size-2] = [num] + temp[:pos_num2] | |
return n | |
def merge_show(size, ope, n): | |
pos_num1 = n % size | |
n = n // size | |
pos_num2 = n % (size-1) | |
n = n // (size-1) | |
num1 = string_lst[size-1][pos_num1] | |
if pos_num1 < size-1: | |
temp = string_lst[size-1][:pos_num1] + string_lst[size-1][pos_num1+1:] | |
pri_temp = pri_lst[size-1][:pos_num1] + pri_lst[size-1][pos_num1+1:] | |
else: | |
temp = string_lst[size-1][:pos_num1] | |
pri_temp = pri_lst[size-1][:pos_num1] | |
num2 = temp[pos_num2] | |
if pri_lst[size-1][pos_num1] == 0: | |
num1 = "(" + num1 + ")" | |
if pri_temp[pos_num2] == 0: | |
num2 = "(" + num2 + ")" | |
if ope == 0: | |
num = num1 + "+" + num2 | |
pri = 0 | |
elif ope == 1: | |
num = num1 + "-" + num2 | |
pri = 0 | |
elif ope == 2: | |
num = num1 + "*" + num2 | |
pri = 1 | |
else: | |
num = num1 + "/" + num2 | |
pri = 1 | |
if pos_num2 < size - 2: | |
string_lst[size-2] = [num] + temp[:pos_num2] + temp[pos_num2+1:] | |
pri_lst[size-2] = [pri] + pri_temp[:pos_num2] + pri_temp[pos_num2+1:] | |
else: | |
string_lst[size-2] = [num] + temp[:pos_num2] | |
pri_lst[size-2] = [num] + pri_temp[:pos_num2] | |
return n | |
def show(size, ope_lst, N): | |
for i in range(size-1): | |
N = merge_show(size-i, ope_lst[i], N) | |
return string_lst[0][0] | |
def solve(lst, ans): | |
for N in range(n_merge(size)): | |
for i in range(4**(size-1)): | |
ope_lst = [] | |
ic = i | |
for j in range(size-1): | |
ope_lst.append(ic%4) | |
ic = ic // 4 | |
Nc = N | |
flag = True | |
for j in range(size-1): | |
Nc = merge(size-j, Nc, ope_lst[j]) | |
if Nc is None: | |
flag = False | |
break | |
if flag and calc_lst[0][0] < ans + tolerance and calc_lst[0][0] > ans - tolerance: | |
print(show(size, ope_lst, N)+"="+str(ans)) | |
return | |
print("None.") | |
return | |
for i in range(30): | |
calc_lst = [[0]*i for i in range(1, size)] + [lst] | |
lst_to_str = [str(i) for i in lst] | |
string_lst = [[""]*i for i in range(1, size)] + [lst_to_str] | |
pri_lst = [[1]*i for i in range(1, size+1)] | |
solve(lst, i) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment