Skip to content

Instantly share code, notes, and snippets.

@doraneko94
Last active July 12, 2019 05:55
Show Gist options
  • Save doraneko94/69a2f680a95a4d82370f3b224d2fd0e5 to your computer and use it in GitHub Desktop.
Save doraneko94/69a2f680a95a4d82370f3b224d2fd0e5 to your computer and use it in GitHub Desktop.
Full search of the game "krypto".
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