不知道是不是 C / C++ 寫久了,轉戰  python 竟有些不習慣。

好處是 library 確實很多,目前最不習慣的大概是沒 call by pointer / call by reference。

小小的心願是,希望 python 不會用太久 XD

創作者介紹

Edison.X. Blog

edisonx 發表在 痞客邦 PIXNET 留言(2) 人氣()


留言列表 (2)

發表留言
  • Dick Liu
  • to edisonx大大:
    我跟你剛好相反,我是先從Python學起,然後自己摸索CS:app這本書籍,發現當中的C一直卡關,才輾轉google到你的資源文章,我的感覺是中文的C相關資源文章似乎不多,感謝你的付出~
  • 很高興我的文章對你有所幫助。 *^_^*

    edisonx 於 2017/05/23 01:26 回覆

  • VBA
  • 求解.xls VBA 寫法 我的郵箱 zxcvbnm-2434HOTMAIL .com


    python 我是這樣寫 但是無法交差 因為沒有環境可以安裝

    同時使用牌組A,B 註:A,B牌組卡牌數量會變動
    牌組A 時段:周一 06:00∼週五18:00
    牌組B 時段:週五18:00∼下週一06:00
    ①每日起始時間06:00∼翌日06:00
    ②單一牌組上限99張 最低7張(一天12班-可重複5限定班)
    ③定義每張卡牌名稱
    ④紀錄每張卡牌使用次數
    ⑤每兩小時從牌組抽出一張牌
    ⑥第一張出牌時間06:00開始
    ⑦限定時段12:00∼14:00 ,22:00∼24:00,24:00∼02:00,02:00∼04:00,04:00∼06:00 這五個時段 卡牌一天只能出現一次
    ⑧每張牌需亂數抽出 (洗牌問題)
    ⑨每張卡牌冷卻時間六小時 (一天同一張卡最多出現兩次) 超人還是要睡覺的
    ⑩牌組卡牌用完才可抽第二輪(須符合每日相同卡牌最多出現2次條件) 可多次使用同一牌組
    註記第六項 輸出排列由週五06:00∼下週周五06:00(若牌組還有未用完卡片❝名稱❞需列表) 上班習慣才會定義週五開始
    ⊗週五會橫跨平時跟假日 麻煩留意一下規則 週五比較特殊(司機喜歡週五拿上班表)

    __author__ = "Toheart"
    __description__ = "Toheart"

    import math

    dayRealdayDict = {
    1: 'Sat',
    2: 'Sun',
    3: 'Mon',
    4: 'Tue',
    5: 'Wes',
    6: 'Thu',
    7: 'Fri' }

    # Day 1 is counted from 6:00 on the first day.
    # Thus day2 is 30:00-54:00. So on and so forth.

    # 5.一天當中12點到14點、22點到24點、24點到2點、2點到4點、4點到6點 抽出相同卡牌只能有一次
    HARD_TIMES = {12, -2, 0, 2, 4}

    def getHardTimes(day):
    """Get hard times on a give day"""
    hardTimes = []
    for t in HARD_TIMES:
    hardTimes.append(t + (day-1)*24)
    return set(hardTimes)

    def getScheduleTimes(day):
    """Get all possible time slots for a day"""
    if day == 1:
    return list(range(-6 + (day-1)*24, 6+day*24, 2))
    elif day in [2, 3, 4, 5 ,6]:
    return list(range(6 + (day-1)*24, 6+day*24, 2))
    elif day == 7:
    return list(range(6+ (day -1)*24, 18 + (day-1)*24))
    else:
    print("Invalid day: " + str(day))
    exit(0)

    def getTimes(day):
    """Get all possible time slots for a real day"""
    return list(range(-6 + (day-1)*24, -6+day*24, 2))

    class Person:
    def __init__(self, alias, availableDays):
    # 0. 每張卡牌都有個代號
    self.alias = alias
    self.useTimes = []
    self.availableDays = availableDays

    # 未使用卡牌需列表
    物業管理
    def unusedp(self):
    return self.useTimes.__len__() == 0

    # 紀錄每張卡片使用次數
    物業管理
    def usedTimes(self):
    return self.useTimes.__len__()

    def availablep(self, time, day):
    availableTimes = []
    for availableDay in self.availableDays:
    availableTimes += getScheduleTimes(availableDay)
    if time not in availableTimes:
    return False
    # 5.一天當中12點到14點、22點到24點、24點到2點、2點到4點、4點到6點 抽出相同卡牌只能有一次
    if getHardTimes(day).intersection(self.useTimes).__len__() > 0:
    return False
    # 3.每張卡片需等待六小時的緩衝時間才可再次出牌
    for t in self.useTimes:
    if math.fabs(t - time) < 6:
    return False
    # 附加條件 一天只能出現兩次
    if set(self.useTimes).intersection(getTimes(day)).__len__() >= 2:
    return False
    return True

    def getPersonToBeSelected(persons, time, day):
    """Get the appropriate person."""
    availablePersons = list(filter(lambda x: x.availablep(time, day), persons))
    if availablePersons.__len__() == 0:
    print("No person will be available on " + dayRealdayDict[day] + " at time slot " + str(time - 24*(day-1)) + ":00")
    exit(0)
    sortedAvailablePersons = sorted(availablePersons, key=lambda x: x.usedTimes)
    return sortedAvailablePersons[0]

    def report(persons):
    """Report the results"""
    unused = []
    for person in persons:
    if person.usedTimes == 0:
    unused.append(person)
    continue
    print(person.alias)
    print("Total times: " + str(person.useTimes.__len__()))
    humanReadableTimes = []
    for t in person.useTimes:
    day, time = divmod(t, 24)
    day = day+1
    if day == 0:
    day = 7
    humanReadableTimes.append((dayRealdayDict[day], time))
    print(humanReadableTimes)

    print("========= Unused people ==========")
    for person in unused:
    print(person.alias)

    if __name__ == "__main__":
    persons = []
    with open("input.txt", 'r') as f:
    for index, line in enumerate(f.readlines()):
    if line.startswith("###"):
    continue
    if line.startswith("*DAYS*"):
    days = list(map(lambda x: int(x), line.split(" ")[1].split(",")))
    continue
    personAlias, availableDays = line.strip().split(" ")
    persons.append(Person(personAlias, list(map(lambda x: int(x), availableDays.split(",")))))
    # 2.排序方法一天二十四小時 每兩個小時抽一張
    for day in days:
    for t in getTimes(day):
    person = getPersonToBeSelected(persons, t, day)
    person.useTimes.append(t)

    report(persons)

  • 你提問的方式像是給了我 Homework , 同時還要在期限內以 mail 回覆給你答案。嗯,加油。

    edisonx 於 2017/05/23 01:24 回覆

您尚未登入,將以訪客身份留言。亦可以上方服務帳號登入留言

請輸入暱稱 ( 最多顯示 6 個中文字元 )

請輸入標題 ( 最多顯示 9 個中文字元 )

請輸入內容 ( 最多 140 個中文字元 )

請輸入左方認證碼:

看不懂,換張圖

請輸入驗證碼