summer_tree_home

Check iOでPython3をマスターするぜっ

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

どうやって解く?

  1. 数字から、各桁の数字を取り出してリスト化
  2. 数字リストを掛け合わせる

の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で評価。なるほど。