这是一个在BJDP上学习Coding Kata的时候用到的一个练习,原来打算用Java写的,但是一想正好是学习的好机会。

就用Python了。第一次,写的有些复杂。

这个题目是关于购买图书的打折信息的。

题目来源:

http://codingdojo.org/cgi-bin/wiki.pl?KataPotter

  1 class Strategy:
  2     def __init__(self, items):
  3         self.items = items;
  4         self.rate = self.get_discount_rate();
  5
  6     def get_discount_rate(self):
  7         if len(self.items) == 5:
  8             return 0.75;
  9         if len(self.items) == 4:
 10             return 0.8;
 11         if len(self.items) == 3:
 12             return 0.9;
 13         if len(self.items) == 2:
 14             return 0.95;
 15         return 1.0;
 16
 17     def get_price(self):
 18         return self.total_price() * self.rate;
 19
 20     def total_price(self):
 21         price = 0.0;
 22         for item in self.items:
 23             price += item.book.price;
 24         return price;
 25
 26     def count(self):
 27         return len(self.items);
 28
 29
 30 class StrategyOptimizer:
 31     def optimize(self, strategies):
 32         found = False;
 33         while True:
 34             found = self.replace_53_with_44(strategies);
 35             if not found:
 36                 break;
 37         return strategies;
 38
 39     def replace_53_with_44(self, strategies):
 40         strategyMap = {};
 41         strategyMap.clear();
 42         for i in range(0, len(strategies)):
 43             strategy = strategies[i];
 44             strategyMap[strategy.count()] = i;
 45
 46         if (strategyMap != None and len(strategyMap) != 0):
 47             if (strategyMap.get(5, None) != None and strategyMap.get(3, None) != None):
 48                 self.move_book(strategies[strategyMap[5]], strategies[strategyMap[3]]);
 49                 return True;
 50         return False;
 51
 52     def move_book(self, source, dest):
 53         item = self.findAnyDiff(source, dest);
 54         if item == None:
 55             return;
 56         source.items.remove(item);
 57         source.rate = source.get_discount_rate();
 58         dest.items.extend([item]);
 59         dest.rate = source.get_discount_rate();
 60         return;
 61
 62     def findAnyDiff(self, source, dest):
 63         for item in source.items:
 64             if item not in dest.items:
 65                 return item;
 66         return None;
 67
 68 class Book:
 69     def __init__(self, index, name, price):
 70         self.index = index;
 71         self.name = name
 72         self.price = price
 73
 74 class Item:
 75     def __init__(self, book, count):
 76         self.book = book
 77         self.count = count
 78
 79 class Cart:
 80     items = [];
 81     def add_item(self, item):
 82         self.items.append(item);
 83
 84 def pick_most_books(cart):
 85     items = [];
 86     for i in range(0, len(cart.items)):
 87         item = cart.items[i];
 88         if item.count == 0:
 89             continue;
 90         items.append(Item(item.book, 1));
 91         cart.items[i].count -= 1;
 92     return items;
 93
 94 def is_empty(cart):
 95     for item in cart.items:
 96         if item.count > 0:
 97             return False;
 98     return True;
 99
100 def count_price(strategies):
101     price = 0;
102     for s in strategies:
103         price += s.get_price();
104     return price;
105
106 def find_best_solution(cart):
107     strategies = [];
108     price = 0.0;
109     while not is_empty(cart):
110         items = pick_most_books(cart);
111         strategy = Strategy(items);
112         strategies.append(strategy);
113     return strategies;
114
115 def count_best_price(cart):
116     strategies = find_best_solution(cart);
117     so = StrategyOptimizer();
118     strategies = so.optimize(strategies)
119     price = count_price(strategies);
120     print(price);
121
122 if __name__ == '__main__':
123     item_1 = Item(Book("#1.", "Philosophy Stone", 8), 2);
124     item_2 = Item(Book("#2.", "Secret Chamber", 8), 2);
125     item_3 = Item(Book("#3.", "Prisoner of Azkaban", 8), 2);
126     item_4 = Item(Book("#4.", "Goblet of Fire", 8), 1);
127     item_5 = Item(Book("#5.", "The Order of Phoenix", 8), 1);
128
129     cart = Cart();
130     cart.add_item(item_1);
131     cart.add_item(item_2);
132     cart.add_item(item_3);
133     cart.add_item(item_4);
134     cart.add_item(item_5);
135
136     count_best_price(cart);

转载于:https://www.cnblogs.com/stephen-wang/p/3229953.html

第一次写python相关推荐

  1. 第一次写,python爬虫图片,操作excel。

    第一次写博客,其实老早就注册博客园了,有写博客的想法,就是没有行动,总是学了忘,忘了丢,最后啥都没有,电脑里零零散散,东找找,西看看,今天认识到写博客的重要性. 最近闲着看了潭州教育的在线直播课程,颇 ...

  2. Python paromiko每日生活学习感悟(第一次写,紧张hahaha)

    Python paromiko每日生活学习感悟(第一次写,紧张hahaha) 学习篇 生活篇 学习篇 今天整天实习,解决了虚拟机通过SSH进行远程登录,需求还增加一项就是要采用多个接入多个设备,采用了 ...

  3. 携程航班信息爬取(python)---第一次写博客,不好请别见外!

    1.航班信息接口 api="https://flights.ctrip.com/itinerary/api/12808/products",这个接口中包含了所要查询的航班信息. * ...

  4. 用Python代码自己写Python代码,竟如此简单

    用Python代码自己写Python代码,竟如此简单 Python作为一门功能强大且使用灵活的编程语言,可以应用于各种领域,具有"无所不能"的特质. Python甚至可以代替人,自 ...

  5. termux使用教程python-神器Termux(二)——如何用安卓手机舒服地写Python

    用惯了windows和图形化界面的大家,或多或少对命令行有些抵触,有没有好的解决方案呢?先看看在Termux上写Python是种怎样的体验吧. 一.Python shell交互模式体验 在命令行中输入 ...

  6. python 魔兽世界升级脚本_第一次用python:python脚本用来实现增量更新项目代码...

    项目采用增量更新,每次更新需要将提交到svn的代码手动一一拖到本地文件夹再拖到服务器上,非常麻烦.正好学习python,就弄了个批量复制脚本,顺便熟悉下Python语法.第一次写,很多方法不熟,写的比 ...

  7. 写python爬虫的第一天,拿百度练手遇到 “ 被反爬遇到<title>百度安全验证</title> ” 的解决方案

    博主第一次写博文,第一次学爬虫,就是想分享,大家见怪不怪, 首先我设置了一个自定义UA代理池并没有采用插件pip install fake-useragent形式进行随机获取print(ua.ie) ...

  8. vscode 搜索结果 整行_如何用VSCode愉快的写Python

    在学习Python的过程中,一直没有找到比较趁手的第三方编辑器,用的最多的还是Python自带的编辑器.由于本人用惯了宇宙第一IDE(Visual Studio),所以当Visual Studio C ...

  9. python数据分析神器_牛逼啊!一个随时随地写Python代码的神器

    作者: Leoxin 公众号:菜鸟学Python 现在学Python的人越来越多,很多小伙伴都非常有激情.利用碎片时间随时随地学习Python, 大家知道Python是一门编程语言,但是学语言光看不练 ...

最新文章

  1. OpenCV图像梯度(Sobel和Scharr)
  2. mongodb重命名集合、数据库
  3. 链表的基本操作(c++实现)
  4. Oracle 11g密码过期问题及解决方案
  5. Lock free queue 大比拼
  6. mysql加入新的从节点怎么配置_MySql主从复制配置
  7. 文巾解题 1179. 重新格式化部门表
  8. 朴素贝叶斯算法注意事项(有待完善)
  9. 阿里云@广东:让我们一起上云!
  10. python实现Prim算法求解加权连通图的最小生成树问题
  11. 携程瘫痪非偶然 国内互联网企业漠视数据管理
  12. 全网最全C盘清理攻略
  13. Nature重磅综述;关于机器学习应用单细胞组学+RNA-seq,你想知道的都在这
  14. Package inputenc Error: Invalid UTF-8 byte “A1;Improper alphabetic constant. <to be read again>
  15. 通过CSS实现 文字渐变色 的两种方式
  16. WSTMart二次开发目录说明
  17. WLS(适用于Windows的Linux子系统)的安装
  18. 20071011听力原文
  19. 3.4 Docker最新入门教程-Docker入门-共享应用程序
  20. 愿在以后的日子里,即使单枪匹马也能勇往直前

热门文章

  1. Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
  2. [pytorch、学习] - 4.6 GPU计算
  3. 汇编 --- 初体验
  4. Linux网络/firewalld和netfilter/netfilter/iptables语法
  5. Tomcat 配置和spring-framework MVC配置简介
  6. 移动wabAPP 开发 viewport 注意事项
  7. MYSQL复制的几种模式
  8. RAID冗余技术的介绍AND实现
  9. C#:委托基础与事件
  10. halcon模板匹配测试流程