LoginSignup
82
101

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-04

はい。 最終更新:2016/11/27

http://qiita.com/clarinet758/items/53e31ec10b873975438b

がPython2でのお話で3を考慮してないのが辛かったので。ですが本記事の内容はかなり適当です。
後々に気が向いたら追記したり、細かく検証して内容がより確かである保証があるようにして編集します。
3の動作確認にはhttps://paiza.ioをつかいました。

一行だけ一つの要素だけ受け取るとき

入力サンプル
0010
20
0030
40
50.0
0060.0
sample.py
h1=input()
h2=int(input())
h3=int(input())
h4=float(input())
h5=float(input())
h6=float(input())
#h=long(input())

print(type(h1),h1)
print(type(h2),h2)
print(type(h3),h3)
print(type(h4),h4)
print(type(h5),h5)
print(type(h6),h6)

出力結果は

結果
<class 'str'> 0010
<class 'int'> 20
<class 'int'> 30
<class 'float'> 40.0
<class 'float'> 50.0
<class 'float'> 60.0

となります。
input() だけで受け取るとstr型、文字列になる。上記サンプルでは記載ないですが、桁が大きい数でもintで大丈夫です。というかlong型というのがないようで、long(iuput())とかもできません。
整数をfloatで受け取ると.0で実数になるようです。先頭0始まりは文字列で受け取ると保存されていました。
出力はprintで型と変数の中身を表示させて確認しました。

上記の受取方法で練習用問題に
http://codeforces.com/contest/616/problem/A
おそらく何も気にせずにint使うとTLEになると思うので是非お試しを。

複数受け取るとき

入力サンプル
3 4
5
1 2 3 4 5
5
1
2
3
4
5
1 2 3 4 5
5
1 6
2 7
3 8
4 9
5 10
1
2
3
4
5
6
7
0
7
1 2
1 3
3 5
2 7
4 6
9 2
1 4
1
2
3
1
2
5
sample.py
#x=3,y=4で2件の数を1行で入力されるのを別々の変数名でうけとる
x,y=[int(i) for i in input().split()]
print(type(x),x)
print(type(y),y)

#n1=5でa1に5件のデータが1行で入力される
n1=int(input())
a1=input().split()
print(type(a1),a1)

#n2=5でa2に5件のデータが5行で入力される
n2=int(input())
a2=[]
for i in range(n2):
    a2.append(int(input()))
print(type(a2),a2)

#偶数だけリストに入れて奇数は無視する
#(単純な条件のフィルタリングで使わないデータは事前に捨てる)
a3=[int(i) for i in input().split() if int(i)%2==0]
print(type(a3),a3)

#n4=5でa4に2つの数が組になった5件のデータが5行で入力される
n4=int(input())
a4=[]
for i in range(n4):
    x,y=[int(i) for i in input().split()]
    #例えば[-y,x]とかにして正負とか左右とか入れ替えも可能です
    a4.append([x,y])
print(type(a4),a4)

#事前にが何行かわからないデータだが0が入力されると最後で0は使わないデータの場合
a5=[]
while 1:
    x=int(input())
    if x==0:
        break
    a5.append(x)
print(type(a5),a5)

#xをキー、yをキーに付属する値のような感じで
#dict型、連想配列
n6=int(input())
a6={}
for i in range(n6):
    x,y=[int(i) for i in input().split()]
    if x in a6:
        a6[x].append(y)
    else:
        a6[x]=[y]
print(type(a6))
for i in a6:
    print(i,a6[i])
#事前にわからないし突然終るし重複する値を省く
#set型
a7=set()
while 1:
    try:
        x=int(input())
        a7.add(x)
    except EOFError:
        break
print(type(a7),a7)

出力結果は

結果
<class 'int'> 3
<class 'int'> 4
<class 'list'> ['1', '2', '3', '4', '5']
<class 'list'> [1, 2, 3, 4, 5]
<class 'list'> [2, 4]
<class 'list'> [[1, 6], [2, 7], [3, 8], [4, 9], [5, 10]]
<class 'list'> [1, 2, 3, 4, 5, 6, 7]
<class 'dict'>
1 [2, 3, 4]
2 [7]
3 [5]
4 [6]
9 [2]
<class 'set'> {1, 2, 3, 5}

あまりPython2と変わらなさそうな感じでしょうか。どのような問題の時にどう使ってみたいなことを気が向いたらいつか補足をします。

追記:2016/11/27
今回はflush形式、対話式の問題の場合です。

http://codeforces.com/contest/727/problem/C

C. Guess the Array

問題は数列aの長さの情報が与えられたあとに、i番目とj番目の和が幾つかを問い合わせるとそれが返ってくるのでn回の問い合わせをして数列aの内容を完成させる。

import sys


n=int(input())
l=[]
ans=[0]*n
for i in range(n):
    if i!=n-1:
        print('?',i+1,i+2)
        sys.stdout.flush()
    else:
        print('? 1 3')
        sys.stdout.flush()
    l.append(int(input()))
ans[0]=int(l[0]-(l[0]+l[1]-l[-1])/2)
for i in range(1,n):
    ans[i]=int(l[i-1]-ans[i-1])
print('!', *ans)

出力後のflushは下の行でsys.stdout.flush()してますが、3系では print('?', i+1, i+2, flush=True) 出来るらしいのでそのほうが良いかもしれません。実際には2.7系しか使ってないので3系はわかりません。2.7系で書いてたものをinputやprintらへんを微調整しただけで3系は知らないこと多いです。

今回書こうとしてるのはflush形式の問題の場合の流れなので2と3の違いは本題ではなく。。。

・システム側からnをint(input())で受け取ります。

・print('?',i+1,i+2)で問い合わせ後にflush処理をします。

・システム側からi+1,i+2番目の和をl.append(int(input()))でリストに保存します。

・問い合わせしてflushと保存をn回繰り返します。

・数列aを特定する情報が揃ったので特定します。

・print('!', *ans)で最終解を出力します。

以上

あまり機会がなかったし、たまにflush処理する問題あっても全スルーしてましたが処理の流れは掴めた気がする。

82
101
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
82
101