python筆記50-面試題:交換聖誕節禮物


前言

聖誕節快到啦,為了打造良好的工作環境,同事之間的關系和諧,現在玩一個交換禮物的小游戲。
每個同事准備一個禮物,到時候互相交換,自己手里的禮物必須交換出去,並且得到一個其它人的禮物。

交換禮物

我們假設有同事A,B,C,D,E,每個人都准備了一個小禮物,給禮物對應的編號1,2,3,4,5。
每個同事可以隨機得到一個禮物,但是不能拿到自己的。

import random
'''
交互禮物,員工ABCDE分別有禮物12345編號,每個員工不能抽到自己的
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
'''

people = {
    "A": 1,
    "B": 2,
    "C": 3,
    "D": 4,
    "E": 5,
}

# 所有的禮物編號
gifts = [i for i in people.values()]

def get_gift():
    '''隨機抽取禮物'''
    # 設置一個隨機值,范圍是0-禮物數量減1
    n = random.randint(0, len(gifts)-1)
    if people.get(x) == gifts[n]:
        # 判斷等於自己的禮物
        get_gift()  # 重新抽取
    else:
        print("%s 取到了禮物編號 %s" % (x, gifts[n]))
        # 取到了禮物后,把禮物從禮品盒里面移除掉
        del gifts[n]

if __name__ == '__main__':
    while 1:
        if len(gifts) == 0:
            print("換禮物結束!")
            exit()
        x = input("輸入一個員工:")
        if x not in people.keys():
            print("輸入員工名稱ABCDE")
        else:
            get_gift()

自由分配

不輸入員工名稱,讓員工自由取值。

import random
'''
交互禮物,員工ABCDE分別有禮物12345編號,每個員工不能抽到自己的
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
'''

people = {
    "A": 1,
    "B": 2,
    "C": 3,
    "D": 4,
    "E": 5,
}

# 所有的禮物編號
gifts = [i for i in people.values()]

def get_gift():
    '''隨機抽取禮物'''
    # 設置一個隨機值,范圍是0-禮物數量減1
    n = random.randint(0, len(gifts)-1)
    if people.get(x) == gifts[n]:
        # 判斷等於自己的禮物
        get_gift()  # 重新抽取
    else:
        print("%s 取到了禮物編號 %s" % (x, gifts[n]))
        # 取到了禮物后,把禮物從禮品盒里面移除掉
        del gifts[n]

if __name__ == '__main__':
    for x in people.keys():
        if x not in people.keys():
            print("輸入員工名稱ABCDE")
        else:
            get_gift()

運行結果

A 取到了禮物編號 5
B 取到了禮物編號 4
C 取到了禮物編號 2
D 取到了禮物編號 1
E 取到了禮物編號 3

這樣寫會有個小BUG,當ABCD先取到了1234,那最后一個就沒得拿了

判斷最后2個禮物的情況

為了避免前面的4個小伙伴剛好取到1234,把5留個最后一個小伙伴的尷尬情況,在還剩最后2個的時候,就做個判斷會有3種情況

  • 最后2個禮物 剛好是最后2個小伙伴的,換着拿
  • 最后2個禮物 都不是最后2個小伙伴的,隨便拿
  • 最后2個禮物 其中有1個是屬於最后2個小伙伴的,換着拿
import random
'''
交互禮物,員工ABCDE分別有禮物12345編號,每個員工不能抽到自己的
'''
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/

people = {
    "A": 1,
    "B": 2,
    "C": 3,
    "D": 4,
    "E": 5,
}



# 所有的禮物編號
gifts = [i for i in people.values()]
employees = [j for j in people.keys()]

def get_gift():
    '''隨機抽取禮物'''
    # 判斷最后2個禮物是不是有可能拿到自己的
    if len(gifts) == 2:
        # 情況1:最后2個禮物,剛好是最后2個人的
        if people[employees[0]] in gifts and people[employees[1]] in gifts:
            if people[employees[0]] == gifts[0]:
                print("%s 取到了禮物編號 %s" % (employees[0], gifts[1]))
                print("%s 取到了禮物編號 %s" % (employees[1], gifts[0]))
            else:
                print("%s 取到了禮物編號 %s" % (employees[0], gifts[0]))
                print("%s 取到了禮物編號 %s" % (employees[1], gifts[1]))
            exit()
        # 情況2:最后2個禮物,都不是最后2個人的
        elif people[employees[0]] not in gifts and people[employees[1]] not in gifts:
            print("%s 取到了禮物編號 %s" % (employees[0], gifts[0]))
            print("%s 取到了禮物編號 %s" % (employees[1], gifts[1]))
            exit()
        # 情況3:最后2個禮物有其中一個是最后2個的
        else:
            if people[employees[0]] == gifts[0]:
                print("%s 取到了禮物編號 %s" % (employees[0], gifts[1]))
                print("%s 取到了禮物編號 %s" % (employees[1], gifts[0]))
            elif people[employees[1]] == gifts[1]:
                print("%s 取到了禮物編號 %s" % (employees[0], gifts[1]))
                print("%s 取到了禮物編號 %s" % (employees[1], gifts[0])) 
            else:
                print("%s 取到了禮物編號 %s" % (employees[0], gifts[0]))
                print("%s 取到了禮物編號 %s" % (employees[1], gifts[1]))
            exit()


    # 設置一個隨機值,范圍是0-禮物數量減1
    n = random.randint(0, len(gifts)-1)
    if people.get(x) == gifts[n]:
        # 判斷等於自己的禮物
        get_gift()  # 重新抽取
    else:
        print("%s 取到了禮物編號 %s" % (x, gifts[n]))
        # 取到了禮物后,把禮物從禮品盒里面移除掉
        gifts.pop(n)
        employees.remove(x)

if __name__ == '__main__':
    for x in people.keys():
        if x not in people.keys():
            print("輸入員工名稱ABCDE")
        else:
            get_gift()

這樣多運行幾次都不會有問題了
A 取到了禮物編號 4
B 取到了禮物編號 5
C 取到了禮物編號 2
D 取到了禮物編號 1
E 取到了禮物編號 3


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM