aboutsummaryrefslogtreecommitdiff
path: root/pascals-triangle/src/lib.rs
diff options
context:
space:
mode:
authorFederico Igne <git@federicoigne.com>2020-12-26 15:52:33 +0000
committerFederico Igne <git@federicoigne.com>2021-11-03 18:55:08 +0000
commit7ba7cf729752f1b1ff11a02fd8de6410aa448898 (patch)
tree6bb2d5f3a906512c26d355281ee1341af8269cf2 /pascals-triangle/src/lib.rs
parent727dd03e5e9d2fd62d00fab36c7d277a75849f9b (diff)
downloadexercism-7ba7cf729752f1b1ff11a02fd8de6410aa448898.tar.gz
exercism-7ba7cf729752f1b1ff11a02fd8de6410aa448898.zip
[rust] Pascal's Triangle
Diffstat (limited to 'pascals-triangle/src/lib.rs')
-rw-r--r--pascals-triangle/src/lib.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/pascals-triangle/src/lib.rs b/pascals-triangle/src/lib.rs
new file mode 100644
index 0000000..7b2145b
--- /dev/null
+++ b/pascals-triangle/src/lib.rs
@@ -0,0 +1,34 @@
1#[derive(Debug)]
2pub struct PascalsTriangle {
3 rows: Vec<Vec<u32>>,
4}
5
6impl PascalsTriangle {
7 fn next_row(row: &[u32]) -> Vec<u32> {
8 let mut next = Vec::new();
9 let last = row.iter().fold(0, |p, n| {
10 next.push(p + n);
11 *n
12 });
13 next.push(last);
14 next
15 }
16}
17
18impl PascalsTriangle {
19 pub fn new(row_count: u32) -> Self {
20 let mut rows = Vec::new();
21 if row_count > 0 {
22 rows.push(vec![1]);
23 (1..row_count).for_each(|i| {
24 let irow = Self::next_row(&rows[(i as usize) - 1]);
25 rows.push(irow);
26 })
27 }
28 PascalsTriangle { rows }
29 }
30
31 pub fn rows(&self) -> Vec<Vec<u32>> {
32 self.rows.clone()
33 }
34}