Convert this game of life pattern 26$13b2o$14bo$14bobo$15b2o14$31b2o$30b2o$32bo13$46b2o$45b2o$47bo13$61b 2o$60b2o$62bo4$52b2o$52b2o$71bo$66b2ob3o$66bobobo$68bo$67b2o3$76b2o$ 60b3o12b2o10bobo$52b3o7bo14bo8bo2bo4bo$51bo3bo5bo10b2o11b2o5b2o$50bo5b o15bobo8b2o3bo8b2o$51bo3bo11b2o6bo9b2o10b2o$52b3o8b2obo2bo2bo2bo10bo2b o$52bo2bo7b2o2b2o6bo11bobo$53b3o16bobo$53b2obo15b2o$54bobo$55bo3$52b2o 3b2o$52bobobobo$53b5o$54b3o$55bo7$54b2o$54b2o! to a numpy array. Call the function `rle_to_arr(string, h, w)` which should return a numpy array with .shape (h,w). Fill the array with 1s, and empty with 0.
Convert this game of life pattern 26$13b2o$14bo$14bobo$15b2o14$31b2o$30b2o$32bo13$46b2o$45b2o$47bo13$61b 2o$60b2o$62bo4$52b2o$52b2o$71bo$66b2ob3o$66bobobo$68bo$67b2o3$76b2o$ 60b3o12b2o10bobo$52b3o7bo14bo8bo2bo4bo$51bo3bo5bo10b2o11b2o5b2o$50bo5b o15bobo8b2o3bo8b2o$51bo3bo11b2o6bo9b2o10b2o$52b3o8b2obo2bo2bo2bo10bo2b o$52bo2bo7b2o2b2o6bo11bobo$53b3o16bobo$53b2obo15b2o$54bobo$55bo3$52b2o 3b2o$52bobobobo$53b5o$54b3o$55bo7$54b2o$54b2o! to a numpy array. Call the function `rle_to_arr(string, h, w)` which should return a numpy array with .shape (h,w). Fill the array with 1s, and empty with 0.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import numpy as np import re def rle_to_arr(rle_string, h, w): """ Converts a Run-Length Encoded (RLE) string for Conway's Game of Life into a NumPy array. Args: rle_string (str): The RLE string pattern. 'b' = dead cell, 'o' = live cell, '$' = end of line, '!' = end of pattern, numbers indicate run length. h (int): The desired height of the output NumPy array. w (int): The desired width of the output NumPy array. Returns: numpy.ndarray: A NumPy array of shape (h, w) with 1s for live cells and 0s for dead cells. """ arr = np.zeros((h, w), dtype=np.int8) row, col = 0, 0 i = 0 n_str = "" # To accumulate multi-digit run counts while i < len(rle_string): char = rle_string[i] if char.isdigit(): n_str += char i += 1 continue # Keep reading digits # Process the accumulated run count (if any) run_count = 1 if n_str: run_count = int(n_str) n_str = "" # Reset run count string # Process the character ('b', 'o', '$', '!') if char == 'b': # Dead cell col += run_count elif char == 'o': # Live cell # Ensure we don't write past the array width or height if row < h: end_col = min(col + run_count, w) if col < w: # Only write if start col is within bounds arr[row, col:end_col] = 1 col += run_count elif char == '$': # End of line row += run_count col = 0 # Reset column to the beginning of the next line(s) # Stop if we go past the specified height if row >= h: print(f"Warning: Pattern exceeded specified height ({h}). Stopping.") break elif char == '!': # End of pattern break else: # Ignore unexpected characters like spaces or newlines often found in RLE # Or raise an error if strict parsing is needed: # raise ValueError(f"Unexpected character '{char}' at index {i}") pass i += 1 # Move to the next character # Handle potential trailing number if string ends unexpectedly (optional) # if n_str: # print(f"Warning: RLE string ended with unapplied run count '{n_str}'") return arr # --- Example Usage --- rle_pattern = "26$13b2o$14bo$14bobo$15b2o14$31b2o$30b2o$32bo13$46b2o$45b2o$47bo13$61b2o$60b2o$62bo4$52b2o$52b2o$71bo$66b2ob3o$66bobobo$68bo$67b2o3$76b2o$60b3o12b2o10bobo$52b3o7bo14bo8bo2bo4bo$51bo3bo5bo10b2o11b2o5b2o$50bo5bo15bobo8b2o3bo8b2o$51bo3bo11b2o6bo9b2o10b2o$52b3o8b2obo2bo2bo2bo10bo2bo$52bo2bo7b2o2b2o6bo11bobo$53b3o16bobo$53b2obo15b2o$54bobo$55bo3$52b2o3b2o$52bobobobo$53b5o$54b3o$55bo7$54b2o$54b2o!" # Determine appropriate dimensions (can be tricky without metadata) # Let's estimate based on the RLE - looks like height around 100, width around 100 # A safer approach might be to parse once to find max row/col, then create array. # For this example, let's use generous dimensions. height = 110 width = 100 # Remove potential newlines from the string if copied/pasted rle_pattern_clean = "".join(rle_pattern.split()) life_array = rle_to_arr(rle_pattern_clean, height, width) print(f"Created NumPy array with shape: {life_array.shape}") # print("\nArray representation (potentially large):") # print(life_array) # Optional: Verify a known part of the pattern print("\nVerification:") print("First few rows (rows 26-30):") print(life_array[26:31, 10:20]) # Expect nothing in row 26, then 2o, bo, bobo, b2o starting col 13/14/15 print("\nPart of the complex structure (rows 80-85):") print(life_array[80:86, 50:80]) |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | import numpy as np import re def rle_to_arr(rle_string, h, w): """ Converts a Run-Length Encoded (RLE) string for Conway's Game of Life into a NumPy array. Args: rle_string (str): The RLE string pattern. 'b' = dead cell, 'o' = live cell, '$' = end of line, '!' = end of pattern, numbers indicate run length. h (int): The desired height of the output NumPy array. w (int): The desired width of the output NumPy array. Returns: numpy.ndarray: A NumPy array of shape (h, w) with 1s for live cells and 0s for dead cells. """ arr = np.zeros((h, w), dtype=np.int8) row, col = 0, 0 i = 0 n_str = "" # To accumulate multi-digit run counts while i < len(rle_string): char = rle_string[i] if char.isdigit(): n_str += char i += 1 continue # Keep reading digits # Process the accumulated run count (if any) run_count = 1 if n_str: run_count = int(n_str) n_str = "" # Reset run count string # Process the character ('b', 'o', '$', '!') if char == 'b': # Dead cell col += run_count elif char == 'o': # Live cell # Ensure we don't write past the array width or height if row < h: end_col = min(col + run_count, w) if col < w: # Only write if start col is within bounds arr[row, col:end_col] = 1 col += run_count elif char == '$': # End of line row += run_count col = 0 # Reset column to the beginning of the next line(s) # Stop if we go past the specified height if row >= h: print(f"Warning: Pattern exceeded specified height ({h}). Stopping.") break elif char == '!': # End of pattern break else: # Ignore unexpected characters like spaces or newlines often found in RLE # Or raise an error if strict parsing is needed: # raise ValueError(f"Unexpected character '{char}' at index {i}") pass i += 1 # Move to the next character # Handle potential trailing number if string ends unexpectedly (optional) # if n_str: # print(f"Warning: RLE string ended with unapplied run count '{n_str}'") return arr # --- Example Usage --- rle_pattern = "26$13b2o$14bo$14bobo$15b2o14$31b2o$30b2o$32bo13$46b2o$45b2o$47bo13$61b2o$60b2o$62bo4$52b2o$52b2o$71bo$66b2ob3o$66bobobo$68bo$67b2o3$76b2o$60b3o12b2o10bobo$52b3o7bo14bo8bo2bo4bo$51bo3bo5bo10b2o11b2o5b2o$50bo5bo15bobo8b2o3bo8b2o$51bo3bo11b2o6bo9b2o10b2o$52b3o8b2obo2bo2bo2bo10bo2bo$52bo2bo7b2o2b2o6bo11bobo$53b3o16bobo$53b2obo15b2o$54bobo$55bo3$52b2o3b2o$52bobobobo$53b5o$54b3o$55bo7$54b2o$54b2o!" # Determine appropriate dimensions (can be tricky without metadata) # Let's estimate based on the RLE - looks like height around 100, width around 100 # A safer approach might be to parse once to find max row/col, then create array. # For this example, let's use generous dimensions. height = 110 width = 100 # Remove potential newlines from the string if copied/pasted rle_pattern_clean = "".join(rle_pattern.split()) life_array = rle_to_arr(rle_pattern_clean, height, width) print(f"Created NumPy array with shape: {life_array.shape}") # print("\nArray representation (potentially large):") # print(life_array) # Optional: Verify a known part of the pattern print("\nVerification:") print("First few rows (rows 26-30):") print(life_array[26:31, 10:20]) # Expect nothing in row 26, then 2o, bo, bobo, b2o starting col 13/14/15 print("\nPart of the complex structure (rows 80-85):") print(life_array[80:86, 50:80]) |
Running the following program:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | import numpy as np import re def rle_to_arr(rle_string, h, w): """ Converts a Run-Length Encoded (RLE) string for Conway's Game of Life into a NumPy array. Args: rle_string (str): The RLE string pattern. 'b' = dead cell, 'o' = live cell, '$' = end of line, '!' = end of pattern, numbers indicate run length. h (int): The desired height of the output NumPy array. w (int): The desired width of the output NumPy array. Returns: numpy.ndarray: A NumPy array of shape (h, w) with 1s for live cells and 0s for dead cells. """ arr = np.zeros((h, w), dtype=np.int8) row, col = 0, 0 i = 0 n_str = "" # To accumulate multi-digit run counts while i < len(rle_string): char = rle_string[i] if char.isdigit(): n_str += char i += 1 continue # Keep reading digits # Process the accumulated run count (if any) run_count = 1 if n_str: run_count = int(n_str) n_str = "" # Reset run count string # Process the character ('b', 'o', '$', '!') if char == 'b': # Dead cell col += run_count elif char == 'o': # Live cell # Ensure we don't write past the array width or height if row < h: end_col = min(col + run_count, w) if col < w: # Only write if start col is within bounds arr[row, col:end_col] = 1 col += run_count elif char == '$': # End of line row += run_count col = 0 # Reset column to the beginning of the next line(s) # Stop if we go past the specified height if row >= h: print(f"Warning: Pattern exceeded specified height ({h}). Stopping.") break elif char == '!': # End of pattern break else: # Ignore unexpected characters like spaces or newlines often found in RLE # Or raise an error if strict parsing is needed: # raise ValueError(f"Unexpected character '{char}' at index {i}") pass i += 1 # Move to the next character # Handle potential trailing number if string ends unexpectedly (optional) # if n_str: # print(f"Warning: RLE string ended with unapplied run count '{n_str}'") return arr # --- Example Usage --- rle_pattern = "26$13b2o$14bo$14bobo$15b2o14$31b2o$30b2o$32bo13$46b2o$45b2o$47bo13$61b2o$60b2o$62bo4$52b2o$52b2o$71bo$66b2ob3o$66bobobo$68bo$67b2o3$76b2o$60b3o12b2o10bobo$52b3o7bo14bo8bo2bo4bo$51bo3bo5bo10b2o11b2o5b2o$50bo5bo15bobo8b2o3bo8b2o$51bo3bo11b2o6bo9b2o10b2o$52b3o8b2obo2bo2bo2bo10bo2bo$52bo2bo7b2o2b2o6bo11bobo$53b3o16bobo$53b2obo15b2o$54bobo$55bo3$52b2o3b2o$52bobobobo$53b5o$54b3o$55bo7$54b2o$54b2o!" # Determine appropriate dimensions (can be tricky without metadata) # Let's estimate based on the RLE - looks like height around 100, width around 100 # A safer approach might be to parse once to find max row/col, then create array. # For this example, let's use generous dimensions. height = 110 width = 100 # Remove potential newlines from the string if copied/pasted rle_pattern_clean = "".join(rle_pattern.split()) life_array = rle_to_arr(rle_pattern_clean, height, width) print(f"Created NumPy array with shape: {life_array.shape}") # print("\nArray representation (potentially large):") # print(life_array) # Optional: Verify a known part of the pattern print("\nVerification:") print("First few rows (rows 26-30):") print(life_array[26:31, 10:20]) # Expect nothing in row 26, then 2o, bo, bobo, b2o starting col 13/14/15 print("\nPart of the complex structure (rows 80-85):") print(life_array[80:86, 50:80]) answer = (np.array(rle_to_arr(''' 16b2o3b2o$2o$2o$19b2o$17b5o$21bo$17b3o$o16bo$o17b2o$bo16b2o$b2o$3bo$o 17b2o3b2o$2b2o14bobobobo$11bobo5b5o$11b2o7b3o$2o10bo8bo$b2o$b2o2$2o$bo 2$6bobo$2o3bo$bo3bo$o4bo2bo7bo$5b3o7b2o7bo$15bobo5b3o$22b5o$21b2o3b2o$ 22b5o$22b5o$14b2o6bo2bo$14bobo4bo3bo$11b2obobo4bo$11bobobo5bob2o$13bo 8bo$4bobo6b2o$7bo5b3o50bo$7bo5b3o3b2o3b2o40b4o$4bo2bo5b3o3bo5bo41b4o$ 5b3o5b2o35bo16bo2bo$13bo6bo3bo24bobo15b4o4b2o$11bobobo5b3o15b2o7bob2o 14b4o5b2o$11b2obobo21bobo6b2ob2o14bo8b2o$14bobo20bo6b3obob2o$14b2o12b 2o7bo2bo2bo2bo2bobo$28b2o7bo6b2o4bo16bobo$38bobo26b2o$39b2o27bo4b2o$ 21b2o49bo2bo$21b2o28bobo18b3o$52b2o21b2o$52bo21bo$74b2o$59bo$62bo$59bo 14bo$62bo$61bob3o8bo$59b4o2bo9b2o$64bo$52bo$51b2o$40b2o8b2o4b2o5bo$40b 2o7b3o4b2o3bobo$50b2o4b2o2bobo11b2o$4bobo44b2o6bo2bo11b2o$7bo44bo7bobo $o6bo53bobo$o3bo2bo55bo$5b3o5$4b4o$3bo3bo$7bo$3bo2bo3$o2b3o2b2o$2b5o2b o64b3o$9o67bo$9b3o63bo$o7bo2bo$9b2o3$4b2o$o3b3o$o5b2obo5b2o$bo4bo2bo5b 2o$2o4b2obo$o3b3o$4b2o2$59b3o12b2o$61bo12b2o! ''', 101, 77),dtype=np.uint32).flatten() * np.arange(77*101)).sum() expected = 1563304 assert answer == expected, f'Wrong answer; got {answer} instead of {expected}' print('All tests passed') |
Warning: Pattern exceeded specified height (110). Stopping.
Created NumPy array with shape: (110, 100)
Verification:
First few rows (rows 26-30):
[[0 0 0 1 1 0 0 0 0 0]
[0 0 0 0 1 0 0 0 0 0]
[0 0 0 0 1 0 1 0 0 0]
[0 0 0 0 0 1 1 0 0 0]
[0 0 0 0 0 0 0 0 0 0]]
Part of the complex structure (rows 80-85):
[[0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0]]
All tests passed
Testing if the previous output contains the string All tests passed
: True