Thoughtworks公司代碼題目:收銀機

需求描述前端


商店裏進行購物結算時會使用收銀機系統,這臺收銀機會在結算時根據客戶的購物車中的商品和商店正在進行的優惠活動進行結算和打印購物清單。python

已知商品信息包含:名稱,數量單位,單價,類別和條形碼(僞)。 
已知咱們能夠對收銀機進行設置,使之支持各類優惠。git

咱們須要實現一個名爲打印購物清單的小模塊,收銀機會將輸入的數據轉換成一個JSON數據而後一次性傳給咱們這個小模塊,咱們將從控制檯中輸出結算清單的文本。github

輸入格式(樣例):數據結構

[
    'ITEM000001',
    'ITEM000001',
    'ITEM000001',
    'ITEM000001',
    'ITEM000001',
    'ITEM000003-2',
    'ITEM000005',
    'ITEM000005',
    'ITEM000005'
]app

其中對'ITEM000003-2'來講,"-"以前的是標準的條形碼,"-"以後的是數量。 
當咱們購買須要稱量的物品的時候,由稱量的機器生成此類條形碼,收銀機負責識別生成購物清單dom

該商店正在對部分商品進行「買二贈一」的優惠活動和對部分商品進行95折的優惠活動。其中:函數

  • 「買二贈一」是指,每當買進兩個商品,就能夠免費再買一個相同商品。測試

  • 「95折」是指,在計算小計的時候按單價的95%計算每一個商品。編碼

  • 每一種優惠都詳細標記了哪些條形碼對應的商品能夠享受此優惠。

  • 店員設置,當「95折」和「買二贈一」發生衝突的時候,也就是一款商品既符合享受「買二贈一」優惠的條件,又符合享受「95折」優惠的條件時,只享受「買二贈一」優惠。


要求寫代碼支持上述的功能,並根據輸入和設置的不一樣,輸出下列購物清單

購物清單內容及格式(樣例):

  • 當購買的商品中,有符合「買二贈一」優惠條件的商品時:

***<沒錢賺商店>購物清單***
名稱:可口可樂,數量:3瓶,單價:3.00(元),小計:6.00(元)
名稱:羽毛球,數量:5個,單價:1.00(元),小計:4.00(元)
名稱:蘋果,數量:2斤,單價:5.50(元),小計:11.00(元)
----------------------
買二贈一商品:
名稱:可口可樂,數量:1瓶
名稱:羽毛球,數量:1個
----------------------
總計:21.00(元)
節省:4.00(元)
**********************

 

  • 當購買的商品中,沒有符合「買二贈一」優惠條件的商品時:

***<沒錢賺商店>購物清單***
名稱:可口可樂,數量:3瓶,單價:3.00(元),小計:9.00(元)
名稱:羽毛球,數量:5個,單價:1.00(元),小計:5.00(元)
名稱:蘋果,數量:2斤,單價:5.50(元),小計:11.00(元)
----------------------
總計:25.00(元)
**********************

 

  • 當購買的商品中,有符合「95折」優惠條件的商品時

***<沒錢賺商店>購物清單***
名稱:可口可樂,數量:3瓶,單價:3.00(元),小計:9.00(元)
名稱:羽毛球,數量:5個,單價:1.00(元),小計:5.00(元)
名稱:蘋果,數量:2斤,單價:5.50(元),小計:10.45(元),節省0.55(元)
----------------------
總計:24.45(元)
節省:0.55(元)
**********************

 

  • 當購買的商品中,有符合「95折」優惠條件的商品,又有符合「買二贈一」優惠條件的商品時

***<沒錢賺商店>購物清單***
名稱:可口可樂,數量:3瓶,單價:3.00(元),小計:6.00(元)
名稱:羽毛球,數量:6個,單價:1.00(元),小計:4.00(元)
名稱:蘋果,數量:2斤,單價:5.50(元),小計:10.45(元),節省0.55(元)
----------------------
買二贈一商品:
名稱:可口可樂,數量:1瓶
名稱:羽毛球,數量:2個
----------------------
總計:20.45(元)
節省:5.55(元)
**********************

 

做業要求

  1. 請根據需求自行設計商品信息和優惠信息的數據結構,並本身準備數據;

  2. 請完成所有需求,並輸出樣例格示的購物清單

  3. 請在保證代碼可讀性的前提下,儘量用最小的圈複雜度完成做業;

  4. 移動開發請用Android/iOS,前端開發請用JavaScript。其餘語言不限。

加分項

  1. 良好的設計

  2. 寫測試

  3. 用github提交,而且有良好的提交習慣

直接失敗的減分項

  1. 壓縮包打不開

  2. 以txt文件,圖片,word文檔等非代碼形式提交做業

  3. 只提交了二進制文件,沒提交代碼,好比exe和class文件

以上是原文的題目,下面附上我寫的代碼:


#coding=utf-8

#超市產品價格字典

products_dic = {"可口可樂":3.00,"羽毛球":1.00,"蘋果":5.50,"西紅柿":4.50,"籃球":80.00,"乒乓球":1.00,"菜花":5.80,"牛奶":3.50, 
              "百事可樂":3.00,"康師傅冰紅茶":3.50,"芬達橙味飲料":3.50,"青菜":2.80,"白菜":1.50,"五花肉":15.80,"海捕大蝦":40.00,
              "鯽魚":9.50,"武昌魚":12.60,"蛋黃派":6.50,"薯片":3.00,"泡椒鳳爪":4.00,"白麪饅頭":1.00,"蕎麥饅頭":1.20,"玉米饅頭":1.20,
              "千禾醬油500ml":6.80,"山西龍井口老陳醋600ml":8.80,"東北大米":3.50,"麪粉":3.80,"糯米粉":7.50,"散裝粉絲":10.00,
             "茅臺飛天500ml":1688.00,"五糧液500ml":1288.00,"古井貢酒500ml":388.00,"二鍋頭500ml":25.00,"大蒜":5.00 }

#生成條碼和產品名對應字典
item_dic = {}
list1 = [x[0] for x in products_dic.items()]
for i in xrange(34):
    item_dic["ITEM"+str(i).rjust(6,"0")] = list1[i]
''' 因爲時間限制,條碼字典就由商品字典快速按編碼規則生成'''


#產品計量單位字典    

unit_dic={"武昌魚":"斤","五花肉":"斤","糯米粉":"斤","大蒜":"斤","東北大米":"斤","散裝粉絲":"斤","鯽魚":"斤","西紅柿":"斤","麪粉":"斤",
          "菜花":"斤","海捕大蝦":"斤","青菜":"斤","蘋果":"斤","白菜":"斤","玉米饅頭":"個","籃球":"個","乒乓球":"個","白麪饅頭":"個",
          "蕎麥饅頭":"個","羽毛球":"個","二鍋頭500ml":"瓶","可口可樂":"瓶","五糧液500ml":"瓶","千禾醬油500ml":"瓶","茅臺飛天500ml":"瓶",
          "芬達橙味飲料":"瓶","山西龍井口老陳醋600ml":"瓶","百事可樂":"瓶","古井貢酒500ml":"瓶","康師傅冰紅茶":"瓶","泡椒鳳爪":"袋",
          "蛋黃派":"袋","薯片":"袋","牛奶":"盒"}

#discount1 爲買二贈一活動商品集合,discount2 爲95折活動商品集合

discount1 = {"二鍋頭500ml","五花肉","糯米粉","牛奶","可口可樂","泡椒鳳爪","籃球","五糧液500ml","千禾醬油500ml",
         "茅臺飛天500ml","芬達橙味飲料","大蒜","山西龍井口老陳醋600ml","東北大米","散裝粉絲",}
discount2 = {"散裝粉絲","乒乓球","鯽魚","西紅柿","麪粉","菜花","百事可樂","海捕大蝦","白麪饅頭","古井貢酒500ml","青菜","蕎麥饅頭",
             "蛋黃派","薯片","蘋果","白菜","康師傅冰紅茶","羽毛球"}

#增長條碼,商品,單位字典的函數方法
def update_dic(item,name,price,unit):
    item_dic[item] = name
    products_dic[name] = price
    unit_dic[name] = unit
    

#格式化處理條形碼函數,返回去重及計數後的條碼字典

def format_items(items):
    new_items = {}
    for item in items:
        temp = item.split("-")
        try:
            if new_items.has_key(temp[0]):
                new_items[temp[0]] += float(temp[1])
            else:
                new_items[temp[0]] = float(temp[1])
        except IndexError:
                if new_items.has_key(temp[0]):
                    new_items[temp[0]] += 1
                else:
                
                    new_items[temp[0]] = 1
           
    return new_items
                
            
#條形碼字典轉換購物商品字典函數

def convert2shoppinglist(items):
    shoppinglist = {}
    for key,value in items.items():
        shoppinglist[item_dic[key]] = value
    return shoppinglist


#計算單項商品信息函數,返回元組用於格式化輸出

def compute_product_information(product):
    name = product[0]
    number = product[1]
    price = products_dic[name]
    unit = unit_dic[name]
    if  name in discount1:  #按照商品優惠規則分類計算輸出商品名稱,數量,計量單位,單價,小計,節省
        return (name,number,unit,price,number%3*price+2*(number//3)*price)
    elif name in discount2:
        return (name,number,unit,price,number*price*0.95,number*price*0.05)
    else:
        return (name,number,unit,price,number*price)
    

#打印購物清單函數,將購物表中的商品格式化輸出

def print_receipts(shoppinglist):
    total = 0  #初始化商品總價
    saved = 0  #初始化節省價格
    zengpin = {} #初始化買二贈一商品及贈送數量字典
    print "***<沒錢賺商店>購物清單***"
    for product in shoppinglist.items():
        temp = compute_product_information(product)
        try:
            
            print "名稱:%s,數量:%.3f %s,單價:%.3f(元),小計:%.3f(元)" % (temp)#普通商品和買二贈一商品輸出格式
            if product[0] in discount1 and (product[1] // 3) > 0:  #將符合條件的商品增長到二贈一商品字典和節省價格自動增長
                zengpin[product[0]] = product[1] // 3            
                saved += zengpin[product[0]]*products_dic[product[0]]
        except:
            print "名稱: %s,數量:%.3f %s,單價:%.3f(元),小計:%.3f(元),節省 %.3f(元)" % (temp)#95折商品輸出格式
            saved += temp[5]
            
        total += temp[4]
    print "-"*22
    if len(zengpin) != 0:  # 若存在符合買二贈一的商品,輸出商品及優惠數量
        print "買二贈一商品:"
        for key,value in zengpin.items():
            print "名稱:%s,數量:%d %s" % (key,value,unit_dic[key])
        print "-"*22
    print "總計: % .3f (元)" % total
    if saved != 0:  #輸出節省價格總量
        print "節省:%.3f (元)" % saved
    print "*"*18
    

#測試運行

if __name__ == '__main__':
    import random
    
    #隨機生成15個測試集進行測試,每一個測試集由隨機15個商品字典內的條碼,每一個條碼的商品數量(1-20)隨機生成
    testlist = []
    for i in xrange(15):
        items = []
        for j in xrange(15):
            item = "ITEM" + str(random.randint(0, 33)).rjust(6,"0")+"-"+str(random.randint(1,20))
            items.append(item)
        testlist.append(items)
    for items in testlist:
        print_receipts(convert2shoppinglist(format_items(items)))
相關文章
相關標籤/搜索