2017-05-11 3 views
1

저는이 카타를 통해 작업하고 있지만 솔루션을 살펴 보았지만 아무 것도 내 질문에 대답하기에 충분히 유사하지 않습니다.숫자를 가져 와서 숫자를 합칩니다.

문제 텍스트 : 숫자 89는이 카타의 제목에서 부분적으로 도입 된 속성을 충족하는 두 자리 이상의 첫 번째 정수입니다. "유레카"라고 쓰는게 어때? 이 합계가 같은 수이기 때문입니다. 사실상

은 : 89 + 9^2

이 속성을 갖는의 다음 번호는 135

가 다시 속성보기 8^1 = 135 = 1^1 + 3^2 + 5^3

[a, b] 범위를 정의하는 두 개의 정수 a, b를 수신 할 수있는 함수가 필요하며 속성을 충족하는 범위에서 정렬 된 숫자의 목록을 출력합니다 전술 한 바와.

def sum_dig_pow(a, b): # range(a, b + 1) will be studied by the function 
    # your code here 
    lst = [] 
    n = 1 
    tot = 0 
    for i in range(a,b): 
     if i > 9: 
      spl = str(i).split() 
      for item in spl: 
       tot += int(item) ** n 
       n += 1 
       if tot == i: 
        lst.append(i) 
     else: 
      lst.append(i) 
    return lst 

시험은 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [1, 2, 3, 4, 5, 6, 7, 8과 동일해야한다 "돌아 간다 , 9, 89]. 나는 왜 그것이 10을 지나가고 89가 추가되지 않는지를 알 수 없다. 나는 이것을 할 수있는보다 효율적인 방법이 있다고 확신하지만, 여전히 학습 중이므로 루프, 조건문 등의 기초에서 작업하고 싶다.

의견을 보내 주셔서 감사합니다. 나는 열거가 정말로 유용하다는 사실을 알고 있습니다. 과거에는 그것을 사용했지만 저는 그것이 어떻게 도움이되었는지를 개념화 할 수 없었습니다. <. 저를 위해 일한 해결책, 깨끗한 UPS 등으로 주석을 달아주세요.

def sum_dig_pow(a, b): # range(a, b + 1) will be studied by the function 
lst = [] 
for i in range(a,b+1): 
    if i > 9: 
     s = sum_dig(i) 
     if s == i: 
      lst.append(i) 
    else: 
     lst.append(i) 
return lst 

def sum_dig(num): 
n = 1 
tot = 0 
for dig in str(num): 
    tot += int(dig)**n 
    n+=1 
return tot 
+0

숫자의 숫자를 합산하기 위해'sum_of_digits' 함수를 작성하면 더 쉬울 것입니다. 이렇게하면 해당 작업을 자체적으로 수행하는 데 집중할 수 있으며 신뢰할 수있는 단일 함수 호출을 사용할 수 있습니다. –

+0

은 숫자의 * powers *를 더합니다. –

+0

@ juanpa.arrivillaga 수정 해 주셔서 감사합니다. –

답변

1

이 줄은 올바르지 않습니다

spl = str(i).split() 

split 방법은 기본적으로 공간에 문자열을 분할하고 목록을 반환합니다. 따라서 i=10을 전달하면 하나의 요소가있는 목록 인 spl = ['10']이 반환됩니다. 대신 문자열의 각 자릿수를 반복합니다.

for item in str(i): 
    ... 

후속 : 당신은 각 숫자의 인덱스를 계산 enumerate를 사용하여 코드를 줄일 수 있습니다.

def sum_dig_pow(a,b): 
    return [sum(int(y)**(i+1) for i,y in enumerate(str(x))) for x in range(a,b)] 
+1

'str (i)'를 반복 할 수 있기 때문에'.split()'를 호출 할 필요가 없다. – Blender

+0

'1'에서 시작하는 [**'enumerate' **] (https://docs.python.org/2/library/functions.html#enumerate) 할 수 있으므로'i + 1 '매번. –

0

숫자에서 문자열로, 그리고 뒤로 변환하는 데 많은 시간을 소비하는 대신 산술을 사용해보십시오. 숫자 n의 숫자를 반복하려면을 모듈로 10 (최하위 숫자를 얻기 위해)으로 취한 다음 10으로 나누십시오 (최하위 숫자를 떼어 내려면). 예를 들어, 역순으로 123의 자릿수는 [(123 % 10), (12 % 10), (1 % 10)]

입니다. 기능면에서 생각하면 먼저

def sum_of_ith_powers(numbers): 
    result = 0 
    for i, n in enumerate(numbers): # the digits are ordered most-significant to least, as we would expect 
    result += n ** 1 
    return result 

지금 방금 sum_of_ith_powers(digits_of_n(n))를 호출 할 수 있습니다 당신이 대답을 :

def digits_of_n(n): 
    result = [] 
    while n > 0: 
    result.append(n % 10) 
    n = n/10 # in python 3, use 3 // 10 for integer division 
    return reversed(result) # reverse list to preserve original order 

는 힘의 합을 얻는다.당신이 좋아하는 경우에, 당신은 그 동작에 이름 부여 할 수 있습니다 :

def sum_of_digit_powers(n): 
    return sum_of_ith_powers(digits_of_n(n)) 

을하고 다음 카타 해결 기능의 이름을 지정할 수 있습니다 :

def solve_kata(a, b): 
    return [sum_of_digit_powers(n) for n in range (a, b)] 
+2

Ohhhh 왜 열거()가 도움이되는지 이제 완전히 이해할 수 있습니다. 왜냐하면 네가 카운터없이 네가 제공하기 때문이다. –

0

사용할 수를 generator, sumenumerate 순서에 이 예제처럼 코드를 단순화 :

def sum_dig_pow(a,b): 
    for k in range(a,b+1): 
     if k > 9: 
      number_sum = sum(int(j)**i for i,j in enumerate(str(k), 1)) 
      if k is number_sum: 
       yield k 
     else: 
      yield k 

print(list(sum_dig_pow(1,10))) 
print(list(sum_dig_pow(1,90))) 
print(list(sum_dig_pow(1,10000))) 
print(list(sum_dig_pow(10,1000))) 
print(list(sum_dig_pow(1,900000))) 

출력 :

[1, 2, 3, 4, 5, 6, 7, 8, 9] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175] 
[89, 135, 175] 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 89, 135, 175] 
관련 문제