Digits Multiplication (Library 2.0) - 各桁の数字を掛け合わせ
Library2.0は簡単な問題が多いので、さくさく進んでいくが、ブログに書くのが追いつかない…。
どんな問題?
Digits Multiplication
http://www.checkio.org/mission/digits-multiplication/
整数の各桁の数字(0を除く)を掛け合わせよ。
例えば 123405 なら 0を除いた各桁1,2,3,4,5を掛け合わせて、1*2*3*4*5=120 となる。
例題:
checkio(123405) == 120 checkio(999) == 729 checkio(1000) == 1 checkio(1111) == 1
どうやって解く?
- 数字から、各桁の数字を取り出してリスト化
- 数字リストを掛け合わせる
の2つに分けて考える。
まず、各桁を取り出すには、数字を文字列にしてから1文字ずつ分解するのが簡単だろう。
digits = [int(c) for c in str(number) if c != '0']
これで、0を除いた各桁の数字のリストが得られる。
数字の合計なら sum() 関数が用意されているが、掛け合わせる関数は用意されていないようなので、自分で mul() という関数を作成した。
def mul(numbers): result = 1 for n in numbers: result *= n return result
まとめ
def checkio(number): digits = [int(c) for c in str(number) if c != '0'] return mul(digits)
別解を考える
あっさり終わったので、今回も別解を考えてみる。
まず、掛け算は、もっと簡単にできないものか。リストの各要素に対して演算を行うようなものがあった気がする・・・。
調べてみたら、functools.reduce だった。Python2ではビルトインだったが、Python3からはfunctoolsに追いやられたらしい。あまり使うなということだろうか?
functionはラムダ式で書いてもいいが、operator.mulで掛け算が定義されているので、それを使う。
return functools.reduce(operator.mul, digits, 1)
まとめ2
import functools import operator def checkio(number): digits = [int(c) for c in str(number) if c != '0'] return functools.reduce(operator.mul, digits, 1)
他の人の答え
0を除外するのに、str(number).replace('0', '') としている人も多かった。確かにね。
あとは、evalを使った解法。
return eval('*'.join(list_num))
http://www.checkio.org/mission/digits-multiplication/publications/Gennady/python-27/first/
'1*2*3*4*5' という文字列を使って、evalで評価。なるほど。