From 1985cacb3c3fba6b526cc70cb9d446a8052bcf2f Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Sat, 19 Feb 2022 02:24:51 +0900 Subject: [PATCH 1/5] request level5/expanding-nebula --- level5/expanding-nebula/constraints.txt | 21 +++++++ level5/expanding-nebula/readme.txt | 74 +++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 level5/expanding-nebula/constraints.txt create mode 100644 level5/expanding-nebula/readme.txt diff --git a/level5/expanding-nebula/constraints.txt b/level5/expanding-nebula/constraints.txt new file mode 100644 index 0000000..f201987 --- /dev/null +++ b/level5/expanding-nebula/constraints.txt @@ -0,0 +1,21 @@ +Java +==== +Your code will be compiled using standard Java 8. All tests will be run by calling the solution() method inside the Solution class + +Execution time is limited. + +Wildcard imports and some specific classes are restricted (e.g. java.lang.ClassLoader). You will receive an error when you verify your solution if you have used a blacklisted class. + +Third-party libraries, input/output operations, spawning threads or processes and changes to the execution environment are not allowed. + +Your solution must be under 32000 characters in length including new lines and and other non-printing characters. + +Python +====== +Your code will run inside a Python 2.7.13 sandbox. All tests will be run by calling the solution() function. + +Standard libraries are supported except for bz2, crypt, fcntl, mmap, pwd, pyexpat, select, signal, termios, thread, time, unicodedata, zipimport, zlib. + +Input/output operations are not allowed. + +Your solution must be under 32000 characters in length including new lines and and other non-printing characters. diff --git a/level5/expanding-nebula/readme.txt b/level5/expanding-nebula/readme.txt new file mode 100644 index 0000000..ae023ff --- /dev/null +++ b/level5/expanding-nebula/readme.txt @@ -0,0 +1,74 @@ +Expanding Nebula +================ + +You've escaped Commander Lambda's exploding space station along with numerous escape pods full of bunnies. But -- oh no! -- one of the escape pods has flown into a nearby nebula, causing you to lose track of it. You start monitoring the nebula, but unfortunately, just a moment too late to find where the pod went. However, you do find that the gas of the steadily expanding nebula follows a simple pattern, meaning that you should be able to determine the previous state of the gas and narrow down where you might find the pod. + +From the scans of the nebula, you have found that it is very flat and distributed in distinct patches, so you can model it as a 2D grid. You find that the current existence of gas in a cell of the grid is determined exactly by its 4 nearby cells, specifically, (1) that cell, (2) the cell below it, (3) the cell to the right of it, and (4) the cell below and to the right of it. If, in the current state, exactly 1 of those 4 cells in the 2x2 block has gas, then it will also have gas in the next state. Otherwise, the cell will be empty in the next state. + +For example, let's say the previous state of the grid (p) was: +.O.. +..O. +...O +O... + +To see how this grid will change to become the current grid (c) over the next time step, consider the 2x2 blocks of cells around each cell. Of the 2x2 block of [p[0][0], p[0][1], p[1][0], p[1][1]], only p[0][1] has gas in it, which means this 2x2 block would become cell c[0][0] with gas in the next time step: +.O -> O +.. + +Likewise, in the next 2x2 block to the right consisting of [p[0][1], p[0][2], p[1][1], p[1][2]], two of the containing cells have gas, so in the next state of the grid, c[0][1] will NOT have gas: +O. -> . +.O + +Following this pattern to its conclusion, from the previous state p, the current state of the grid c will be: +O.O +.O. +O.O + +Note that the resulting output will have 1 fewer row and column, since the bottom and rightmost cells do not have a cell below and to the right of them, respectively. + +Write a function solution(g) where g is an array of array of bools saying whether there is gas in each cell (the current scan of the nebula), and return an int with the number of possible previous states that could have resulted in that grid after 1 time step. For instance, if the function were given the current state c above, it would deduce that the possible previous states were p (given above) as well as its horizontal and vertical reflections, and would return 4. The width of the grid will be between 3 and 50 inclusive, and the height of the grid will be between 3 and 9 inclusive. The solution will always be less than one billion (10^9). + +Languages +========= + +To provide a Java solution, edit Solution.java +To provide a Python solution, edit solution.py + +Test cases +========== +Your code should pass the following test cases. +Note that it may also be run against hidden test cases not shown here. + +-- Java cases -- +Input: +Solution.solution({{true, true, false, true, false, true, false, true, true, false}, {true, true, false, false, false, false, true, true, true, false}, {true, true, false, false, false, false, false, false, false, true}, {false, true, false, false, false, false, true, true, false, false}}) +Output: + 11567 + +Input: +Solution.solution({{true, false, true}, {false, true, false}, {true, false, true}}) +Output: + 4 + +Input: +Solution.solution({{true, false, true, false, false, true, true, true}, {true, false, true, false, false, false, true, false}, {true, true, true, false, false, false, true, false}, {true, false, true, false, false, false, true, false}, {true, false, true, false, false, true, true, true}} +Output: + 254 + +-- Python cases -- +Input: +solution.solution([[True, True, False, True, False, True, False, True, True, False], [True, True, False, False, False, False, True, True, True, False], [True, True, False, False, False, False, False, False, False, True], [False, True, False, False, False, False, True, True, False, False]]) +Output: + 11567 + +Input: +solution.solution([[True, False, True], [False, True, False], [True, False, True]]) +Output: + 4 + +Input: +solution.solution([[True, False, True, False, False, True, True, True], [True, False, True, False, False, False, True, False], [True, True, True, False, False, False, True, False], [True, False, True, False, False, False, True, False], [True, False, True, False, False, True, True, True]]) +Output: + 254 + +Use verify [file] to test your solution and see how it does. When you are finished editing your code, use submit [file] to submit your answer. If your solution passes the test cases, it will be removed from your home folder. -- 2.47.2 From 5a389fa439b36d2106520007698bcec8ccc90b78 Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Sat, 19 Feb 2022 02:25:59 +0900 Subject: [PATCH 2/5] first implementation Verifying solution... Test 1 passed! Test 2 passed! Test 3 passed! Test 4 passed! [Hidden] Test 5 passed! [Hidden] Test 6 failed [Hidden] Test 7 passed! [Hidden] * But if trying multiple times, test failed by timeout --- level5/expanding-nebula/solution.py | 85 +++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 level5/expanding-nebula/solution.py diff --git a/level5/expanding-nebula/solution.py b/level5/expanding-nebula/solution.py new file mode 100644 index 0000000..b70b650 --- /dev/null +++ b/level5/expanding-nebula/solution.py @@ -0,0 +1,85 @@ +import numpy as np + +def solution(g): + #print_grid(g) + grid = np.array(g) + #print grid + height, width = grid.shape + #print height, width + + memo = {} + prev_cases = {} + for i in range(2**(height+1)): + prev_cases[i] = 1 + memo[i] = {} + for j in range(2**(height+1)): + memo[i][j] = calculate_c_column(i, j, height) + #print memo + + #print prev_cases + for column in range(width): + cases = {} + for i in range(2**(height+1)): + cases[i] = 0 + #print grid[:,column], list_to_int(grid[:,column]) + for i in range(2**(height+1)): + if prev_cases[i] == 0: + continue + for j in range(2**(height+1)): + if memo[i][j] == list_to_int(grid[:,column]): + cases[j] += prev_cases[i] + #print cases + prev_cases = cases + return sum(prev_cases.values()) + +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): + mask = 2**(length)-1 + multi_ones = ((i&j)|((i&j)>>1)) & mask + odd_ones = ((i^j)^((i^j)>>1)) & mask + single_one = (~multi_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 [multi_ones, odd_ones, 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): + value = 0 + for v in l: + value |= v + value <<= 1 + return value >> 1 + +tests = [ + ([[True, True, False, True, False, True, False, True, True, False], [True, True, False, False, False, False, True, True, True, False], [True, True, False, False, False, False, False, False, False, True], [False, True, False, False, False, False, True, True, False, False]], 11567), + ([[True, False, True], [False, True, False], [True, False, True]], 4), + ([[True, False, True, False, False, True, True, True], [True, False, True, False, False, False, True, False], [True, True, True, False, False, False, True, False], [True, False, True, False, False, False, True, False], [True, False, True, False, False, True, True, True]] ,254), + ([[True]], 4), + ([[False]], 12), + ([[True, True]], 6), + ([[True, False]], 10), + ([[False, True]], 10), + ([[False, False]], 38), + ] + +for (i, o) in tests: + result = solution(i) + print(i, result == o, result, o) -- 2.47.2 From 7abab70efb36c352b60c187b323793eeb581e8ac Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Sat, 19 Feb 2022 03:56:45 +0900 Subject: [PATCH 3/5] optimize memo Verifying solution... All test cases passed. Use submit solution.py to submit your solution --- level5/expanding-nebula/solution.py | 36 +++++++++++++++-------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/level5/expanding-nebula/solution.py b/level5/expanding-nebula/solution.py index b70b650..deda8db 100644 --- a/level5/expanding-nebula/solution.py +++ b/level5/expanding-nebula/solution.py @@ -8,25 +8,26 @@ def solution(g): #print height, width memo = {} - prev_cases = {} - for i in range(2**(height+1)): - prev_cases[i] = 1 - memo[i] = {} - for j in range(2**(height+1)): - memo[i][j] = calculate_c_column(i, j, height) + prev_cases = {i:1 for i in range(2**(height+1))} + #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): cases = {} - for i in range(2**(height+1)): - cases[i] = 0 + c = list_to_int(grid[:,column]) #print grid[:,column], list_to_int(grid[:,column]) - for i in range(2**(height+1)): - if prev_cases[i] == 0: - continue - for j in range(2**(height+1)): - if memo[i][j] == list_to_int(grid[:,column]): + for i in prev_cases.keys(): + if not i in memo: + memo[i] = {} + if not c in memo[i]: + memo[i][c] = [j for j in range(2**(height+1)) if calculate_c_column(i, j, height) == c] + for j in memo[i][c]: + if not j in cases: + cases[j] = 0 + if i in prev_cases: cases[j] += prev_cases[i] #print cases prev_cases = cases @@ -43,11 +44,11 @@ def print_grid(g): print line def calculate_c_column(i, j, length): - mask = 2**(length)-1 - multi_ones = ((i&j)|((i&j)>>1)) & mask + mask = 2**length-1 + multiple_ones = ((i&j)|((i&j)>>1)) & mask odd_ones = ((i^j)^((i^j)>>1)) & mask - single_one = (~multi_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 [multi_ones, odd_ones, single_one]) + 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 #l=3 @@ -78,6 +79,7 @@ tests = [ ([[True, False]], 10), ([[False, True]], 10), ([[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), ] for (i, o) in tests: -- 2.47.2 From 7826b1d40a3802e5fb7a2b6773fddda92034b855 Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Sat, 19 Feb 2022 04:36:51 +0900 Subject: [PATCH 4/5] optimize initial state Verifying solution... All test cases passed. Use submit solution.py to submit your solution --- level5/expanding-nebula/solution.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/level5/expanding-nebula/solution.py b/level5/expanding-nebula/solution.py index deda8db..f2b2521 100644 --- a/level5/expanding-nebula/solution.py +++ b/level5/expanding-nebula/solution.py @@ -6,9 +6,12 @@ def solution(g): #print grid 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 range(2**(len(column)+1))} + #print prev_cases memo = {} - prev_cases = {i:1 for i in range(2**(height+1))} #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))} @@ -33,6 +36,24 @@ def solution(g): prev_cases = cases return sum(prev_cases.values()) +def generate_prev_cases(column): + #print column + if len(column) == 0: + yield 0 + yield 1 + else: + for v in generate_prev_cases(column[:-1]): + #print 'v', v + if column[len(column)-1] and v&1 == 1: + yield v<<1|0 + else: + yield v<<1|0 + 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 = "" -- 2.47.2 From 2a461d9771d423a973d0100059f7b473230a2790 Mon Sep 17 00:00:00 2001 From: Seongbeom Park Date: Sat, 19 Feb 2022 04:49:31 +0900 Subject: [PATCH 5/5] finish level5/expanding-nebula --- README.md | 5 +++ level5/expanding-nebula/solution.py | 52 ++++------------------------- 2 files changed, 11 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 73c6c5f..14b3716 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,8 @@ ### escape-pods * Completed in: 1 day, 2 hrs, 16 mins, 11 secs. * Minimum cut + +## Level5 +### expanding-nebula +* Completed in: 6 hrs, 49 mins, 26 secs. +* DP & time complexity optimization diff --git a/level5/expanding-nebula/solution.py b/level5/expanding-nebula/solution.py index f2b2521..9e787a3 100644 --- a/level5/expanding-nebula/solution.py +++ b/level5/expanding-nebula/solution.py @@ -1,27 +1,15 @@ import numpy as np def solution(g): - #print_grid(g) grid = np.array(g) - #print grid 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 range(2**(len(column)+1))} - #print prev_cases - + prev_cases = {i:1 for i in generate_prev_cases(grid[:, 0])} 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): cases = {} - c = list_to_int(grid[:,column]) - #print grid[:,column], list_to_int(grid[:,column]) + c = list_to_int(grid[:, column]) for i in prev_cases.keys(): if not i in memo: memo[i] = {} @@ -32,57 +20,28 @@ def solution(g): cases[j] = 0 if i in prev_cases: cases[j] += prev_cases[i] - #print cases prev_cases = cases return sum(prev_cases.values()) def generate_prev_cases(column): - #print column if len(column) == 0: yield 0 yield 1 else: for v in generate_prev_cases(column[:-1]): - #print 'v', v if column[len(column)-1] and v&1 == 1: yield v<<1|0 else: yield v<<1|0 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): mask = 2**length-1 - multiple_ones = ((i&j)|((i&j)>>1)) & mask - odd_ones = ((i^j)^((i^j)>>1)) & mask + multiple_ones = ((i&j) | ((i&j)>>1)) & mask + odd_ones = ((i^j) ^ ((i^j)>>1)) & 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 -#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): value = 0 for v in l: @@ -100,7 +59,8 @@ tests = [ ([[True, False]], 10), ([[False, True]], 10), ([[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: -- 2.47.2