[编程题目]泥塑课
虽然不是难题,但是我这个菜鸟还是写了三个小时。
题目:
小米是一个幼儿园老师,每学期的泥塑课上,她都会给每个学生发不超过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()
作者:削微寒
扫描左侧的二维码可以联系到我
本作品采用署名-非商业性使用-禁止演绎 4.0 国际 进行许可。