Skip to content

Commit 7e1ff35

Browse files
committed
add vec_vec macro
1 parent 0b37646 commit 7e1ff35

9 files changed

+88
-124
lines changed

src/backtracking/all_paths_from_source_to_target.rs

+6-7
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,12 @@ fn dfs(
4949

5050
#[test]
5151
fn test_all_paths_source_target() {
52-
use crate::parse_2d_array;
5352
// 入参graph的数据格式是邻接表,graph[0]表示节点0的连向节点1和节点2
54-
const TEST_CASES: [(&str, &str); 1] = [("[[1,2],[3],[3],[]]", "[[0,1,3],[0,2,3]]")];
55-
for &(input, output) in TEST_CASES.iter() {
56-
assert_eq!(
57-
all_paths_source_target(parse_2d_array(input)),
58-
parse_2d_array(output)
59-
);
53+
let test_cases = vec![(
54+
vec_vec![[1, 2], [3], [3], []],
55+
vec_vec![[0, 1, 3], [0, 2, 3]],
56+
)];
57+
for (input, output) in test_cases.into_iter() {
58+
assert_eq!(all_paths_source_target(input), output);
6059
}
6160
}

src/easy/grid_or_matrix/island_perimeter.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,17 @@ fn island_perimeter(grid: Vec<Vec<i32>>) -> i32 {
2929

3030
#[test]
3131
fn test_island_perimeter() {
32-
const TEST_CASES: [(&str, i32); 1] = [(
33-
"[[0, 1, 0, 0],
34-
[1, 1, 1, 0],
35-
[0, 1, 0, 0],
36-
[1, 1, 0, 0]]",
32+
/*
33+
"[[0, 1, 0, 0],
34+
[1, 1, 1, 0],
35+
[0, 1, 0, 0],
36+
[1, 1, 0, 0]]",
37+
*/
38+
let test_cases = vec![(
39+
vec_vec![[0, 1, 0, 0], [1, 1, 1, 0], [0, 1, 0, 0], [1, 1, 0, 0]],
3740
16,
3841
)];
39-
for &(grid, perimeter) in TEST_CASES.iter() {
40-
assert_eq!(island_perimeter(crate::parse_2d_array(grid)), perimeter);
42+
for (grid, perimeter) in test_cases.into_iter() {
43+
assert_eq!(island_perimeter(grid), perimeter);
4144
}
4245
}

src/easy/grid_or_matrix/rotate_matrix.rs

+6-12
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,12 @@ fn rotate(m: &mut Vec<Vec<i32>>) {
3838

3939
#[test]
4040
fn test_rotate() {
41-
use crate::parse_2d_array;
42-
const TEST_CASES: [(&str, &str); 1] = [(
43-
"[[1,2,3],
44-
[4,5,6],
45-
[7,8,9]]",
46-
"[[7,4,1],
47-
[8,5,2],
48-
[9,6,3]]",
41+
let test_cases = vec![(
42+
vec_vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]],
43+
vec_vec![[7, 4, 1], [8, 5, 2], [9, 6, 3]],
4944
)];
50-
for &(input, output) in TEST_CASES.iter() {
51-
let mut matrix = parse_2d_array(input);
52-
rotate(&mut matrix);
53-
assert_eq!(matrix, parse_2d_array(output));
45+
for (mut input, output) in test_cases.into_iter() {
46+
rotate(&mut input);
47+
assert_eq!(input, output);
5448
}
5549
}

src/easy/grid_or_matrix/spiral_matrix.rs

+14-20
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,18 @@ fn spiral_matrix_1(a: Vec<Vec<i32>>) -> Vec<i32> {
5353

5454
#[test]
5555
fn test_spiral_matrix_1() {
56-
const TEST_CASES: [(&str, &[i32]); 2] = [
56+
let test_cases = vec![
5757
(
58-
"[[1,2,3],
59-
[4,5,6],
60-
[7,8,9]]",
61-
&[1, 2, 3, 6, 9, 8, 7, 4, 5],
58+
vec_vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]],
59+
vec![1, 2, 3, 6, 9, 8, 7, 4, 5],
6260
),
6361
(
64-
"[[1,2,3,4],
65-
[5,6,7,8],
66-
[9,10,11,12]]",
67-
&[1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7],
62+
vec_vec![[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]],
63+
vec![1, 2, 3, 4, 8, 12, 11, 10, 9, 5, 6, 7],
6864
),
6965
];
70-
for &(input, output) in TEST_CASES.iter() {
71-
assert_eq!(spiral_matrix_1(crate::parse_2d_array(input)), output);
66+
for (input, output) in test_cases.into_iter() {
67+
assert_eq!(spiral_matrix_1(input), output);
7268
}
7369
}
7470

@@ -116,15 +112,13 @@ fn spiral_matrix_2(n: i32) -> Vec<Vec<i32>> {
116112
fn test_spiral_matrix_2() {
117113
assert_eq!(
118114
spiral_matrix_2(5),
119-
crate::parse_2d_array(
120-
"[
121-
[1, 2, 3, 4, 5],
122-
[16, 17, 18, 19, 6],
123-
[15, 24, 25, 20, 7],
124-
[14, 23, 22, 21, 8],
125-
[13, 12, 11, 10, 9]
126-
]"
127-
)
115+
vec_vec![
116+
[1, 2, 3, 4, 5],
117+
[16, 17, 18, 19, 6],
118+
[15, 24, 25, 20, 7],
119+
[14, 23, 22, 21, 8],
120+
[13, 12, 11, 10, 9]
121+
]
128122
);
129123
}
130124

src/easy/matrix_diagonal_traverse.rs

+7-18
Original file line numberDiff line numberDiff line change
@@ -139,26 +139,15 @@ fn find_diagonal_order(mat: Vec<Vec<i32>>) -> Vec<i32> {
139139
#[test]
140140
#[should_panic]
141141
fn test_find_diagonal_order() {
142-
const TEST_CASES: [(&str, &[i32]); 3] = [
142+
let test_cases = vec![
143+
(vec_vec![[2, 5], [8, 4], [0, -1]], vec![2, 5, 8, 0, 4, -1]),
143144
(
144-
"[[2,5],
145-
[8,4],
146-
[0,-1]]",
147-
&[2, 5, 8, 0, 4, -1],
148-
),
149-
(
150-
"[[1,2,3],
151-
[4,5,6],
152-
[7,8,9]]",
153-
&[1, 2, 4, 7, 5, 3, 6, 8, 9],
154-
),
155-
(
156-
"[[2,3],
157-
[2,3],",
158-
&[2, 3],
145+
vec_vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]],
146+
vec![1, 2, 4, 7, 5, 3, 6, 8, 9],
159147
),
148+
(vec_vec![[2, 3], [2, 3]], vec![2, 3]),
160149
];
161-
for &(input, output) in TEST_CASES.iter() {
162-
assert_eq!(find_diagonal_order(crate::parse_2d_array(input)), output);
150+
for (input, output) in test_cases.into_iter() {
151+
assert_eq!(find_diagonal_order(input), output);
163152
}
164153
}

src/easy/very_easy.rs

+19-23
Original file line numberDiff line numberDiff line change
@@ -439,16 +439,12 @@ fn reconstruct_queue(mut a: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
439439

440440
#[test]
441441
fn test_reconstruct_queue() {
442-
use crate::parse_2d_array;
443-
const TEST_CASES: [(&str, &str); 1] = [(
444-
"[[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]",
445-
"[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]",
442+
let test_cases = vec![(
443+
vec_vec![[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]],
444+
vec_vec![[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]],
446445
)];
447-
for (input, output) in TEST_CASES.iter() {
448-
assert_eq!(
449-
reconstruct_queue(parse_2d_array(input)),
450-
parse_2d_array(output)
451-
);
446+
for (input, output) in test_cases.into_iter() {
447+
assert_eq!(reconstruct_queue(input), output);
452448
}
453449
}
454450

@@ -1160,13 +1156,13 @@ fn corp_flight_bookings(records: Vec<Vec<i32>>, n: i32) -> Vec<i32> {
11601156

11611157
#[test]
11621158
fn test_corp_flight_bookings() {
1163-
const TEST_CASES: [(&str, i32, &[i32]); 1] =
1164-
[("[[1,2,10],[2,3,20],[2,5,25]]", 5, &[10, 55, 45, 25, 25])];
1165-
for &(records, n, output) in TEST_CASES.iter() {
1166-
assert_eq!(
1167-
corp_flight_bookings(crate::parse_2d_array(records), n),
1168-
output
1169-
);
1159+
let test_cases = vec![(
1160+
vec_vec![[1, 2, 10], [2, 3, 20], [2, 5, 25]],
1161+
5,
1162+
vec![10, 55, 45, 25, 25],
1163+
)];
1164+
for (records, n, output) in test_cases.into_iter() {
1165+
assert_eq!(corp_flight_bookings(records, n), output);
11701166
}
11711167
}
11721168

@@ -1260,9 +1256,8 @@ fn maximum_units(mut box_types: Vec<Vec<i32>>, mut truck_size: i32) -> i32 {
12601256

12611257
#[test]
12621258
fn test_maximum_units() {
1263-
const TEST_CASES: [(&str, i32, i32); 1] = [("[[1,3],[2,2],[3,1]]", 4, 8)];
1264-
for &(box_types, truck_size, max_value) in TEST_CASES.iter() {
1265-
let box_types = crate::parse_2d_array(box_types);
1259+
let test_cases = vec![(vec_vec![[1, 3], [2, 2], [3, 1]], 4, 8)];
1260+
for (box_types, truck_size, max_value) in test_cases.into_iter() {
12661261
assert_eq!(maximum_units(box_types, truck_size), max_value);
12671262
}
12681263
}
@@ -1307,11 +1302,12 @@ fn count_students(students: Vec<i32>, sandwiches: Vec<i32>) -> i32 {
13071302

13081303
#[test]
13091304
fn test_count_students() {
1310-
const TEST_CASES: [(&[i32], &[i32], i32); 1] = [
1311-
(&[1, 1, 1, 0, 0, 1], &[1, 0, 0, 0, 1, 1], 3)
1312-
];
1305+
const TEST_CASES: [(&[i32], &[i32], i32); 1] = [(&[1, 1, 1, 0, 0, 1], &[1, 0, 0, 0, 1, 1], 3)];
13131306
std::mem::size_of_val(&9i32);
13141307
for &(students, sandwiches, n_students_not_eat) in &TEST_CASES {
1315-
assert_eq!(count_students(students.to_vec(), sandwiches.to_vec()), n_students_not_eat);
1308+
assert_eq!(
1309+
count_students(students.to_vec(), sandwiches.to_vec()),
1310+
n_students_not_eat
1311+
);
13161312
}
13171313
}

src/lib.rs

+5-27
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
#![feature(is_sorted, asm)]
2-
#![allow(dead_code)]
2+
#![allow(dead_code, unused_macros)]
33
// #![deny(warnings)]
44
#![doc(html_playground_url = "https://play.rust-lang.org/")]
5+
// 如果mod backtracking写在mod macros上面,则mod backtracking无法使用macros内的所有宏
6+
// Macros can only be used after they have been defined(macro_use)
7+
#[macro_use]
8+
mod macros;
59
mod backtracking;
610
mod bfs;
711
mod binary_search;
@@ -16,29 +20,3 @@ mod random;
1620
mod special_data_structure;
1721
mod string;
1822
mod union_find;
19-
20-
pub fn parse_2d_array(s: &str) -> Vec<Vec<i32>> {
21-
let len = s.len();
22-
let s = &s[1..len - 1];
23-
let mut ret = vec![];
24-
for nums_str in s.split("],") {
25-
let nums_str = nums_str.trim().replace('[', "").replace(']', "");
26-
let mut nums = vec![];
27-
for num in nums_str.split(',') {
28-
if num.is_empty() {
29-
continue;
30-
}
31-
nums.push(num.trim().parse::<i32>().unwrap());
32-
}
33-
ret.push(nums);
34-
}
35-
ret
36-
}
37-
38-
#[test]
39-
fn test_parse_2d_array() {
40-
assert_eq!(
41-
parse_2d_array("[[17,2],[-31],[3],[]]"),
42-
vec![vec![17, 2], vec![-31], vec![3], vec![]]
43-
);
44-
}

src/macros.rs

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/// https://docs.rs/rustgym-util/0.2.4/src/rustgym_util/data.rs.html#2-6
2+
macro_rules! vec_vec {
3+
[$($token_tree:tt),* $(,)?] => {
4+
vec![$(vec!$token_tree),*]
5+
};
6+
}
7+
8+
#[test]
9+
fn test_vec_vec_i32() {
10+
let expected = vec![vec![17, 2], vec![-31], vec![3], vec![]];
11+
assert_eq!(vec_vec![[17, 2], [-31], [3], []], expected);
12+
assert_eq!(vec_vec!([17, 2], [-31], [3], [],), expected);
13+
assert_eq!(vec_vec! {[17,2],[-31],[3],[],}, expected);
14+
}

src/union_find/min_cost_to_connect_all_points.rs

+7-10
Original file line numberDiff line numberDiff line change
@@ -70,16 +70,13 @@ fn min_cost_connect_points(points: Vec<Vec<i32>>) -> i32 {
7070

7171
#[test]
7272
fn test_min_cost_connect_points() {
73-
const TEST_CASES: [(&str, i32); 4] = [
74-
("[[0,0],[2,2],[3,10],[5,2],[7,0]]", 20),
75-
("[[3,12],[-2,5],[-4,1]]", 18),
76-
("[[0,0],[1,1],[1,0],[-1,1]]", 4),
77-
("[[2,-3],[-17,-8],[13,8],[-17,-15]]", 53),
73+
let test_cases = vec![
74+
(vec_vec![[0, 0], [2, 2], [3, 10], [5, 2], [7, 0]], 20),
75+
(vec_vec![[3, 12], [-2, 5], [-4, 1]], 18),
76+
(vec_vec![[0, 0], [1, 1], [1, 0], [-1, 1]], 4),
77+
(vec_vec![[2, -3], [-17, -8], [13, 8], [-17, -15]], 53),
7878
];
79-
for &(points, min_cost) in TEST_CASES.iter() {
80-
assert_eq!(
81-
min_cost_connect_points(crate::parse_2d_array(points)),
82-
min_cost
83-
);
79+
for (points, min_cost) in test_cases.into_iter() {
80+
assert_eq!(min_cost_connect_points(points), min_cost);
8481
}
8582
}

0 commit comments

Comments
 (0)