Skip to content

Instantly share code, notes, and snippets.

@segfo
Last active May 4, 2019 09:05
Show Gist options
  • Save segfo/8f633867930b60d076888324dc43c0ab to your computer and use it in GitHub Desktop.
Save segfo/8f633867930b60d076888324dc43c0ab to your computer and use it in GitHub Desktop.
牛肉豚肉合いびき肉計算機初版
#[derive(Clone)]
struct RatioBuilder{
n:i64,
a_name:Option<String>,
a_ratio:Option<i64>,
b_name:Option<String>,
b_ratio:Option<i64>,
}
impl RatioBuilder{
fn new(n:i64)->Self{
RatioBuilder{
n:n,
a_name:None,
a_ratio:None,
b_name:None,
b_ratio:None
}
}
fn set_corr(&mut self,a_name:&str,b_name:&str,a_ratio:i64,b_ratio:i64)->Self{
let mut s = self.clone();
s.a_name = Some(a_name.to_owned());
s.a_ratio = Some(a_ratio);
s.b_name = Some(b_name.to_owned());
s.b_ratio = Some(b_ratio);
s
}
fn build(&self)->Option<Ratio>{
if self.a_name == None || self.a_ratio == None ||
self.b_name == None || self.b_ratio == None{
return None;
}
Some(
Ratio{
n:self.n,
a_name:self.a_name.clone().unwrap(),
a_ratio:self.a_ratio.unwrap(),
b_name:self.b_name.clone().unwrap(),
b_ratio:self.b_ratio.unwrap()
}
)
}
}
#[derive(Clone)]
struct Ratio{
n:i64,
a_name:String,
a_ratio:i64,
b_name:String,
b_ratio:i64,
}
impl Ratio{
fn calc_impl(&self,p:i64,q:i64)->(i64,String){
let a = self.a_ratio;
let b = self.b_ratio;
let n = self.n;
let x = b*n/(a+b);
// 比率の比較
if b*1000/a < q*1000/p{
// 豚肉を増やす。
(q*(n-x)/p-x,self.b_name.clone())
}else {
// 牛肉を増やす。
(p*x/q-(n-x),self.a_name.clone())
}
}
fn calculate(&self,a_new:i64,b_new:i64)->(Self,i64,String){
let (ans,name) = self.calc_impl(a_new,b_new);
let mut s = self.clone();
s.a_ratio = a_new;
s.b_ratio = b_new;
(s,ans,name)
}
fn get_ratio_string(&self)->String{
format!("{} : {}",self.a_ratio,self.b_ratio)
}
}
fn main() {
let r = RatioBuilder::new(150).set_corr("牛肉", "豚肉", 7,3).build().unwrap();
let array = [
r.calculate(1,1), r.calculate(2,1),r.calculate(3,1),r.calculate(4,1)
,r.calculate(5,1),r.calculate(7,3),r.calculate(1,2),r.calculate(1,3)
,r.calculate(1,4),r.calculate(1,5),r.calculate(3,7)
];
for (ratio_object,ans,name) in array.iter(){
if *ans != 0{
println!("既知の比率({})から、新しい比率({})にするには {} を {} g 追加",r.get_ratio_string(),ratio_object.get_ratio_string(),name,ans);
}else{
println!("追加操作は必要ありません");
}
}
println!("--------");
let r = RatioBuilder::new(150).set_corr("牛肉", "豚肉", 3,7).build().unwrap();
let array = [
r.calculate(1,1), r.calculate(2,1),r.calculate(3,1),r.calculate(4,1)
,r.calculate(5,1),r.calculate(7,3),r.calculate(1,2),r.calculate(1,3)
,r.calculate(1,4),r.calculate(1,5),r.calculate(3,7)
];
for (ratio_object,ans,name) in array.iter(){
if *ans != 0{
println!("既知の比率({})から、新しい比率({})にするには {} を {} g 追加",r.get_ratio_string(),ratio_object.get_ratio_string(),name,ans);
}else{
println!("追加操作は必要ありません");
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment