2013-09-02 2 views
-1

글자와 색인을 필요로하고 십자말 풀이를 쓰는 프로그램을 작성 중입니다 (십자말 풀이가 아니라 십자말 풀이를 돕는 도구입니다).Crossword Solving Companion

두 가지 버전의 알고리즘을 작성했지만 올바르게 작동하지 않는 것 같습니다. 내가 시도한 첫 번째 시도는 다음과 같았습니다.

fin = open('words.txt') 

def answer_finder(): 
    global fin 
    possible_answers = [] 
    length = int(raw_input("How long is the word?")) 
    letter_1 = raw_input("What is the first letter that you know?").lower 
    letter_1_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_2 = raw_input("What is the second letter that you know?").lower 
    letter_2_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_3 = raw_input("What is the third letter that you know?").lower 
    letter_3_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    for i in fin: 
     if len(i) == length: 
      if i[letter_1_index] == letter_1 and i[letter_2_index] == letter_2 and i[letter_3_index] == letter_3: 
       possible_answers.append(i) 
    return possible_answers 

나는 이것이 다소 추한 것을 알았지 만, 이것은 알고리즘의 개념 증명이었습니다. 사용자 입력은 나중에 변경됩니다. 어쨌든, 이건 내가 시도해도 상관없이 빈 목록을 반환하는 것 같습니다.

두 번째 버전은 기본적으로 동일했지만, 대신 부울 연산자의 중첩 된 IF 문에 의존 :

def answer_finder(): 
    global fin 
    possible_answers = [] 
    length = int(raw_input("How long is the word?")) 
    letter_1 = raw_input("What is the first letter that you know?").lower 
    letter_1_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_2 = raw_input("What is the second letter that you know?").lower 
    letter_2_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_3 = raw_input("What is the third letter that you know?").lower 
    letter_3_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    for i in fin: 
     if len(i) == length: 
      if i[letter_1_index] == letter_1: 
       if i[letter_2_index] == letter_2: 
        if i[letter_3_index] == letter_3: 
         possible_answers.append(i) 
    return possible_answers 

이 너무 빈 목록을 반환합니다. 내가 사용하는 단어 목록은 here입니다. 나는 외부 파일 작업에 익숙하지 않기 때문에 확실한 것을 놓치고 있다고 가정하고 있습니다.

def greater_than_20(): 
    global fin 
    li = [] 
    for i in fin: 
     if len(i) > 20: 
      li.append(i) 
    return li 

def first_letter_length_finder(): 
    global fin 
    length = int(raw_input("How long is the word?")) 
    first_letter = raw_input("What is the first letter?") 
    li = [] 
    for i in fin: 
     if len(i) == length and i[0] == first_letter: 
      li.append(i) 
    print li 
    return li 

편집 : 나는이 기능은 이전의 프로토 타입이 있으며, 모두 잘 작동한다는 점을 지적한다 (. 코드의 주석 처리 된 부분 포함) 그냥 참조를 위해, 여기에 전체의 코드가

fin = open('words.txt') 
print fin 

def greater_than_20(): 
    global fin 
    li = [] 
    for i in fin: 
     if len(i) > 20: 
      li.append(i) 
    return li 

def first_letter_length_finder(): 
    global fin 
    length = int(raw_input("How long is the word?")) 
    first_letter = raw_input("What is the first letter?") 
    li = [] 
    for i in fin: 
     if len(i) == length and i[0] == first_letter: 
      li.append(i) 
    print li 
    return li 

def answer_finder(): 
    global fin 
    possible_answers = [] 
    length = int(raw_input("How long is the word?")) 
    letter_1 = raw_input("What is the first letter that you know?").lower 
    letter_1_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_2 = raw_input("What is the second letter that you know?").lower 
    letter_2_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    letter_3 = raw_input("What is the third letter that you know?").lower 
    letter_3_index = int(raw_input("How many letters into the word is that letter?")) - 1 
    for i in fin: 
     if len(i) == length: 
#   if i[letter_1_index] == letter_1 and i[letter_2_index] == letter_2 and i[letter_3_index] == letter_3: 
#    possible_answers.append(i) 
      if i[letter_1_index] == letter_1: 
       if i[letter_2_index] == letter_2: 
        if i[letter_3_index] == letter_3: 
         possible_answers.append(i) 
    return possible_answers 
+0

단어 파일을 분할하거나 (심지어 읽는 것조차도) 보이지 않습니다 ... 게시하지 않은 코드에서이 작업이 완료 되었습니까? –

+0

오, 아마도. 이 모든 함수는 같은 문서에 있으며, 맨 위에 'fin = open ('words.txt ')'가 있습니다. 각 함수에 '글로벌 지느러미'라고 부릅니다. 나는 여전히 파이썬을 통해 파일을 읽는 것이 매우 새롭다. 그렇게하지 않으면 파이썬을 알려줘. 지금까지 참조 용으로 전체 코드를 추가했습니다. – b4ux1t3

답변

1

당신은 string.lower 방법을 사용하고 있지만 ()를 놓쳤다. 괄호없이

>>> letter_3 = raw_input("What is the third letter that you know?").lower 
What is the third letter that you know?a 
>>> letter_3 
<built-in method lower of str object at 0x104e514e0> 

>>> letter_3 = raw_input("What is the third letter that you know?").lower() 
What is the third letter that you know?a 
>>> letter_3 
'a' 

, 당신은하지 .lower 함수의 하지만 함수 자체를 할당한다.

편집 : (코멘트를 남길 수 없기 때문에) 파일은 반복 가능하므로 \n으로 구분되어 있기 때문에 for i in fin을 사용하는 것이 좋습니다.

+0

오. 남자. 좋은 눈. 나는 그 백 번 과거를 읽었 음에 틀림 없다. 무리 감사. 코드가 완벽하게 작동합니다. 성능 측면에서 알고리즘의 두 버전간에 차이점이 있습니까? 중첩 된 ifs 대 부울 연산자? 대부분 궁금 해서요, 어느 쪽이든 상관 없습니다. – b4ux1t3

+1

무거운 물건은 실제로 단어의 파일을 통과하기 때문에 알고리즘 성능에 별다른 차이가 없습니다. 두 가지 접근 방식 모두 적어도 한 번은 접근합니다. – glifchits

0

데이터를 사용하기 전에 파일에서 데이터를 먼저 읽어야합니다.

fin = file('words.txt').readlines() 
+0

이로 인해 코드가 매우 느리게로드되고 'answer_finder'는 여전히 빈 목록을 반환합니다. 선을 읽는 함수에서 호출해야하는 메서드가 있습니까? 그렇다면 왜 'first_letter_length_finder' (필자는 그 이름을 고쳐야 함)가 적은 입력으로 본질적으로 같은 일을 할 때 작동합니까? – b4ux1t3