第一次写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由于困意加上面瘫学长"听不懂就是你不行"的呵呵传授,全程梦游.最后面对连入门都算不上的几道动态规划,我的内心一片宁静,甚 ...
随机推荐
- Redis 命令 - Keys
DEL key [key ...] Delete a key 127.0.0.1:6379> SET foo hello OK 127.0.0.1:6379> DEL foo hello ...
- 百练 2973 Skew数 解题报告
思路: 计算出每一个skew数的不同位数表示的权值,然后用该位与权值相乘.用int数组来装权值,用char数组来装skew数. 代码: #include<stdio.h> #include ...
- JAVA之经典Student问题1
通过“三目运算符”求最大值与最小值. class student { //定义学生编号 private String stu; //学生姓名 private String name; //学生书信成绩 ...
- vs转eclipse之工具快速上手篇
eclipse工具下载 首先说明,本篇内容适用于刚开始学java的同学,老手大牛等可以路过. 不得不说vs确实很强大,常用的都在安装包里集成了,几乎可以一键安装,直接使用,操作起来非常方便. ecli ...
- mysql 游标嵌套循环实例
BEGIN #Routine body goes here... ####所有的2个小时之前生成的待支付订单更新为已过期 DECLARE tmp_id INT; DECLARE tmp_order_i ...
- jQuery选项卡插件、Tabs插件
效果图: <!DOCTYPE html> <html> <head> <title></title> <script src=&quo ...
- Java+Mysql+学生管理系统
最近正在学java和数据库,想起以前写的学生管理系统,都是从网上下载,敷衍了事.闲来无事,也就自己写了一个,不过功能实现的不是很多. 开发语言:java: 开发环境:Mysql, java: 开发工具 ...
- Linux 下面对物理地址的访问
参考链接:http://zhuhaibobb.blog.163.com/blog/static/2744006720101049030606/ Linux内核提供了/dev/mem驱动,提供了一种直接 ...
- Java调用外部程序常用算法和封装类
一个项目不可能只使用一种编程语言来开发,也不可能由一个人开发,所以,Java程序员要学会和使用其他编程语言的程序员合作.那么,让我来发布一个工具类--Java外接程序扩展包,并将相应算法发布.Java ...
- 实现android支持多线程断点续传下载器功能
多线程断点下载流程图: 多线程断点续传下载原理介绍: 在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度手机端下载数据时难免会出现无信号断线.电量不足等情况,所以需要断点续传功能根据下 ...