fork download
  1. import sys
  2. import datetime
  3.  
  4. INF = 10**9
  5.  
  6.  
  7. def is_longer_a_month(date1, date2):
  8. # date format is YYYY-MM-DD
  9. datetime1 = datetime.date(date1[0], date1[1], date1[2])
  10. datetime2 = datetime.date(date2[0], date2[1], date2[2])
  11. return (datetime2 - datetime1 >= datetime.timedelta(days=30))
  12.  
  13.  
  14. with sys.stdin as fi, sys.stdout as fo:
  15. record = [line.strip() for line in fi.readlines()] # bỏ \n ở cuối xâu
  16.  
  17. # chuyển data trong record về dạng tuple
  18. # (số_điện_thoại, activation_year, activation_month, activation_day, deactivation_year, deactivation_month, deactivation_day)
  19. for i in range(len(record)):
  20. data = record[i].split(',')
  21. new_tuple = [data[0]] + list(map(int, data[1].split('-')))
  22. if data[2] == '':
  23. new_tuple.extend([INF, INF, INF])
  24. else:
  25. new_tuple.extend(list(map(int, data[2].split('-'))))
  26.  
  27. record[i] = tuple(new_tuple)
  28.  
  29. record.sort() # chỉ cần sort lại đơn giản
  30.  
  31. last_deactivation_date = (1, 1, 0)
  32. list_last_activation_date = []
  33.  
  34. for line in record:
  35. if len(list_last_activation_date) > 0 and line[0] == list_last_activation_date[-1][0]:
  36. # nếu số điện thoại này đã nằm trong list,
  37. # tức là đã có 1 thông tin về 1 ngày activation nào đó
  38. if is_longer_a_month(last_deactivation_date, (line[1], line[2], line[3])):
  39. # nếu đã ngày ngừng sử dụng trước cách ngày activation này hơn 1 tháng,
  40. # tức là số đã được chuyển cho người khác
  41. list_last_activation_date[-1][1] = (line[1], line[2], line[3])
  42. # nếu không thì không làm gì tiếp cả, số vẫn chưa bị tái sử dụng
  43. else: # nếu số này chưa xuất hiện
  44. list_last_activation_date.append([line[0], (line[1], line[2], line[3])])
  45.  
  46. last_deactivation_date = (line[4], line[5], line[6])
  47.  
  48. for u in list_last_activation_date:
  49. print("{0},{1:0>4}-{2:0>2}-{3:0>2}".format(u[0], u[1][0], u[1][1], u[1][2]))
  50.  
Success #stdin #stdout 0.03s 27968KB
stdin
0987000001,2016-03-01,2016-05-01
0987000002,2016-02-01,2016-03-01
0987000001,2016-01-01,2016-03-01
0987000001,2016-12-01,
0987000002,2016-03-01,2016-05-01
0987000003,2016-01-01,2016-01-10
0987000001,2016-09-01,2016-12-01
0987000002,2016-05-01,
0987000001,2016-06-01,2016-09-01
stdout
0987000001,2016-06-01
0987000002,2016-02-01
0987000003,2016-01-01