Pythonで解いたっpaizaのキャンペーン対象問題（RANK C）

https://paiza.jp/pages/campaign/paiza-qiita

paizaコラボ企画ということで。順番はキャンペーン対象問題の順で。

時間もないので適当に正解させていきましょう。

Pythonを始めた人やDランク水準の人はこちらの記事を読むことをお勧めします。

https://zenn.dev/yuhi_ili/articles/c8c6d08c882efb

ほかのRANKは下の記事を。

https://qiita.com/c0b23092db/items/35d7f3ca82bc0cb39cc6

## 宝くじ

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/lottery

```py:宝くじ.py
# coding: utf-8
c = int(input())
n = int(input())
q = [int(input()) for _ in range(n)]
for i in q:
    if i == c:
        print("first")
    elif (i + 1 == c and i + 1 <= 199999) or (i - 1 == c and 100000 <= i - 1):
        print("adjacent")
    elif str(i)[2:] == str(c)[2:]:
        print("second")
    elif str(i)[3:] == str(c)[3:]:
        print("third")
    else:
        print("blank")
```
ちなみにpaizaの解法はint型で判別をしているもよう。

## 野球の審判

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/umpire

```py:野球の審判
# coding: utf-8
def main():
    q = w = 0
    for _ in range(int(input())):
        if (a := input()) == "strike":
            q += 1
            if q == 3:
                print("out!")
                break
            print("strike!")
        elif a == "ball":
            w += 1
            if w == 4:
                print("fourball!")
                break
            print("ball!")
main()
```
解説が面倒なので適当に。

```py
        if (a := input()) == "strike":
            q += 1
            if q == 3:
                print("out!")
                break
            print("strike!")
```
```py
        elif a == "ball":
            w += 1
            if w == 4:
                print("fourball!")
                break
            print("ball!")
```
この二つのコードはコピペして、`strike`と`ball`、`q`と`w`を変更したという感じ。
変数が決めた値になった場合はifにある`print()`を表示して`break`で繰り返しから抜ける。そうでなかったら下の`print()`を表示する。
ちなみに`(a := input())`はPythonのセイウチ演算子と呼ばれるものです。
これを使ったらif文の条件式で変数を代入できるという演算子だそうです。
詳しくはこちらを。

https://qiita.com/Yu_unI1/items/3bfcd1b0fbe12ea2dda9

## みかんの仕分け

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/mikan

```py:みかんの仕分け
# coding: utf-8
def main():
    n,m = map(int,input().split())
    w = [int(input()) for _ in range(m)]
    for i in w:
        if i < n:
            print(n)
        else:
            if n % 2:
                print(n * (i // n if i % n <= n // 2 else i // n + 1))
            else:
                print(n * (i // n if i % n < n // 2 else i // n + 1))
main()
```
小さくできそうですね―――小さくしたらこうなった。
```py
# coding: utf-8
n,m = map(int,input().split())
for _ in range(m):
    if (i := int(input())) <= n:
        print(n)
    else:
        print(n * (i // n + (0 if i % n < n // 2 + n % 2 else 1)))
```
ずいぶんとPythonらしいコードになった。
```py
    if (i := int(input())) <= n:
        print(n)
```
さきほどのセイウチ演算子を使って変数に代入を行っている。ちなみに`<=`ではなく`<`を使っても動くが、明確に分けていることを示したいなら`<=`がいいだろう。
ここでは入力された値が定数Nより小さければそのままNを出力するようにしている。
```py
    else:
        print(n * (i // n + (0 if i % n < n // 2 + n % 2 else 1)))
```
次に`n * (i // n + (0 if i % n < n // 2 + n % 2 else 1))`のコードを説明しよう。
`0 if i % n < n // 2 + n % 2 else 1`は「入力された値がある定数Nで割った余り」が左の式、「ある定数Nの半分とNが奇数であれば1を加える」のが右の式である。左の答えが右委の答えより小さければ0にし、大きければ1にする。
 `i // n + (~~~)`の式は`i // n`で倍数を決め、さきほどの式で出力された数値を足し合わせる。さきほどの式がないと、半分以上の場合がうまく出力されない。
`n * (~~~)`の式でさきほどの式をかけると仕分けができる。
説明が適当だな、多分もうちょっと小さくできるはず・・・。

## Fizz Buzz

https://paiza.jp/works/mondai/c_rank_skillcheck_sample/fizz-buzz

FizzBuzz問題自体はDランクレベルアップメニューにある。
その内容を入力した値分回すように変更する。
```py:Fizz Buzz
# coding: utf-8
n = int(input())
for i in range(1,n+1):
    if i % 15 == 0:
        print("Fizz Buzz")
    elif i % 3 == 0:
        print("Fizz")
    elif i % 5 == 0:
        print("Buzz")
    else:
        print(i)
```

## 残り物の量

https://paiza.jp/works/mondai/c_rank_skillcheck_archive/leftover

```py:残り物の量
# coding: utf-8
m,p,q = map(int,input().split())
print(m * (1 - p/100)*(1 - q/100))
```
画像にある計算式を入力する。以上。

## さいごに

RANK Cの問題を解きました。
Minecraftのコマンドで遊んでたらいつの間にかこんな日にちが立っていました。残り何日でしょうか。
・・・RANK Sの記事を出したほうがいいでしょうかねぇ。