第一次写python
这是一个在BJDP上学习Coding Kata的时候用到的一个练习,原来打算用Java写的,但是一想正好是学习的好机会。
就用Python了。第一次,写的有些复杂。
这个题目是关于购买图书的打折信息的。
题目来源:
http://codingdojo.org/cgi-bin/wiki.pl?KataPotter
class Strategy:
def __init__(self, items):
self.items = items;
self.rate = self.get_discount_rate(); def get_discount_rate(self):
if len(self.items) == 5:
return 0.75;
if len(self.items) == 4:
return 0.8;
if len(self.items) == 3:
return 0.9;
if len(self.items) == 2:
return 0.95;
return 1.0; def get_price(self):
return self.total_price() * self.rate; def total_price(self):
price = 0.0;
for item in self.items:
price += item.book.price;
return price; def count(self):
return len(self.items); class StrategyOptimizer:
def optimize(self, strategies):
found = False;
while True:
found = self.replace_53_with_44(strategies);
if not found:
break;
return strategies; def replace_53_with_44(self, strategies):
strategyMap = {};
strategyMap.clear();
for i in range(0, len(strategies)):
strategy = strategies[i];
strategyMap[strategy.count()] = i; if (strategyMap != None and len(strategyMap) != 0):
if (strategyMap.get(5, None) != None and strategyMap.get(3, None) != None):
self.move_book(strategies[strategyMap[5]], strategies[strategyMap[3]]);
return True;
return False; def move_book(self, source, dest):
item = self.findAnyDiff(source, dest);
if item == None:
return;
source.items.remove(item);
source.rate = source.get_discount_rate();
dest.items.extend([item]);
dest.rate = source.get_discount_rate();
return; def findAnyDiff(self, source, dest):
for item in source.items:
if item not in dest.items:
return item;
return None; class Book:
def __init__(self, index, name, price):
self.index = index;
self.name = name
self.price = price class Item:
def __init__(self, book, count):
self.book = book
self.count = count class Cart:
items = [];
def add_item(self, item):
self.items.append(item); def pick_most_books(cart):
items = [];
for i in range(0, len(cart.items)):
item = cart.items[i];
if item.count == 0:
continue;
items.append(Item(item.book, 1));
cart.items[i].count -= 1;
return items; def is_empty(cart):
for item in cart.items:
if item.count > 0:
return False;
return True; def count_price(strategies):
price = 0;
for s in strategies:
price += s.get_price();
return price; def find_best_solution(cart):
strategies = [];
price = 0.0;
while not is_empty(cart):
items = pick_most_books(cart);
strategy = Strategy(items);
strategies.append(strategy);
return strategies; def count_best_price(cart):
strategies = find_best_solution(cart);
so = StrategyOptimizer();
strategies = so.optimize(strategies)
price = count_price(strategies);
print(price); if __name__ == '__main__':
item_1 = Item(Book("#1.", "Philosophy Stone", 8), 2);
item_2 = Item(Book("#2.", "Secret Chamber", 8), 2);
item_3 = Item(Book("#3.", "Prisoner of Azkaban", 8), 2);
item_4 = Item(Book("#4.", "Goblet of Fire", 8), 1);
item_5 = Item(Book("#5.", "The Order of Phoenix", 8), 1); cart = Cart();
cart.add_item(item_1);
cart.add_item(item_2);
cart.add_item(item_3);
cart.add_item(item_4);
cart.add_item(item_5); count_best_price(cart);
第一次写python的更多相关文章
- 第一次写python爬虫
花了4天终于把写完了把国内的几个漏洞平台爬完了,第一次写py,之前一直都在说学习,然后这周任务是把国内的漏洞信息爬取一下.花了1天学PY,剩下的1天一个.期间学习到了很多.总结如下: ======== ...
- 使用C/C++写Python模块
最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...
- 第一次写博客Poj1044
Date bugs Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3005 Accepted: 889 Descript ...
- 写python时加入缩进设置
发现如果用vim写python的时候,还是设成8好像会报错,在现有的基础上,加入下面设置就好了set shiftwidth=4
- 用Emacs 写python了
之前都是用python 自带的IDLE 写 python 的,现在换了Emacs,感觉真是不错,爽. 截图留念: 用了sr-speedbar ,顿时有了IDE 的感觉,是不是很爽. 版权声明:本文为博 ...
- Java第一次写的流布局图形界面,留个纪念
package jisuanqi; import java.awt.*; public class MyFrame extends Frame{ //继承Frame类 public MyFrame() ...
- 第一次写博客,关于前端开发deMVC在js中的应用
对前端MVC MVC分别是model.view.controller的缩写,模型.视图.控制器.这些更加偏向于后台,在以前MVC是只属于后台的.当然随着技术的进步,前端的大牛们将后台的一些东西应用于前 ...
- 在html中写python代码的语法和特点-----基于webpy的httpserver
在html文件里写python语法的内容,的注意事项: 1:python程序中的变量通过以下方法传入到html: 1:通过全局变量 :全局变量是不须要用$def with语法实现传递的,仅仅要定义了 ...
- HDU 2064 菜鸡第一次写博客
果然集训就是学长学姐天天传授水铜的动态规划和搜索,今天讲DP由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...
随机推荐
- hdu 1558 Segment set
Segment set Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Nginx - HTTP Configuration, Module Variables
The HTTP Core module introduces a large set of variables that you can use within the value of direct ...
- java内存被释放的小例子
先贴代码: StringBuilder dada = null; ; i<; i++){ dada = new StringBuilder(); ; j<; j++){ dada.appe ...
- Oracle中存储过程传入表名学习
Oracle中存储过程传入表名: 一.动态清除该表的数据 create or replace procedure p_deletetable(i_tableName in varchar2) as ...
- Aisen仿新浪微博客户端项目源码
新浪目前已经限制了第三方微博的很多API接口,加上平常时间不够,所以后续可能不会面向产品的去维护Aisen,不过也有了一些新的方向,例如引入最新Android-support-library,在一个完 ...
- Xcode7打包上传App Store发生ERROR ITMS-90535 错误解决方法
两个方法解决 1.如果用不到QQ分享啥的,直接删掉TencentOpenApi这个文件夹. 移除掉这个模块 ..简单粗暴,我就是这么解决的. 2.找到TencentOpenApi_IOS_Bundl ...
- (转)软件版本中的Alpha,Beta,RC,Trial是什么意思?
版本号:V(Version):即版本,通常用数字表示版本号.(如:EVEREST Ultimate v4.20.1188 Beta )Build:用数字或日期标示版本号的一种方式.(如:VeryCD ...
- javascript笔记——placehold
<input type="text" name="搜索" value="搜索" placeholder="搜索" ...
- javascript笔记——闭包
花了三天时间,终于弄清楚闭包的各种写法和注意的事项,以及以前写,经常出错的地方,特此做一个总结,虽然不够专业,但是对于那些初学者来说,绝对对闭包的理解事半功倍. 案例一: function aa(){ ...
- jQuery-ui treegird 使用
在实际应用中可能会碰到不同的需求,比如会根据每行不同的参数或属性设置来设置同列不同的editor类型,这时原有的例子就显的有点太过简单,不能实现我们的需求,现在应用我在项目中的操作为例,显示下实现同列 ...