# Codingame Solution: Lumen

Original Problem

THEY put you in a square shape room, with N meters on each side.
THEY want to know everything about you.
THEY are observing you.
THEY placed some candles in the room.

Every candle makes L "light" in the spot they are, and every spot in square shape gets one less "light" as the next ones. If a spot is touched by two candles, it will have the larger "light" it can have. Every spot has the base light of 0.

You can hide only, if you find a dark spot which has 0 "light".
How many dark spots you have?

You will receive a map of the room, with the empty places (X) and Candles (C) in N rows, each character separated by a space.

Example for the light spread N = 5, L = 3:
X X X X X
X C X X X
X X X X X
X X X X X
X X X X X

2 2 2 1 0
2 3 2 1 0
2 2 2 1 0
1 1 1 1 0
0 0 0 0 0
Input
Line 1: An integer N for the length of one side of the room.
Line 2: An integer L for the base light of the candles.
Next N lines: N number of characters (as c), separated by one space.
Output
Line 1 : The number of places with zero light.
Constraints
0 < N <= 25
0 < L < 10

## Solution

We keep a map $$M$$ as a N x N matrix, initialized by zero and add a special light matrix for each C we find in the grid. The light matrix can be created by looping over each cell and add the inverted Chebyshev distance to the place where we found the candle:

def createLight(row, col, n, l):
return np.array([
[max(0, l - max(abs(row - i), abs(col - j)))
for j in range(n)]
for i in range(n)])


What follows is just the frame to read in the data and loop over the matrix

import math
import numpy as np

n, l = map(int, [input(), input()])

M = np.zeros((n, n))

for i in range(n):
line = input().split(" ")
for j in range(len(line)):
if line[j] == "C":
M+= createLight(i, j, n, l)

print(n * n - np.count_nonzero(M))

« Back to problem overview