しゃちの備忘録

プログラミングを中心とした技術関連の備忘録です(今のところ)

Python3での競技プログラミング用標準入力個人的まとめ

githubに書いてた内容を移植しました. ほとんど差はないです.

Python3で競技プログラミングをする時に, テストケースをなんとか簡単に実行したいというのと,標準入力のやり方について気になったのでまとめました. 参考になれば幸いです.

テストコードテンプレ

solve()以下に実際のコードを記述し, テストケースを入れたフォルダへのパスを書いてあげると,そのフォルダ内全てのファイルの内容を標準出力にして、テストを行います. 提出時はsolve()の内容をまるまると,solve()のコメントを解除してあげます **********は対象のフォルダへのpathを書いてください.

# -*- coding: utf-8 -*-
import sys
import os

##### solveの中に記述,提出時はsolve()のコメントアウトを外して
##### ここから
def solve():
    a, b, c = list(map(int, input().split()))
    if a <= c and c <= b :
        print("Yes")
    else:
        print("No")
# solve()
##### ここまで

test_path = 'test_case'
FILES = os.listdir(test_path)
print('test case => %s\n**********' % FILES)
for FILE in FILES:
    fdr = os.open(test_path + '/' + FILE, os.O_RDONLY)
    print("\ncase : %s" % FILE)
    os.dup2(fdr, sys.stdin.fileno())
    solve()

print("\n**********\nfinish")

こんな感じで試しています. f:id:teru0rc4:20170514193019p:plain

標準入力受け取りテンプレ

標準入力には様々なパターンがありますが,これだけ使えれば良さそうというものだけ書いておきます.

入力が1行で1つだけの場合

文字・文字列

input

S

Sは文字列

s = input()
数値(整数または浮動小数点数)

input

N

Nは整数または浮動小数点数.

n = int(input()) # 整数
n = float(input()) # 浮動小数点数
  • raw_input()が削除され, input()に一本化された
    • python2では, 文字列はrow_input()であった
  • 数値をinput()する場合は, それぞれの状態に応じてキャストしてやる必要がある.
    • 小数点数をintでキャストすると値が切れるので注意

入力が1行で複数ある場合

文字・文字列

input

A B C

A,B,Cはいずれも文字列

s = input().split()
a, b, c = input().split()
  • 分割された文字列はinput().split()でOK
    • 異なる変数に代入したい場合はa,b,cのようにすれば, スペース区切りで各変数に入力される.
数値(整数または浮動小数点数)

input

A B C

A,B,Cはいずれも整数または浮動小数点数.

n = list(map(int, input().split())) # 整数
n = list(map(float, input().split())) # 浮動小数点数
n1, n2, n3 = list(map(int, input().split())) # 整数
n1, n2, n3 = list(map(float, input().split())) # 浮動小数点数
  • python2の頃と見た目はそんなに変わらないが実態が異なる

入力が複数行で1つずつ与えられる場合

最初に入力する個数(N)が与えられて, そこからN個の入力が与えられる場合

input

N
a1
a2
...
aN

a1,a2,...,aNはN個の入力.

N = int(input())
a = []
for i in range(N):
  a.append(input())

あるいは

N = int(input())
a = [input() for i in range(N)]
  • まず個数Nを受け取って, そのあとN個の入力を格納する
  • listの内包表記を使うと美しい……
    • intで取り扱いたいならinput()をキャストすること
終了フラグが来るまで入力を格納し続ける場合
a = []
while True:
    n = input()
    if n == -1: # 終了フラグ
        break
    a.append(n)
  • 判定の部分を文字か数字かでわしゃわしゃする必要はある
    • あまりみたことないけど一応
    • EOFの場合はどうすればいいんですかね……

入力が複数行にわたって複数与えられる場合

input

N M
a11 a12 a13 ... a1M
a21 a22 a23 ... a2M
a31 a32 a33 ... a3M
...
aN1 aN2 aN3 ... aNM
N, M = list(map(int, input().split())) # 整数
a = []
for i in range(N):
    a.append(list(map(int, input().split())))