ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

【競技プログラミング】標準入力の受け付けと各桁の合計

概要

競技プログラミングの復習。

近況

直近の記事から早2ヶ月。CCIEの勉強もロクにせず、僕は『ゼロからはじめるデータサイエンス』の写経もそこそこに、CTFや競技プログラミングに手を付けていた……。

ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践

ゼロからはじめるデータサイエンス ―Pythonで学ぶ基本と実践

Pythonでの標準入力の受け付け

「競プロやってみよう」と思い立ったその日から、AtCoder Programming Gude for BeginnersでC++のお勉強をしてたんだけど、身の回りの競プロに勤しんでいる人たちがPythonでやってるのを見て、自分もPyhtonistaとして参戦することを決意した(仕事でも使ってるし)。

先日のCodeFlyerが初参戦。結果は2完。事前にPythonでの練習をしていなかったので、問題以前に標準入力の受け付け方が分からず、慌ててググるなど。

Pythonで競技プログラミングする時に知っておきたいtips(入出力編)

input()

標準入力から1行読み込んで、末尾の改行を除いて標準出力に出す。複数行を読み込みたい場合、ケースに合わせて工夫が必要(行数が固定ならfor in range(行数)でリスト内包する、など…引用記事中にケース毎の説明があるのでいったん割愛)。

$ cat input.py 
N = input()

print("input is " + N)

# 文字列型の場合
$ echo "ABC" | python input.py 
input is ABC
$

# 数値型の場合
$ echo 123 | python input.py 
input is 123
$

# 複数行の場合
$ python -c "print('THIS\n IS\n TEST')" | python input.py 
input is THIS
$ 

各桁の合計を求める

……必要のある問題が出てきて、これも先人の知恵を頼った。

http://suzu6.hatenablog.com/entry/2017/09/22/004355

def digitSum(n):
    s = str(n) # 1
    array = list(map(int, list(s))) #2
    return sum(array) #3
  1. 値nをstr()で文字列に変換する
  2. map()でsを1文字ずつint型に変換してリスト(array)に追加する
  3. sumでarrayの合計を算出し、returnする

map()

mapは第1引数に関数、第2引数にイテレータを指定して、第2引数の各要素を引数として第1引数を実行した結果をイテレータとして返す関数っぽい。どうやらPython3の場合、そのままだとmapオブジェクト(print()すると「」みたいなのが出力される)なので、リストとして扱いたい場合はlist()で包んでやればよい。

2. 組み込み関数 — Python 3.6.5 ドキュメント

引用したブログ記事内にも説明がある通り、リスト内包で同じことができる。

array = list(int(i) for i in list(s))