fix: wrong validations

fix: overflows
This commit is contained in:
Ahmet Kaan GÜMÜŞ 2024-01-15 01:17:17 +03:00
parent ad99a5663d
commit 75f3c7ad60
2 changed files with 112 additions and 10 deletions

View file

@ -6,6 +6,7 @@ edition = "2021"
[profile.release] [profile.release]
strip = "symbols" strip = "symbols"
opt-level = 3 opt-level = 3
overflow-checks = true
lto = true lto = true
[dependencies] [dependencies]

View file

@ -22,10 +22,16 @@ fn main() {
let c:u8 = c.trim().parse().unwrap(); let c:u8 = c.trim().parse().unwrap();
println!("\n\tA = {}\n\tB = {}\n\tC = {}", a,b,c); println!("\n\tA = {}\n\tB = {}\n\tC = {}", a,b,c);
if a <= 0 || b <= 0 || c <= 0
{
println!("Exit: Zero as a Input Invalid");
return;
}
let mut max_needs_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT]; let mut max_needs_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT];
let mut assigned_resources_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT]; let mut assigned_resources_matrix = [[0_u8;RESOURCE_COUNT];PROCESS_COUNT];
let mut info:(bool, Vec<u8>) = (false, Vec::with_capacity(PROCESS_COUNT)); let mut info:(bool, Vec<u8>) = (false, Vec::with_capacity(PROCESS_COUNT));
let mut count:u128 = 0;
while !info.0 while !info.0
{ {
for i in 0..PROCESS_COUNT for i in 0..PROCESS_COUNT
@ -71,7 +77,9 @@ fn main() {
} }
} }
info = banker(a, b, c, max_needs_matrix, assigned_resources_matrix); info = banker(a, b, c, max_needs_matrix, assigned_resources_matrix);
count += 1;
} }
println!("Count = {}", count);
println!("Max Needs Matrix"); println!("Max Needs Matrix");
print_matrix(max_needs_matrix); print_matrix(max_needs_matrix);
println!("Assigned Resources Matrix"); println!("Assigned Resources Matrix");
@ -138,13 +146,47 @@ fn banker(a:u8, b:u8, c:u8, max_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT]
let mut remaining_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT] = [[0;RESOURCE_COUNT];PROCESS_COUNT]; let mut remaining_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT] = [[0;RESOURCE_COUNT];PROCESS_COUNT];
for i in 0..PROCESS_COUNT for i in 0..PROCESS_COUNT
{ {
a_remaing += assigned_resources_matrix[i][0]; match a_remaing.checked_add(assigned_resources_matrix[i][0])
b_remaing += assigned_resources_matrix[i][1]; {
c_remaing += assigned_resources_matrix[i][2]; Some(result) =>
{
a_remaing = result;
}
None =>
{
return (false, vec![]);
}
}
match b_remaing.checked_add(assigned_resources_matrix[i][1])
{
Some(result) =>
{
b_remaing = result;
}
None =>
{
return (false, vec![]);
}
}
match c_remaing.checked_add(assigned_resources_matrix[i][2])
{
Some(result) =>
{
c_remaing = result;
}
None =>
{
return (false, vec![]);
}
}
remaining_needs_matrix[i][0] = max_needs_matrix[i][0] - assigned_resources_matrix[i][0]; remaining_needs_matrix[i][0] = max_needs_matrix[i][0] - assigned_resources_matrix[i][0];
remaining_needs_matrix[i][1] = max_needs_matrix[i][1] - assigned_resources_matrix[i][1]; remaining_needs_matrix[i][1] = max_needs_matrix[i][1] - assigned_resources_matrix[i][1];
remaining_needs_matrix[i][2] = max_needs_matrix[i][2] - assigned_resources_matrix[i][2]; remaining_needs_matrix[i][2] = max_needs_matrix[i][2] - assigned_resources_matrix[i][2];
} }
if a_remaing > a || b_remaing > b || c_remaing > c
{
return (false, vec![]);
}
a_remaing = a - a_remaing; a_remaing = a - a_remaing;
b_remaing = b - b_remaing; b_remaing = b - b_remaing;
c_remaing = c - c_remaing; c_remaing = c - c_remaing;
@ -161,12 +203,72 @@ fn banker(a:u8, b:u8, c:u8, max_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT]
{ {
if a_remaing >= remaining_needs_matrix[i][0] && b_remaing >= remaining_needs_matrix[i][1] && c_remaing >= remaining_needs_matrix[i][2] if a_remaing >= remaining_needs_matrix[i][0] && b_remaing >= remaining_needs_matrix[i][1] && c_remaing >= remaining_needs_matrix[i][2]
{ {
a_remaing -= remaining_needs_matrix[i][0]; match a_remaing.checked_sub(remaining_needs_matrix[i][0])
a_remaing += max_needs_matrix[i][0]; {
b_remaing -= remaining_needs_matrix[i][1]; Some(result) =>
b_remaing += max_needs_matrix[i][1]; {
c_remaing -= remaining_needs_matrix[i][2]; a_remaing = result;
c_remaing += max_needs_matrix[i][2]; }
None =>
{
return (false , vec![]);
}
}
match a_remaing.checked_add(max_needs_matrix[i][0])
{
Some(result) =>
{
a_remaing = result;
}
None =>
{
return (false, vec![]);
}
}
match b_remaing.checked_sub(remaining_needs_matrix[i][1])
{
Some(result) =>
{
b_remaing = result;
}
None =>
{
return (false , vec![]);
}
}
match b_remaing.checked_add(max_needs_matrix[i][1])
{
Some(result) =>
{
b_remaing = result;
}
None =>
{
return (false, vec![]);
}
}
match c_remaing.checked_sub(remaining_needs_matrix[i][2])
{
Some(result) =>
{
c_remaing = result;
}
None =>
{
return (false , vec![]);
}
}
match c_remaing.checked_add(max_needs_matrix[i][2])
{
Some(result) =>
{
c_remaing = result;
}
None =>
{
return (false, vec![]);
}
}
done[i] = true; done[i] = true;
q.push(i as u8); q.push(i as u8);
infinite_detection = 2; infinite_detection = 2;
@ -178,6 +280,5 @@ fn banker(a:u8, b:u8, c:u8, max_needs_matrix:[[u8;RESOURCE_COUNT];PROCESS_COUNT]
return (false, q); return (false, q);
} }
} }
//println!("{}{}{}", a_remaing, b_remaing, c_remaing);
(true, q) (true, q)
} }