finish level5/expanding-nebula #6

Merged
seongbeom_park merged 5 commits from level5/expanding-nebula into main 2022-02-18 19:54:01 +00:00
2 changed files with 11 additions and 46 deletions
Showing only changes of commit 2a461d9771 - Show all commits

View File

@ -22,3 +22,8 @@
### escape-pods ### escape-pods
* Completed in: 1 day, 2 hrs, 16 mins, 11 secs. * Completed in: 1 day, 2 hrs, 16 mins, 11 secs.
* Minimum cut * Minimum cut
## Level5
### expanding-nebula
* Completed in: 6 hrs, 49 mins, 26 secs.
* DP & time complexity optimization

View File

@ -1,27 +1,15 @@
import numpy as np import numpy as np
def solution(g): def solution(g):
#print_grid(g)
grid = np.array(g) grid = np.array(g)
#print grid
height, width = grid.shape height, width = grid.shape
#print height, width
prev_cases = {i:1 for i in generate_prev_cases(grid[:,0])} prev_cases = {i:1 for i in generate_prev_cases(grid[:, 0])}
#prev_cases = {i:1 for i in range(2**(len(column)+1))}
#print prev_cases
memo = {} memo = {}
#for i in range(2**(height+1)):
# prev_cases[i] = 1
# memo[i] = {j:calculate_c_column(i, j, height) for j in range(2**(height+1))}
#print memo
#print prev_cases
for column in range(width): for column in range(width):
cases = {} cases = {}
c = list_to_int(grid[:,column]) c = list_to_int(grid[:, column])
#print grid[:,column], list_to_int(grid[:,column])
for i in prev_cases.keys(): for i in prev_cases.keys():
if not i in memo: if not i in memo:
memo[i] = {} memo[i] = {}
@ -32,57 +20,28 @@ def solution(g):
cases[j] = 0 cases[j] = 0
if i in prev_cases: if i in prev_cases:
cases[j] += prev_cases[i] cases[j] += prev_cases[i]
#print cases
prev_cases = cases prev_cases = cases
return sum(prev_cases.values()) return sum(prev_cases.values())
def generate_prev_cases(column): def generate_prev_cases(column):
#print column
if len(column) == 0: if len(column) == 0:
yield 0 yield 0
yield 1 yield 1
else: else:
for v in generate_prev_cases(column[:-1]): for v in generate_prev_cases(column[:-1]):
#print 'v', v
if column[len(column)-1] and v&1 == 1: if column[len(column)-1] and v&1 == 1:
yield v<<1|0 yield v<<1|0
else: else:
yield v<<1|0 yield v<<1|0
yield v<<1|1 yield v<<1|1
#for t in [[True], [False], [True, True], [True, False], [False, True], [False, False]]:
# print 'run', t, list(generate_prev_cases(t))
#exit(0)
def print_grid(g):
for row in g:
line = ""
for elem in row:
if elem:
line+="O"
else:
line+="."
print line
def calculate_c_column(i, j, length): def calculate_c_column(i, j, length):
mask = 2**length-1 mask = 2**length-1
multiple_ones = ((i&j)|((i&j)>>1)) & mask multiple_ones = ((i&j) | ((i&j)>>1)) & mask
odd_ones = ((i^j)^((i^j)>>1)) & mask odd_ones = ((i^j) ^ ((i^j)>>1)) & mask
single_one = (~multiple_ones & odd_ones) & mask single_one = (~multiple_ones & odd_ones) & mask
#print ' '.join(('{:0'+str(length)+'b}').format(k) for k in [i, j]), ' '.join(('{:0'+str(length-1)+'b}').format(k) for k in [multiple_ones, odd_ones, single_one])
return single_one return single_one
#l=3
#memo = {}
#for i in range(2**(l-1)):
# memo[i] = 0
#for i in range(2**l):
# for j in range(2**l):
# t = calculate_c_column(i, j, l)
# memo[t] += 1
#print memo
#exit(0)
def list_to_int(l): def list_to_int(l):
value = 0 value = 0
for v in l: for v in l:
@ -100,7 +59,8 @@ tests = [
([[True, False]], 10), ([[True, False]], 10),
([[False, True]], 10), ([[False, True]], 10),
([[False, False]], 38), ([[False, False]], 38),
#([[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]], 1), # to test time consumption, the answer is not correct
([[True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], [False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]], 1),
] ]
for (i, o) in tests: for (i, o) in tests: