同学帮他侄儿问我一个问题:
资源:
1、小明的钱可以购买50瓶汽水。
2、老板搞促销,两个空汽水瓶子可以换一瓶汽水。
问:小明最多能喝多少瓶汽水?
开始还楞了一下, 现在的小学题目还真不简单。不过马上给出答案:
先是50瓶,然后用50个空瓶换来25瓶,喝完后用25个空瓶换12瓶再多个空瓶,
喝完后用13个空瓶换6瓶,然后是7个空瓶换3瓶,然后是4个空瓶换2瓶,
然后是2个空瓶换1瓶,最后问老板借1个空瓶,再用2个空瓶换1瓶,
剩下来那个空瓶还给老板。所以喝到50+25+12+6+3+2+1+1=100
不过最近在学习规则引擎, 自然就想到了怎么用规则引擎来实现。
我的想法是:
1: 假设汽水一元一瓶, 则小明最初由50元。
2: 如果兜里有超过一元钱, 则买一瓶汽水喝, 此时:
钱减少一元,同时拥有的空瓶增加一个。
3: 如果拥有至少两个空瓶, 则两个空瓶卖给老板, 兜里的钱加一。
根据如上想法, 有了如下Drool的实现。
java文件SodaWater.java:
rule文件:
运行结果如下:
Customer XiaoMing now buy a soda water and drink: money=49 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=49, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=47 and blankCup=2
...
Customer XiaoMing now buy a soda water and drink: money=1 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=1, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=1
Customer XiaoMing finished drink, and drink number is 99 blankCup=1
不过小明最后手上还有最后一个瓶子, 计算机只能到此了。
向老板借一个瓶子换一瓶汽水,喝完在还一个空瓶子,估计就是人类智慧来。
此程序需要drools的jar包,具体可见:
http://lcllcl987.iteye.com/blog/254381
资源:
1、小明的钱可以购买50瓶汽水。
2、老板搞促销,两个空汽水瓶子可以换一瓶汽水。
问:小明最多能喝多少瓶汽水?
开始还楞了一下, 现在的小学题目还真不简单。不过马上给出答案:
先是50瓶,然后用50个空瓶换来25瓶,喝完后用25个空瓶换12瓶再多个空瓶,
喝完后用13个空瓶换6瓶,然后是7个空瓶换3瓶,然后是4个空瓶换2瓶,
然后是2个空瓶换1瓶,最后问老板借1个空瓶,再用2个空瓶换1瓶,
剩下来那个空瓶还给老板。所以喝到50+25+12+6+3+2+1+1=100
不过最近在学习规则引擎, 自然就想到了怎么用规则引擎来实现。
我的想法是:
1: 假设汽水一元一瓶, 则小明最初由50元。
2: 如果兜里有超过一元钱, 则买一瓶汽水喝, 此时:
钱减少一元,同时拥有的空瓶增加一个。
3: 如果拥有至少两个空瓶, 则两个空瓶卖给老板, 兜里的钱加一。
根据如上想法, 有了如下Drool的实现。
java文件SodaWater.java:
- packageorg.drools.examples;
- importjava.io.InputStreamReader;
- importjava.io.Reader;
- importorg.drools.FactHandle;
- importorg.drools.RuleBase;
- importorg.drools.RuleBaseFactory;
- importorg.drools.StatefulSession;
- importorg.drools.WorkingMemory;
- importorg.drools.compiler.PackageBuilder;
- importorg.drools.rule.Package;
- publicclassSodaWater
- {
- publicstaticfinalvoidmain(String[]args)throwsException{
- finalPackageBuilderbuilder=newPackageBuilder();
- builder.addPackageFromDrl(newInputStreamReader(SodaWater.class.getResourceAsStream("SodaWater.drl")));
- finalRuleBaseruleBase=RuleBaseFactory.newRuleBase();
- ruleBase.addPackage(builder.getPackage());
- finalStatefulSessionsession=ruleBase.newStatefulSession();
- Customercustomer=newCustomer("XiaoMing",50);
- session.insert(customer);
- session.fireAllRules();
- }
- publicstaticclassCustomer
- {
- privateStringname;
- privateintmoney;
- privateintdrinkSum;
- privateintblankCup;
- publicCustomer(Stringname,intmoney)
- {
- this.name=name;
- this.money=money;
- this.drinkSum=0;
- this.blankCup=0;
- }
- publicintgetMoney()
- {
- returnmoney;
- }
- publicvoidsetMoney(intmoney)
- {
- this.money=money;
- }
- publicintgetBlankCup()
- {
- returnblankCup;
- }
- publicvoidsetBlankCup(intblankCup)
- {
- this.blankCup=blankCup;
- }
- publicintgetDrinkSum()
- {
- returndrinkSum;
- }
- publicvoidsetDrinkSum(intdrinkSum)
- {
- this.drinkSum=drinkSum;
- }
- publicStringgetName()
- {
- returnname;
- }
- publicvoidsetName(Stringname)
- {
- this.name=name;
- }
- }
- }
- packageorg.drools.examples
- dialect"mvel"
- importorg.drools.examples.SodaWater.Customer
- rule"buyasodawateranddrink"
- when
- $c:Customer(money>0,$m:money,$b:blankCup,$d:drinkSum)
- then
- $c.money=$m-1;
- $c.blankCup=$b+1;
- $c.drinkSum=$d+1;
- System.out.println("Customer"+$c.name+"nowbuyasodawateranddrink:money="+$c.money+"andblankCup="+$c.blankCup);
- update($c);
- end
- rule"saleblankcupandgetmoney"
- when
- $c:Customer(blankCup>1,$b:blankCup,$m:money)
- then
- $c.blankCup=$b-2;
- $c.money=$m+1;
- System.out.println("Customer"+$c.name+"nowsale2cupsandgetmoney:money="+$c.money+",blankCup="+$c.blankCup);
- update($c);
- end
- rule"finishdrink"
- no-looptrue
- dialect"java"
- when
- $c:Customer(blankCup<2,money==0)
- then
- System.out.println("Customer"+$c.getName()+"finisheddrink,anddrinknumberis"+$c.getDrinkSum()+"blankCup="+$c.getBlankCup());
- end
运行结果如下:
Customer XiaoMing now buy a soda water and drink: money=49 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=49, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=48 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=47 and blankCup=2
...
Customer XiaoMing now buy a soda water and drink: money=1 and blankCup=1
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=2
Customer XiaoMing now sale 2 cups and get money: money=1, blankCup=0
Customer XiaoMing now buy a soda water and drink: money=0 and blankCup=1
Customer XiaoMing finished drink, and drink number is 99 blankCup=1
不过小明最后手上还有最后一个瓶子, 计算机只能到此了。
向老板借一个瓶子换一瓶汽水,喝完在还一个空瓶子,估计就是人类智慧来。
此程序需要drools的jar包,具体可见:
http://lcllcl987.iteye.com/blog/254381