2012-01-24 4 views
-1

저는 파이썬과 프로그래밍 전반에있어 완벽한 초보자입니다. Spotify's Best Before puzzle에 대한 프로그램을 만들었습니다. 그것은 받아 들여졌다. 나는 인터넷에서 소란스럽게 보았고 문제에 대한 다른 해결책을 보았고 내가 본 모든 사람들은 importet 여러 모듈을 포함하여 Calendar 모듈을 포함하고있다. 나는 이것이 아마도 좋은 해결책이라는 것을 이해하지만, 나는 모든 것을 스스로 연습하고 싶었다.파이썬 프로그램 단순화

나는 모든 팁과 힌트를 주셔서 감사하지만, 주로 코드를 가져올 필요가 없습니다. 기본적으로 수정이 필요한 printer(a)dataMaker()입니다.

normYear = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 
leapYear = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 
answerList = [] 

u''' Check if any of the integers are years ''' 

def yearCheck(): 
    for x in xrange(0, 3): 
     a = dataList[x] 
     if len(a) > 2: 
      if not len(a) == 4 and int(a) in xrange(2000,3000): 
       if int(a) in xrange(100,1000): 
        dataList[x] = int(a) + 2000 
       else: 
        print data + u" is illegal" 

u''' Make integers and sort ''' 

def integer(): 
    for x in xrange(0, 3): 
     dataList[x] = int(dataList[x]) 
    dataList.sort() 

u''' Check for possible leap years ''' 

def leapYears(): 
    global leapList 
    leapList = [] 
    for x in xrange(0, 3): 
     if dataList[x] % 4 == 0: 
      if dataList[x] % 100 == 0: 
       if dataList[x] % 400 == 0: 
        leapList.append(x) 
      else: 
       leapList.append(x) 

u''' Changes year type ''' 

def defYear(a): 
    global xYear 
    if a in leapList: 
     xYear = leapYear 
    else: 
     xYear = normYear 

u''' Printer ''' 

def printer(a): 
    if dataList[a] < 2000: 
     dataList[a] += 2000 
    year = dataList[a] 
    del dataList[a] 
    if not dataList[0] == 0: 
     month = dataList.pop(0) 
     day = dataList.pop(0) 
     answerList.append(unicode(year)) 
     answerList.append(unicode(u'%02d' % month)) 
     answerList.append(unicode(u'%02d' % day)) 
     print u'-'.join(answerList) 
    else: 
     print data + u" is illegal" 

u''' Looks for legal dates, first [Y<M<D] then [M<Y<D] then [M,D,Y] ''' 

def dateMaker(): 
    for x in xrange(0,4): 
     defYear(x) 
     if x == 0: 
      if dataList[1] <= 12 and dataList[2] <= xYear[dataList[1]-1]: 
       printer(x) 
       break 
     elif x == 1: 
      if dataList[0] <= 12 and dataList[2] <= xYear[dataList[0]-1]: 
       printer(x) 
       break 
     elif x == 2: 
      if dataList[0] <= 12 and dataList[1] <= xYear[dataList[0]-1]: 
       printer(x) 
       break 
     else: 
      print data + u" is illegal" 

u''' Program ''' 

data = raw_input() 
dataList = data.split(u"/") 
yearCheck() 
integer() 
leapYears() 
dateMaker() 
+1

안녕하세요. 이것은 정말로 질문이 아닙니다. 문제가 발생하면 예상 결과와 오류를 지적하십시오. 실제로 작동한다면 http://codereview.stackexchange.com/이이 게시물의 장소입니다. –

+0

좋습니다, 감사합니다 !! –

+0

을 삭제해야합니까? –

답변

1

클래스를 사용하여 다시 구현하려고합니다. 운동으로도 이것은 좋은 연습 일 것입니다.

또한 고려해야 등 문자열,리스트의 반복 가능한 특성을 활용

나는 다음과 같이 처음 2 개 기능을 구현라고 생각 하는데요

는 (그것을 개선 할 가능성이 더 방법이 있어요) :

data = '8/5/32' 
data_list = data.split('/') 

def yearCheck(data_list): 
    # Years may be truncated to two digits and may in that case 
    # also omit the leading 0 (if there is one), so 2000 could 
    # be given as "2000", "00" or "0" (but not as an empty string). 
    # Further examples: 
    # if 2099, could be given as 99 
    # if 2005, could be given as 05 or 5 
    # 199 will not happen i.e. doesn't say that years may be 
    #  truncated to three digits 
    for index, item in enumerate(data_list): 
     if len(item) > 4: 
      # e.g. 30000 
      print item, '- Data is invalid' 
      return 
     if len(item) == 4 and int(item) not in xrange(2000, 3000): 
      # e.g. 3015 
      print item, '- Data is invalid' 
      return   
     if len(item) == 3: 
      # e.g. 199 
      print item, '- Data is invalid' 
      return 
     if len(item) < 3 and int(item) in xrange(32, 100): 
      data_list[index] = int(item) + 2000 
    return data_list 

def integer(data_list): 
    int_data_list = [int(item) for item in data_list] 
    return int_data_list.sort() 

yearCheck(data_list) 
integer(data_list) 
print data_list