2017-05-11 1 views
1

私はこのカタを使って作業していますが、私は解決策を見ていますが、私の質問に答えるのに十分なものはありません。数字をとって数字を集計します

問題テキスト:番号89は、このカタのタイトルに部分的に導入されたプロパティを満たす2桁以上の最初の整数です。 "ユーレカ"と言うのは何ですか?この合計が同じ数を与えるからです。実際に

は:89 + 9^2

この特性を有するの次数が135

再度このプロパティを見る8^1 = 135 = 1^1 + 3^2 + 5^3

範囲[a、b](を含む)を定義する2つの整数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に等しくなければならない「[1、2、3、4、5、6、7、8、9、10]を返却します、9,89]。 なぜそれが10を過ぎ、89を追加しないのか分かりません。これを行うためのより効率的な方法があると確信していますが、まだ学習していますので、ループ、条件などの基礎で作業したいと思っています。

フィードバックいただきありがとうございます。私はenumerateが過去にそれを使用して本当に便利だったのを知っていますが、私はここでどのように役に立つのかをかなり概念化できませんでした。 <。ここでは私のために働いた解決策、クリーンアップでのPLZコメントなどです!

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を渡すと、1つの要素を持つリスト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の数字を反復するには、nを法とし(最下位桁を得るために)、次に10で割ります(最下位桁を切り落とすために)。たとえば、123の数字(逆順)は[(123%10)、(12%10)、(1%10)]です。

数字の意味は次のとおりです。

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_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 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

なぜ、enumerate()が役立つのかは、なぜなら、カウンターなしであなたに与えられるからです。 –

0

あなたがするためにgeneratorsumenumerateを使用することができますがこの例のようにコードを簡素化:

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] 
関連する問題