2012-06-08 5 views
2

저는 CoderByte 'Python'질문을 통해 연구하고있었습니다. 시간은 본질적이므로 코드가 실제로 읽을 수는 없지만 매우 간단합니다. 나는 당신의 접근 방식에 관심을 가질 것이다. 내 코드는 일부 단어에 대해서는 작동하지만 '문장'으로 테스트하면 내게 다른 결과를주고, 우리가 말하는 것처럼 디버깅합니다. 내 생각에 대해 의견을 말하십시오!이 파이썬 퍼즐을 훨씬 더 우아한 방법으로 해결하는 방법은 무엇입니까?

질문 :

는 함수 LetterChanges (STR) 전달되는 STR 매개 변수를 가지고 다음과 같은 알고리즘을 사용하여 수정 되세요. 문자열에있는 모든 문자를 알파벳 뒤에 나오는 문자로 바꿉니다 (즉, c는 d가되고 z는 a가됩니다). 그런 다음이 새 문자열 (a, e, i, o, u)에서 모든 모음을 대문자로 바꾸고 마지막으로이 수정 된 문자열을 반환하십시오. 아래 상자의 매개 변수 테스트 기능을 사용하여 다른 인수로 코드를 테스트하십시오. 코드 내의 함수 이름을 수정하지 마십시오. 함수 외부에 코드를 두지 말고 return 키워드를 사용하여 함수 내에서 응답을 반환하십시오.

내 코드 :

def LetterChanges(str): 
    a = map(chr, range(97, 123)) 
    b = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 
    b.remove('a') 
    b.append('a') 
    c = dict(zip(a,b)) 
    v = ['a', 'e', 'i', 'o', 'u'] 

    k = str 
    for i in range(len(str)): 
     if str[i] in a: 
      k = k.replace(str[i], c[str[i]]) 

    l = k 
    for i in range(len(k)): 
     if k[i] in v: 
      l = l.replace(k[i], k[i].upper()) 

    print l 

# this call is needed to test your function 
# keep this when you submit your code 
LetterChanges(str) 

출력 :

zddzst -> AEEAUU {wrong}! 
sentence -> UfOUfOdf {wrong}! 
+0

'string.lowercase'은 (는) 친구입니다. –

+0

"시간은 본질적이다"누군가가 당신에게 정확한 답을 빨리 주면 더 많은 점수를 얻으니까 그게 맞나요? –

+1

이미 코드를 제출했습니다. 이제 내 솔루션을 수정하면 내 솔루션이 어리석은 것처럼 보입니다. 이 점을 해결하려고한다면 나는 이것을 게시하지 않았고 누군가 대답을 기다릴 것입니다! 내 실수 한 코드에 대한 코멘트를 방해하는 '시간은 본질의 것'이라고 말했다. – ThinkCode

답변

9

내가 이것에 대한 str.translate()을 사용, 그것은 다음과 같이 보일 수 있습니다

import string 

def LetterChanges(s): 
    orig = string.letters 
    new = string.ascii_lowercase[1:] + 'a' + string.ascii_uppercase[1:] + 'A' 
    for vowel in 'aeiou': 
     new = new.replace(vowel, vowel.upper()) 

    table = string.maketrans(orig, new) 
    return s.translate(table) 

전 충분한 : 그것은 한 번만 계산되도록

>>> LetterChanges('sentence') 
'tfOUfOdf' 

더 효율성을 위해, 내가 대신 각 함수 호출에의 함수의 외부 table의 생성을 이동합니다. 또한 단지 하드 코드 같은 orignew의 종료 값 :

import string 

def LetterChanges(s): 
    t = string.maketrans('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 
         'bcdEfghIjklmnOpqrstUvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZA') 
    return s.translate(t) 

편집 : 여기 coderbytes 제한으로 작동합니다 버전입니다 :

+0

니스! 나는 두 번째 접근법을 제안하려고했고, 그 다음에는 그것을 게시했습니다. :) – cheeken

+0

이것은 coderbyte입니다. import 문을 지원하는지 확인해야합니다. 'sorted()'는 나에게 오류를 주었고 'zip (a, b)'도 마찬가지였다. – ThinkCode

+0

정의되지 않은 모듈에는 'maketrans'객체가 없습니다. – ThinkCode

0

당신은 뭔가를 시도 할 수는 :

sentence = <your sentence> 
c = <your alphabet mapping> 
v = <vowels> 

def letterMap(x): 
    letter = c[x] 
    if letter in v: 
     return letter.upper() 
    else: 
     return letter 


letterList = map(letterMap, sentence) 
answer = "".join(letterList) 
2

그냥 다른 솔루션

def LetterChanges(letters): 
    """ 
    >>> LetterChanges('abcd') 
    'bcdE' 

    >>> LetterChanges('ABCD') 
    'BCDE' 

    >>> LetterChanges('sentence') 
    'tfOUfOdf' 
    """ 
    letter_map = {} 
    changed_letters = [] 
    for old_letter in letters: 
     if old_letter in letter_map: 
      new_letter = letter_map[old_letter] 
     else: 
      ordinal = ord(old_letter) 
      if 65 <= ordinal <= 90: # ord('A'), ord('Z') 
       new_letter = chr((ordinal - 64) % 26 + 65) 
      elif 97 <= ordinal <= 122: # ord('a'), ord('z') 
       new_letter = chr((ordinal - 96) % 26 + 97) 
      else: 
       new_letter = old_letter 

      if new_letter in 'aeiou': 
       new_letter = new_letter.upper() 
      letter_map[old_letter] = new_letter 
     changed_letters.append(new_letter) 
    return ''.join(changed_letters) 
+0

예쁜 기술, 고마워. – ThinkCode

관련 문제