- 论坛徽章:
- 0
|
本帖最后由 aquei_cu 于 2012-06-13 15:44 编辑
- #coding:utf-8
- import operator
- NAME_FILE='name.txt'
- def all_days_in_a_year(func_create=None, args=None):
- if None == func_create:
- func_create = str
- if None == args:
- args = ''
- all_days = dict()
- for m in xrange(1, 13):
- if m == 1\
- or m == 3\
- or m == 5\
- or m == 7\
- or m == 8\
- or m == 10\
- or m == 12:
- for i in xrange(1, 32):
- all_days[m*100+i] = func_create(args)
- elif m == 4\
- or m == 6\
- or m == 9\
- or m == 11:
- for i in xrange(1, 31):
- all_days[m*100+i] = func_create(args)
- elif m == 2:
- for i in xrange(1, 30):
- all_days[m*100+i] = func_create(args)
- else:
- #NEVER DO IT!!
- pass
- return all_days
- #DEBUG FUNCTION
- def showPlayers(players):
- for p in players:
- if None != p:
- print p
- class Question(object):
- def __init__(self, players):
- """construct question object"""
- self._players = players
- self._is_sort_by_birthday = False
- def _sort_by_birthday(self):
- """sort players by birthday"""
- self._players.sort(lambda p1, p2:cmp(p1.birthday(), p2.birthday()))
- self._is_sort_by_birthday = True
- def youngest(self, args=None):
- """1.年纪最小的人"""
- youngest = []
- if False == self._is_sort_by_birthday:
- self._sort_by_birthday()
- return self._players[len(self._players)-1].name()
- def oldest(self, args=None):
- """2.年纪最大的人"""
- if False == self._is_sort_by_birthday:
- self._sort_by_birthday()
- return self._players[0].name()
- def birthday_of_most_man(self, args=None):
- """3.哪一天出生的人最多"""
- count = 0
- result = []
- days = [0 for x in xrange(0,32)];
- for p in self._players:
- days[p.birth_day()] += 1
- for i in xrange(0,31):
- if count < days[i]:
- count = days[i]
- day = i + 1
- return str(day)+'日'
- def birthday_same_me(self, args):
- """4.和你生日相同的人,如果有的话找出来"""
- month = args[0]
- day = args[1]
- same_birth_men = ''
- if False == self._sort_by_birthday:
- self._sort_by_birthday()
- for p in self._players:
- if (p.birth_month() == month) and (p.birth_day() == day):
- same_birth_men += p.name() + ', '
- return same_birth_men[:len(same_birth_men)-2]
- def country_coach_group(self, args):
- """5.给定一个球员名,列出国籍与教练,处在哪个小组"""
- name = args[0]
- for p in self._players:
- if p.name() == name:
- return (p.country() + ',' + p.coach() + ',' + p.group())
- def club_in_most_men(self):
- """6.哪个俱乐部的人最多"""
- clubs = dict()
- for p in self._players:
- if False == clubs.has_key(p.club()):
- clubs[p.club()] = 1
- else:
- clubs[p.club()] += 1
- l = sorted(clubs.iteritems(), key=operator.itemgetter(1), reverse=True)
- return str(l[0][0])
- def pos_in_most_captains(self):
- """7.队长里打什么位置的最多"""
- positions = dict()
- for p in self._players:
- if False == p.captain():
- continue
- if False == positions.has_key(p.pos()):
- positions[p.pos()] = 1
- else:
- positions[p.pos()] += 1
- l = sorted(positions.iteritems(), key=operator.itemgetter(1), reverse=True)
- return str(l[0][0][:(len(l[0][0])-1)])
- def older_than_me(self, args=None):
- """8.比你年纪大的有多少人"""
- age = args[0]
- count = 0
- for p in self._players:
- if age < p.age():
- count += 1
- return count
- def birthday_of_no_man(self):
- """9.列出365天里所有人都不过生日的日期"""
- result = ''
- all_days = all_days_in_a_year(int, 0)
- for p in self._players:
- all_days[p.birth_month_day()] += 1
- for k in all_days.keys():
- if all_days[k] == 0:
- k_str = str(k)
- k_str = k_str[:len(k_str)-2] + '-' + k_str[len(k_str)-2:]
- result += k_str + ','
- return result[:len(result)-1]
- def men_count_of_Pos(self):
- """10.打各个位置的人一共有多少"""
- positions = dict()
- for p in self._players:
- if False == positions.has_key(p.pos()):
- positions[p.pos()] = 1
- else:
- positions[p.pos()] += 1
- l = sorted(positions.iteritems(), key=operator.itemgetter(1), reverse=True)
- result = str(positions)
- return result[1:-1].replace('\'', '')
- def readdata(fname):
- group = ''
- coach = ''
- country = ''
- players = []
- GROUP_KEY='Group '
- COACH_KEY='Head coach: '
- COACH_COUNTRY_SEP=' ('
- TITLE_KEY='#'
- NUMBER_TITLE = '#'
- POS_TITLE = 'Pos.'
- NAME_TITLE = 'Player'
- BIRTH_TITLE = 'Date of Birth'
- AGE_TITLE = '(Age)'
- CLUB_TITLE = 'Club'
- PLAYER_KEY=' '
- CAPTAIN_KEY = '(c)'
- AGE_KEY = '(aged '
- f = open(fname, 'r')
- for line in f:
- if line == '\n':
- continue
- if -1 != line.find(GROUP_KEY):
- group = line[len(GROUP_KEY):]
- elif -1 != line.find(COACH_KEY):
- coach = line[len(COACH_KEY):]
- elif -1 != line.find(TITLE_KEY):
- pos_start = line.find(POS_TITLE)
- name_start = line.find(NAME_TITLE)
- birth_start = line.find(BIRTH_TITLE)
- age_start = line.find(AGE_TITLE)
- club_start = line.find(CLUB_TITLE)
- continue
- elif ' ' == line[0]:
- infos = []
- #0 = #
- infos.append(line[0:pos_start-1])
- #1 = Pos.
- infos.append(line[pos_start:name_start-1])
- #Player
- #2 = Name
- #3 = Captain
- name = line[name_start:birth_start-1]
- captain_key_pos = name.find(CAPTAIN_KEY)
- if -1 != captain_key_pos:
- infos.append(name[:captain_key_pos].strip())
- infos.append(True)
- else:
- infos.append(name.strip())
- infos.append(False)
- #4 = Date of Birth
- infos.append(line[birth_start+1:age_start-3])
- #5 = Age
- infos.append(line[age_start+len(AGE_KEY):club_start-2])
- #6 = Club
- infos.append(line[club_start:len(line)-1])
- #7 = Group
- infos.append(group[0])
- #8 = Coach
- infos.append(coach.strip())
- #9 = Country
- infos.append(country.strip())
- players.append(Player(infos))
- else:
- country = line[:-1]
- return players
- class Player(object):
- def __init__(self, infos):
- self._num = infos[0]
- self._pos = infos[1][1:]
- self._name = infos[2]
- self._captain = infos[3]
- self._birthday = infos[4]
- self._age = infos[5]
- self._club = infos[6]
- self._group = infos[7]
- self._coach = infos[8]
- self._country = infos[9]
- def __str__(self):
- player_str = ''
- player_str += self._num
- player_str += '\t'
- player_str += self._name
- player_str += '\t'
- if self._captain:
- player_str += '(c)'
- else:
- player_str += ' '
- player_str += '\t'
- player_str += self._pos
- player_str += '\t'
- player_str += self._birthday
- player_str += '\t'
- player_str += self._age
- player_str += '\t'
- player_str += self._club
- player_str += '\t'
- player_str += self._group
- player_str += '\t'
- player_str += self._coach
- player_str += '\t'
- player_str += self._country
- player_str += '\t'
- return player_str
-
- def name(self):
- return self._name
-
- def num(self):
- return int(self._num)
-
- def pos(self):
- return self._pos
-
- def age(self):
- return int(self._age)
-
- def birth_month(self):
- return int(self._birthday.split('-')[1])
-
- def birth_day(self):
- return int(self._birthday.split('-')[2])
-
- def birthday(self):
- l = self._birthday.split('-')
- return (int(l[0]) * 10000 + int(l[1]) * 100 + int(l[2]))
- def birth_month_day(self):
- l = self._birthday.split('-')
- return (int(l[1]) * 100 + int(l[2]))
- def country(self):
- return self._country
- def coach(self):
- return self._coach
- def club(self):
- return self._club
- def group(self):
- return self._group
- def captain(self):
- return self._captain
- if __name__ == '__main__':
- print 'file name:',
- fn = raw_input()
- if len(fn) == 0:
- fn = NAME_FILE
- players = readdata(fn)
- q = Question(players)
- # showPlayers(players)
- fl = []
- for f in dir(q):
- if '_' != f[0]:
- fl.append(f)
- def compare_for_sort(p1_doc, p2_doc):
- p1_doc_str = str(p1_doc)
- p1_idx = int(p1_doc_str[:p1_doc_str.find('.')])
- p2_doc_str = str(p2_doc)
- p2_idx = int(p2_doc_str[:p2_doc_str.find('.')])
- return cmp(p1_idx, p2_idx)
- fl.sort(lambda p1, p2:\
- compare_for_sort(\
- q.__getattribute__(p1).__doc__,
- q.__getattribute__(p2).__doc__\
- ))
- for f in fl:
- print 'Q:', q.__getattribute__(f).__doc__
- if 'birthday_same_me' == f:
- month = 12
- day = 2
- print 'month(1-12):',
- try:
- input_month = int(raw_input())
- if input_month > 0 and input_month < 13:
- month = input_month
- else:
- raise('')
- except:
- print month
- print 'day(1-31):',
- try:
- input_day = int(raw_input())
- if input_day > 0 and input_day < 31:
- day = input_day
- else:
- raise('')
- except:
- print day
- print 'A:', str(month), '-', str(day), ':', q.__getattribute__(f)((month, day))
- elif 'country_coach_group' == f:
- name = 'Danijel Pranjic'
- print 'player name:',
- try:
- input_name = raw_input()
- if len(input_name) != 0:
- name = input_name
- else:
- raise('')
- except:
- print name
- print 'A:', q.__getattribute__(f)((name,))
- elif 'older_than_me' == f:
- age = 30
- print 'age:',
- try:
- age = int(raw_input())
- except:
- print age
- print 'A:', q.__getattribute__(f)((int(age),))
- else:
- print 'A:', q.__getattribute__(f)()
- exit(0)
复制代码- Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
- >python py2012EuropeanCup.py
- file name:
- Q: 1.年纪最小的人
- A: Jetro Willems
- Q: 2.年纪最大的人
- A: Kostas Chalkias
- Q: 3.哪一天出生的人最多
- A: 14日
- Q: 4.和你生日相同的人,如果有的话找出来
- month(1-12):
- 12
- day(1-31):
- 2
- A: 12 - 2 : Danijel Pranjic
- Q: 5.给定一个球员名,列出国籍与教练,处在哪个小组
- player name:
- Danijel Pranjic
- A: Croatia,Slaven Bilic,C
- Q: 6.哪个俱乐部的人最多
- A: Bayern Munich
- Q: 7.队长里打什么位置的最多
- A: MF
- Q: 8.比你年纪大的有多少人
- age:
- 30
- A: 62
- Q: 9.列出365天里所有人都不过生日的日期
- A: 1-01,1-03,1-07,1-20,1-21,1-29,1-30,1-31,2-06,2-07,2-08,2-10,2-17,2-19,2-22,
- 27,3-01,3-03,3-05,3-08,3-14,3-15,3-22,3-23,3-24,3-25,3-31,4-01,4-11,4-12,4-14,
- 15,4-17,4-23,4-24,4-26,5-03,5-06,5-10,5-12,5-14,5-18,5-25,5-28,6-01,6-02,6-05,
- 07,6-11,6-14,6-16,6-18,6-23,6-24,6-26,6-30,7-01,7-02,7-04,7-05,7-13,7-18,7-19,
- 23,7-25,7-27,7-29,7-30,7-31,8-05,8-07,8-09,8-10,8-22,8-25,8-26,8-29,9-01,9-07,
- 11,9-16,9-17,9-23,9-24,9-25,10-01,10-02,10-08,10-11,10-14,10-17,10-19,10-21,10
- 6,10-30,10-31,11-02,11-03,11-07,11-09,11-13,11-14,11-16,11-18,11-19,11-20,11-2
- 11-23,11-24,11-28,11-29,12-01,12-04,12-05,12-10,12-18,12-22,12-23,12-25,12-29,
- -31
- Q: 10.打各个位置的人一共有多少
- A: MF : 130, GK : 48, FW : 76, DF : 114
复制代码 |
|