2125 - Number of Laser Beams in a Bank
Description (leetcode)
Anti-theft security devices are activated inside a bank. You are given a 0-indexed binary string array bank representing the floor plan of the bank, which is an m x n 2D matrix. bank[i] represents the i^th row, consisting of '0's and '1's. '0' means the cell is empty, while'1' means the cell has a security device.
There is one laser beam between any two security devices if both conditions are met:
- The two devices are located on two different rows:
r_1andr_2, wherer_1 < r_2. - For each row
iwherer_1 < i < r_2, there are no security devices in thei^throw.
Laser beams are independent, i.e., one beam does not interfere nor join with another.
Return the total number of laser beams in the bank.
Example 1:

Input: bank = [“011001”,“000000”,“010100”,“001000”]
Output: 8
Explanation: Between each of the following device pairs, there is one beam. In total, there are 8 beams:
* bank[0][1] – bank[2][1]
* bank[0][1] – bank[2][3]
* bank[0][2] – bank[2][1]
* bank[0][2] – bank[2][3]
* bank[0][5] – bank[2][1]
* bank[0][5] – bank[2][3]
* bank[2][1] – bank[3][2]
* bank[2][3] – bank[3][2]
Note that there is no beam between any device on the 0^th row with any on the 3^rd row.
This is because the 2^nd row contains security devices, which breaks the second condition.
Example 2:

Input: bank = [“000”,“111”,“000”]
Output: 0
Explanation: There does not exist two devices located on two different rows.
Constraints:
m == bank.lengthn == bank[i].length1 <= m, n <= 500bank[i][j]is either'0'or'1'.
submission
// just filter out empty rows
// multiply number of devices for each consecutive rows
// and add them together
impl Solution {
pub fn number_of_beams(bank: Vec<String>) -> i32 {
bank.into_iter()
.map(|row| row.bytes().filter(|&ch| ch == b'1').count() as i32)
.filter(|&cnt| cnt != 0)
.collect::<Vec<i32>>()
.windows(2)
.map(|w| w[0] * w[1])
.sum()
}
}