Fork me on GitHub

[编程题目]泥塑课

虽然不是难题,但是我这个菜鸟还是写了三个小时。

题目:

小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过250立方厘米的等量橡皮泥,教大家做泥塑。在上课过程中,她发现每个班都恰好有一个小朋友会去抢另一个小朋友的橡皮泥,于是她决定,在正式开始做泥塑前,让大家把手里的橡皮泥都捏成一个立方体,并且测量手里捏好的橡皮泥的长、宽和高。这样,她就可以知道谁被谁抢了橡皮泥了。

小米老师在不同的学期可能会带一个班或者同时带多个班,因此输入数据可能有一组或者多组。每组输入数据的第一行为一个整数n,表示了这个班的小朋友数,之后n行每行包括了由空格分隔的三个整数和一个字符串,那个字符串表示了小朋友的名字,前面三个整数则是这个学生手里橡皮泥块的长、宽、高数据。按照幼儿园的规定,每个班最多有9个小朋友,最少也要有2个小朋友,每个小朋友在学籍系统中的名称不超过8个字符长。当出现一个班级的小朋友数为-1时,表示没有更多的班级了。

输出行数与小米老师带的班级数相同,形式为“X took clay from Y.”,具体请参考样例输出。

 

解题代码如下:

 1 # coding: utf-8
 2 """
 3 __title__   =  '泥塑课'
 4 __mtime__   =  '15/12/31'
 5 __author__  =  'XueWeihan'
 6 
 7 """
 8 
 9 
10 def get_input():
11     """获取控制台输入的值
12     """
13     _input = raw_input()
14     _input = str_to_int(_input)
15     return _input
16 
17 
18 def str_to_int(str):
19     try:
20         return int(str)
21     except Exception as e:
22         return str
23 
24 
25 def print_format(max_person, min_person):
26     print '%s took clay from %s.' % (max_person, min_person)
27 
28 
29 class Student(object):
30     def __init__(self, name, volume):
31         self.name = name
32         self.volume = volume
33 
34 
35 def handle(input_data):
36     """处理逻辑
37     """
38     # gruop_list 存放的是不同班级的list
39     group_list = [] 
40     
41     # class_list 存放的是一个班级中Student的对象
42     class_list = []
43     
44     # i_index 和 e_index用于把每个班级的数据分出来
45     i_index = 0
46     for fi_input_list in input_data:
47         if isinstance(fi_input_list, int):
48             e_index = i_index + fi_input_list + 1
49         else:
50             # 通过切片分出每个班级的数据(因为每个班级的第一个数据都是总数,不需要分析,故+1)
51             for i in input_data[i_index+1:e_index]:
52                 # 分析每个同学的数据
53                 student_data_list = [str_to_int(fi_person_data)
54                                     for fi_person_data in i.split(' ')]
55 
56                 volume = student_data_list[0] * student_data_list[1] * student_data_list[2]
57                 name = student_data_list[3]
58                 
59                 
60                 studnet = Student(name, volume)
61                 
62                 class_list.append(studnet)
63             if class_list:
64                 group_list.append(class_list)
65             i_index = e_index
66         # 当分析完一个班的数据之后,需要重新把class_list清空
67         class_list = []
68     
69     # 找出每个班级中volume最大和最小的student对象
70     for fi_group_list in group_list:
71         max_num = max([fi_class_list.volume for fi_class_list in fi_group_list])
72         min_num = min([fi_class_list.volume for fi_class_list in fi_group_list])
73         max_obj = filter(lambda x :x.volume == max_num, fi_group_list)[0]
74         min_obj = filter(lambda x :x.volume == min_num, fi_group_list)[0]
75         print_format(max_obj.name, min_obj.name)
76         
77         
78 def main():
79     input_list = []
80     while 1:
81         _input = get_input()
82         if isinstance(_input, int):
83             # 当遇到-1时结束
84             if _input < 0:
85                 handle(input_list)
86                 break
87         input_list.append(_input)
88 
89 main()

 

posted @ 2015-12-31 22:47  削微寒  阅读(853)  评论(1编辑  收藏  举报