solution.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #!/usr/bin/env python3
  2. import sys
  3. import itertools
  4. import os
  5. import time
  6. def print_image(image):
  7. if isinstance(image[0], list):
  8. print('\n'.join([''.join(['#' if p else '.' for p in row]) for row in image]))
  9. else:
  10. print(''.join(['#' if p else '.' for p in image]))
  11. def get_adjacent(x, y):
  12. return list(itertools.chain.from_iterable([[(x + j, y + i) for i in range(-1, 2)] for j in range(-1, 2)]))
  13. def pad_image(image):
  14. width, height = len(image[0]), len(image)
  15. new = [[False for _ in range(width + 2)] for _ in range(height + 2)]
  16. for y in range(height + 2):
  17. for x in range(height + 2):
  18. if x >= 2 and y >= 2:
  19. new[y - 1][x - 1] = image[y - 2][x - 2]
  20. return new
  21. def get_binary_encoding(algorithm, image, x, y):
  22. pixels = [image[a[0]][a[1]] if a[0] >= 0 and a[0] < len(image[0]) and a[1] >= 0 and a[1] < len(image) else False for a in get_adjacent(y, x) ]
  23. binary_list = [2**(len(pixels) - 1 - i) if p else 0 for i, p in enumerate(pixels)]
  24. binary = sum(binary_list)
  25. return algorithm[binary]
  26. def enhance(image):
  27. padded = pad_image(image)
  28. for y in range(len(padded)):
  29. for x in range(len(padded[y])):
  30. padded[y][x] = get_binary_encoding(algorithm, image, x - 1, y - 1)
  31. return padded
  32. # parse input
  33. algorithm = [ True if c == '#' else False for c in input()]
  34. image = []
  35. input()
  36. for line in sys.stdin:
  37. image.append(list(map(lambda x: True if x == '#' else False, [c for c in line.rstrip('\n')])))
  38. # get rounds
  39. rounds = int(sys.argv[1]) if len(sys.argv) > 1 else 2
  40. # render original image
  41. os.system('cls' if os.name == 'nt' else 'clear')
  42. print('converting')
  43. finally_padded_original = image
  44. for _ in range(rounds):
  45. finally_padded_original = pad_image(finally_padded_original)
  46. print_image(finally_padded_original)
  47. time.sleep(2)
  48. # compute image enhancements
  49. for i in range(rounds):
  50. # clear
  51. os.system('cls' if os.name == 'nt' else 'clear')
  52. # make actual computation
  53. image = enhance(image)
  54. # render image by padding it
  55. finally_padded_enhanced = image
  56. for _ in range(rounds - i - 1):
  57. finally_padded_enhanced = pad_image(finally_padded_enhanced)
  58. # output
  59. print(f'to (round {i + 1})')
  60. print_image(finally_padded_enhanced)
  61. time.sleep(.25)
  62. print(f'{sum([sum([1 for p in row if p]) for row in image])} pixels are lit after {rounds} rounds')