新約:標準入力の受け取りその2(Python3対応版)

はい！

こちらは過去記事の
[新約:標準入力の受け取りその1(Python3対応版)](https://qiita.com/clarinet758/items/33bed8bb2907c68b5242)
からの焼き直し？記事です。
・今回は出力ついても触れます。
・実際の問題に基づいて進行します。
・やや変則的な入出力についても触れます。無視してください。
・解法のようなものには殆ど触れません。
・ifやforとかについては少しだけ触れます。
・PEPで推奨されている方針はあってもインデントや記号の前後に半角スペースとかは宗教だと思います。

対象とした問題は
[AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～](https://qiita.com/drken/items/fd4e5e3630d0f5859067)
によって選ばれた問題で
[AtCoder Beginners Selection](https://beta.atcoder.jp/contests/abs)
から内容の確認と実際の提出などを行っています。

1問目
[PracticeA - はじめてのあっとこーだー（Welcome to AtCoder）](https://beta.atcoder.jp/contests/abs/tasks/practice_1)

```python
# -*- coding: utf-8 -*-
# 整数の入力
a = int(input())
# スペース区切りの整数の入力
b, c = map(int, input().split())
# 文字列の入力
s = input()
# 出力
print("{} {}".format(a+b+c, s))
```

これはもう問題文ページに掲載があるものです。最後の出力は ```print(a+b+c,s)```だけでもAC可能なのですけども何故に入門の1問目にformat記法を用いているのかやや不思議。もちろん後々は知っていたほうがいいのですけど。。コード内にコメントで補足もあるので以上で。

2問目
[ABC086A - Product](https://beta.atcoder.jp/contests/abs/tasks/abc086_a)

```python
a,b=map(int,input().split())

if (a*b)%2:
    print("Odd")
else:
    print("Even")
#print(["Even","Odd"][a*b%2])
#print("Odd" if a*b%2 else "Even")
#print("Even" if a%2==0 else "Even" if b%2==0 else "Odd")
```


```a,b=map(int,input().split()``` で空白区切りの2つの数を受け取ります。
コメントアウトしてない部分は単純なif分岐とprint出力です。
```print(["Even","Odd"][a*b%2])``` はaとbの積の偶奇によりリスト内に用意した文字列が出力されます。
```print("Odd" if a*b%2 else "Even")``` は通称で三項演算子と呼ばれています。慣れるまで混乱することもあります。
```print("Even" if a%2==0 else "Even" if b%2==0 else "Odd")``` 多重に書くことも可能です。自分で書くのも他の人の解答で使われていて読む時も慣れです。
```"True" if (条件) else "False"``` が一応テンプレ？になると思います。

3問目
[ABC081A - Placing Marbles](https://beta.atcoder.jp/contests/abs/tasks/abc081_a)

```python
s=input()
print(s.count('1'))
#print(input().count('1'))
```

コメントアウトしてない部分は普通です。特に新しい要素はないと思います。 ```print(input().count('1'))``` は変数に代入せず直接も可能ですというような例です。

4問目
[ABC081B - Shift only](https://beta.atcoder.jp/contests/abs/tasks/abc081_b)

```python
n=int(input())
a=[int(i) for i in input().split()]
ans=10**9
for i in a:
    tmp=0
    while i%2==0:
        tmp+=1
        i//=2
    ans=min(ans,tmp)
print(ans)

"""
def sol(i):
    tmp=0
    while i%2==0:
        tmp+=1
        i//=2
    return tmp

input()
print(min([sol(int(i)) for i in input().split()]))
"""
```

```[int(i) for i in input().split()]``` は1行で書かれたn個の数をリスト形式で受け取る感じです。
実際に行われていることとしては ```input().split()``` で数字を空白区切りで受け取りをしてからforで取り出してそれぞれの要素をintでキャストして新たなリストを作成している感じだと思いますが無視していいと思います。リスト内でfor文を書いたりするのは内包表記と呼ばれる記法です。慣れです。 例えば ```a=[int(i) for i in range(19) if int(i)%2==0]``` でifで条件にあうものだけ抽出も可能です。"""でくくってる箇所は無視していいと思います。

5問目
[ABC087B - Coins](https://beta.atcoder.jp/contests/abs/tasks/abc087_b)

```python
a=int(input())
b=int(input())
c=int(input())
x=int(input())
ans=0
for i in range(a+1):
    for j in range(b+1):
        tmp=x-(i*500+j*100)
        if 0<=tmp and tmp//50<=c: ans+=1
print(ans)
```

新しいことや変則的な書き方はありません。今更ですがifは内包表記などの[]の内側でなくても1行で書くことも出来ます。

6問目
[ABC083B - Some Sums](https://beta.atcoder.jp/contests/abs/tasks/abc083_b)

```python
n,a,b=map(int,input().split())
ans=0
for i in range(1,n+1):
    tmp,cnt=0,i
    while i:
        tmp+=i%10
        i//=10
    if a<=tmp<=b: ans+=cnt
print(ans)
```
新しいことや変則的な書き方はありません。

7問目
[ABC088B - Card Game for Two](https://beta.atcoder.jp/contests/abs/tasks/abc088_b)

```python
n=int(input())
a=[int(i) for i in input().split()]
a.sort()
ans=0
for i,j in enumerate(a[::-1]):
    if i%2: ans-=j
    else:   ans+=j
print(ans)
```

入出力については新しいことはありません。リストは ```a.sort()``` で昇順ソートが出来ます。 ```a[::-1]``` でリストを逆順から見ます。昇順ソート済みのものであれば降順として扱うことも出来ます。```for i,j in enumerate(a[::-1])``` はjが普通にforで回した時に取り出せる配列内の要素で、iにはインデックス値が入ります。おそらく使う機会は多いと思います。

8問目
[ABC085B - Kagami Mochi](https://beta.atcoder.jp/contests/abs/tasks/abc085_b)

```python
n=int(input())
d=set()
for i in range(n):
    d.add(input())
print(len(d))
```

```d=set()``` は空で宣言するときは多分この書き方になります。多分ですけど。。。何か最初からデフォルトで入る値があれば ```d={0}``` とかで大丈夫です。 for以降で直接addしてますが、 x=input() してから d.add(x) とかの方が丁寧です。

9問目
[ABC085C - Otoshidama](https://beta.atcoder.jp/contests/abs/tasks/abc085_c)

```python
n,y=map(int,input().split())
for i in range(n+1):
    for j in range(n+1-i):
        tmp=y-(i*10000+j*5000)
        if tmp>=0 and n==i+j+tmp//1000:
            print(i,j,tmp//1000)
            exit()
print("-1 -1 -1")
```

新しいことは入出力については特にありません。 けどもたまには何か補足を書きます。。forループ処理中に解が見つかって出力するときには終了方法にお気をつけ下さい。書き方にもよるのですが上記の場合にexit()ではなくbreakでforから抜けると解なし場合の ```print("-1 -1 -1")``` が出力されてしまいます。あとこの-1...は何か楽な方法ないかと思ったのですが発見できず直書きになってます。
追加で今更 ```map(int,input().split())``` について補足すると1行で同じ型のものしか出来ないです。多分。。 人名などstr型のものを受け取る場合は ```map(str,input().split())``` で、人名と年齢など受け取る時も一旦はstrで受け取って年齢はあとからintでキャストするしかないかなと思います。多分。。。

10問目
[ABC049C - 白昼夢 / Daydream](https://beta.atcoder.jp/contests/abs/tasks/arc065_a)

```python
s=input()
s=s.replace("eraser","").replace("erase","").replace("dreamer","").replace("dream","")
print("NO" if len(s) else "YES")

#print(["YES","NO"][len(input().replace("eraser","").replace("erase","").replace("dreamer","").replace("dream",""))>0])
```

解法とかではABS11問の中で最も手こずりました。けども解法とかは今回は触れないので省略します。コメントアウトしていない方が入出力については新しいこともなく普通の丁寧な書き方です。
コメントアウトしている方はinput()で受け取りをして変数に代入せずreplaceして、最終形の文字列の長さによってYES,NOさせてます。可読性も低いですし新たに覚える書き方としては非推奨かと思います。ですけどPython3でACが1人だけで参考のために見に行ったら書き方がコレという現象が起きるかもしれないのでこういう書き方もあるかもしれない、という程度のお話で。。。

11問目
[ABC086C - Traveling](https://beta.atcoder.jp/contests/abs/tasks/arc089_a)

```python
n=int(input())
 
d=[0,0,0]
for i in range(n):
    t,x,y=map(int,input().split())
    tmp=abs(x-d[1])+abs(y-d[2])
    if t-d[0]>=tmp and ((t-d[0])-tmp)%2==0:
        d=[t,x,y]
    else:
        print("No")
        exit()
print("Yes")
```

後から思い出したのですが ```d=[0,0,0]``` は、 ```d=[0]*3``` で良かった気がします。あとこれ解法としては距離の偶奇だけわかればいいのでabs()する必要なかった気がします。入出力については新しいことは特にありません。

以上です。
ご清聴ありがとうございました。

ライターによって？出力の指定が YES|Yes|yes とかなのとてもだるいので辛いです。