AtCoderで始めるPythonプログラミング入門 - 1

これは、プログラミングコンテストを使ったPythonプログラミング入門です。よくある入門書とちがい、コンテストの問題をどんどん解いていき、必要になったらそのときに、足りない分を勉強する、というやり方をとっています。

プログラミングやPythonの知識がゼロの人、プログラミングは分かるけどコンテストはやったことない人、をターゲットにしています。日本で一番有名なコンテストサイト『AtCoder』と、人気プログラミング言語『Python』を使います。


プログラミングコンテストってなに?
プログラミングの力を競争(きょうそう)するコンテストです。問題が与えられるので、それを解くプログラムを書いて提出します。どれだけ多くの、ちゃんと動くプログラムが提出できたかで、順位が決まります。

いろいろなタイプのものがありますが、よくあるのが
・インターネットで参加する
・1~2週に一回
・1時間半くらい
・5問くらい
・順位やランクがリアルタイムで分かる
・レーティング(強さを表すスコア)がつく
といったものです。


問題1
さて、いきなりですが、実際にコンテストに出された問題を見てみましょう。

ある文章wが入力されます。これの最後に”s”をつけて、出力しなさい。
(AtCoder Beginner Contest 029-A 改)

問題の意味は難しくありませんね。文章wの最後に”s”をつけるプログラムを書けばいいようです。たとえば、wが”cat”なら、”cats”にしてあげればよいのです。しかし、『入力』『出力』とはどういうことでしょうか?これは、言葉で説明するよりも、図にしたほうが分かりやすいでしょう。

f:id:yambe2002:20181220133145p:plain

右の青い四角が、あなたが書くプログラムです。その四角に入ってくる矢印が「入力」(Cat)、その四角から出ていく矢印が「出力」(Cats)になります。ようするに、あなたのプログラムに文章wが入ってくるので、それに"s"を付けて返してよこしなさい、という意味になります。

このように、プログラムに入ってくるもの(データ)を「入力」、プログラムから出ていくもの(データ)を「出力」と呼びます。

ではさっそく、これをやってくれるプログラムを書いてみましょう。まだPythonは勉強していないので、とりあえず日本語でそれっぽく。

文章wが入力される

wの最後に"s"を付ける

wを出力する

できました。あとはこれをPythonに直してあげればよいのです。


Pythonを準備しよう
では次に、パソコンにPythonをインストールしましょう。書いたプログラムがちゃんと動くか確かめるのに必要ですから。

なお、すでにPythonがパソコンにインストールされていたら、この章は飛ばしてもらってかまいません。

※Windowsの場合

まず、ブラウザで https://www.python.org/ にアクセスします。英語のページですが、怖がることはありません。

上のほうにある「Downloads」メニューにマウスを移動させると、「Download for Windows」が出てくるので、それをクリックしてください。
f:id:yambe2002:20181220141608p:plain

「Python-x.x.x.exe」といった名前のファイルがダウンロードされたはずです。それをダブルクリックし、あとは「すべてのユーザー」を選択して「次へ」をクリックしていってください。自動的にPythonのインストールが開始します。もしかしたら、途中で管理者(かんりしゃ)パスワードが要求されるかもしれません。

インストールが終わったら、Windowsの「スタート」メニューに「Python 3.x」があることを確認してください。その中の「IDLE」が、この記事で使うエディタ(プログラムを書くために使うアプリケーション)になります。

※Macの場合

まず、ブラウザで https://www.python.org/ にアクセスします。英語のページですが、怖がることはありません。

上のほうにある「Downloads」メニューにマウスを移動させると、「Download for Mac」が出てくるので、それをクリックしてください。

「Python-x.x.x.mpkg」といった名前のファイルがダウンロードされたはずです。そのなかに、Pythonインストーラーである「Python.mpkg」があるはずなので、それをダブルクリックします。「次へ」をクリックしていくと、自動的にインストールが開始するはずです。

インストールが終わったら、「アプリケーション」フォルダに「Python」があることを確認してください。そこの「IDLE」が、この記事で使うエディタ(プログラムを書くために使うアプリケーション)になります。

※Linuxの場合

ディストリビューションによってインストールのやり方が違うので、ここでの説明は省略します。ごめんなさい。
たとえばUbuntuなら、「ソフトウェアセンター」で「Python」をサーチし、「IDLE(Python 3.x)」を選択してインストールすれば良いはずです。


Pythonで遊んでみよう
Pythonプログラムを書くために、この記事ではデフォルトで付いてくるIDLE(アイドル)というアプリケーションを使います。まずこのIDLEを起動してください。
f:id:yambe2002:20181223143241p:plain
こんな感じの画面が出てきたはずです(たぶん、メニューバーなどは日本語になってると思いますが)。
ここでもうPythonのコードを書くことができます。まずはためしに、Pythonに適当に足し算や引き算をやらせてみましょう。「>>>」の右側にカーソルがあることを確認して、以下のようにキーをたたいてみてください。

>>> 1 + 1 (リターンキー)
2
>>> 5 - 3 (リターンキー)
2
>>> 300 / 3 (リターンキー)
100

どうですか?計算結果が表示されましたか?とても単純ですが、これでも立派なPythonのプログラムコードです。「1+1」のあとにリターンキーを押すと、あなたのパソコンでPythonエンジンが動いて、「1+1」というPythonコードを読んで実行し、その結果が画面に表示されるのです。
なお、Pythonでは掛け算を表すのに「*」、割り算に「/」を使います。電卓がわりに、いろいろやってみてください。


Pythonで遊んでみよう(2)
問題に戻る前に、もう少しだけPythonをさわってみましょう。次のように入れてみてください。

>>> a = 150
>>> b = 200
>>> a + b
350

1行目で「aに150を入れる」、2行目で「bに200を入れる」、3行目で「a+bを計算して表示する」ということをやっています。このaとかbのことを『変数(へんすう)』といいます。
プログラミングは、①データをコンピュータ内のどこかに取っておいて、②それに何かの作業をする、のが基本です。この取っておいた場所のことを『変数(へんすう)』とよび、それの名前をここでは「a」や「b」とつけた、ということです。
また、変数にデータを入れることを、『代入(だいにゅう)する』といいます。

1行目をもっと細かく見ていってみましょう。Pythonエンジンはコードを一字ずつ読んでいって、

a

まで来た時に、『これは変数を作って、それにaと名前を付けるんだな』と理解します。
そして次の

= 150

を見て、『なるほど、それに数字の150を代入するのか』と考えるのです。イコール記号は、右にあるデータを左に代入する、という意味です。
つまり合わせて1行で

a = 150

『変数aを作り、それに数字の150を代入する』という意味になるのです。

もう少し、やってみましょう。

>>> c = 30
>>> d = 40
>>> e = 5
>>> (c + d) * e
350

難しくありませんね。変数cに30、変数dに40、変数eに5を代入して、『(c + d)×e』を計算しています(”*”は掛け算の記号でした)。

>>> g = 50
>>> h = 3
>>> i = g + h
>>> i
53

こんな風に、計算結果を変数に代入することもできます。3行目で、『g+h』の結果を変数iに入れてます。なお、ただ変数名だけをタイプしてリターンキーを押すとその中身が表示されます。

>>> j = 'cat'
>>> k = j + 's'
>>> k
'cats'

数ではないものを扱うこともできます。’で囲んだものは文章として扱われ、これを『文字列(もじれつ)』といいます。文字列と文字列を足すと、二つがつながったものができあがります。
1行目で変数jに文字列'cat'を代入、2行目では変数kに、jと文字列's'をつなげたものを入れてますね。結果は'cats'になっています。

>>> num = 100
>>> str = 'abcde'
>>> num + str
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    num + str
TypeError: unsupported operand type(s) for +: 'int' and 'str'

ちなみに数字と文字列と足そうとすると、こんな風にエラーになります。この例だと、numには数字(100)、strは文字列('abcde')を代入しています。三行目でこの2つを足そうとしていますが、当然それは無理なのでエラーになっています。


問題1はPythonでこうなる
さて、では問題1の日本語コードのPython版をお見せします。

# 文章wが入力される
w = input()

# wの最後に's'を付る
w = w + 's'

# wを出力する
print(w)

日本語で説明してあるので、何をやってるコードなのかは分かるでしょう。「問題1」の章で作った日本語のプログラムが、一行ずつそのままPythonのコードになっています。ちなみに「#」で始まっている行はコメントと呼ばれ、Pythonエンジンはこれを無視します。ようするに人間用のメモです。

次に、あなたのパソコンでこのコードを実行してみます。
まずはIDLEの「ファイル」メニューから、「新しいファイル」を選んでください。次のような画面が開いたはずです(日本語だと思いますが)。
f:id:yambe2002:20181223144914p:plain

この画面に、さっきのPythonコードをコピーしてください。
そうしたら「実行」メニューから、「モジュールを実行する」を選んでください。ファイルを保存するように言われるので、てきとうなファイル名を付けてどこかに保存します。すると、こんな画面が開くはずです。
f:id:yambe2002:20181223150318p:plain
分かりにくいですが、これは「wが入力されるのを待っている」状態なのです。ためしに、適当な単語(”cat”など)をタイプしてリターンキーを押してみてください。
f:id:yambe2002:20181223150824p:plain
無事に、"s"が足されて表示されましたね。もしよかったら、何度か実行してみて、どんな単語をいれてもちゃんと動くことを確認してみてください。


AtCoderに提出する
さて、この問題はAtCoderでじっさいに出されたものでした。AtCoderにはむかしの問題もジャッジ(コードが正しいかチェックすること)してくれるすごいサービスがあります。これを使って、このPythonコードが間違いないかジャッジしてもらいましょう。

まず、AtCoder の右上にある「新規登録(しんきとうろく)」からユーザー登録してください。そしてAtCoderにログインし、AtCoder Beginner Contest 029 - AtCoder を開いてください。

これはAtCoder Beginner Contestというビギナー向けコンテストの、第29回のページになります。「問題」をクリックすると、コンテストで出された問題が表示されます(AからDまでの4問)。ここにある「A - 複数形」が「問題1」のもともとの問題です。

「A - 複数形」に行き、下のほうへスクロールすると、「言語」タブと、その下にテキストブロックがあるのが分かると思います。「言語」タブで「Python3」を選択し、テキストブロックへ先ほどのPythonコードをコピーしてください。

f:id:yambe2002:20181223152551p:plain

そうしたら、その下の「提出」ボタンをクリックします。

f:id:yambe2002:20181223152658p:plain

すると、こんな感じの画面に切り替わります。この「WJ...」というのは、いま出したコードをもう少しでジャッジするから、少し待っててね、という意味です。しばらく待つと、結果が下のように「AC」に変るはずです。

f:id:yambe2002:20181223153025p:plain

この「AC」というのが、コードが正しかった、とAtCoderサイトにジャッジされたという意味になります。
(Acceptedの省略です。ほかに「WA」(Wrong Answer:不正解)、「RE」(Runtime Error:実行エラー)などがあります)


問題1のコードのくわしい説明
問題1のコメントを、もっと細かく書くとこうなります。

# 変数wをつくる。そしてユーザーが入力したデータをwに代入する
w = input()

# wの最後に's'を付け、それを変数wに代入する
w = w + 's'

# wを出力する
print(w)

1行目の、

input()

は、『ユーザーからの入力をもらう』という作業をやってくれるものです。
2行目、

w = w + 's'

は、変数wの中身に's'をつけて、さらにそれを同じ変数wに代入しています。
最後の、

print(w)

は、変数wを画面にプリント(表示)しなさい、ということです。画面への表示がプログラムの「出力」になるのは奇妙を思うかもしれませんが、まあそういうものなのだ、と思っておいてください。

これで問題1で学ぶ内容はすべてです。この調子で、どんどん問題を解いていきましょう。


問題2
次の問題はこれです。

大文字のアルファベットが1つ入力されます。このアルファベットは、”A”、”B”、”C"、”D"、”E"のどれかです。”A”から数えて何番目かを出力しなさい。
(AtCoder Beginner Contest 013-A 改)

入力されたアルファベットを、変数cに入れることにしましょう。つまり、
・cが”A”のときは1
・cが”B”のときは2
・cが”C”のときは3
・cが”D”のときは4
・cが”E”のときは5
を出力するプログラムを書けばいいようです。こんな感じでしょうか。

# アルファベットcを入力する
c = input()

cが'A'のとき
    #1を出力
    print (1) 

cが'B'のとき
    #2を出力
    print (2)

cが'C'のとき
    #3を出力
    print (3)

cが'D'のとき
    #4を出力
    print (4)

cが'E'のとき
    #5を出力
    print (5)

「cが〇〇のとき」さえPythonに直せれば大丈夫そうですね。こう書きます。

# cが’A'のとき
if c == 'A':
    #1を出力
    print (1)

「if」は、英語で「もし」という意味です。そのつぎは「c = ’A'」ではなく、「c == 'A'」と、イコール記号が2つになっていることに、注意してください。これで、『cと’A'が同じ』という意味になります。あわせて、『もしcが’A’と同じなら』です。

ぜんぶ書き直すとこうなります。

# アルファベットcを入力する
c = input()

# cが'A'のとき
if c == 'A':
    #1を出力
    print (1)

# cが'B'のとき
if c == 'B':
    #2を出力
    print (2)
    
# cが'C'のとき
if c == 'C':
    #3を出力
    print (3)

# cが'D'のとき
if c == 'D':
    #4を出力
    print (4)

# cが'E'のとき
if c == 'E':
    #5を出力
    print (5)

「問題1」のときと同じように、IDLEで実行してみてください。
(ファイル→新しいファイルに行って、上のコードを張り付けてから、「モジュールを実行」です)
f:id:yambe2002:20181227014439p:plain
うまくいきましたか?この例では「D」を入力しています。ちゃんと「4」が表示されていますね。

そうしたら、またAtCoderにジャッジをお願いしてみましょう。この問題は、AtCoder Beginner Contest 013で出されたものです。

AtCoder Beginner Contest 013 - AtCoder
(ログインを忘れないでください)

「問題」タブをクリックし、「A - A」を選んでください。これが、この問題のもともとの内容です。まえと同じように、「言語」タブから「Python3」を選び、ソースコードを張り付けて「提出」します。
ちゃんと「AC」になればOKです!


問題3
どんどんいきましょう。この問題でもifを使います。

いまの月が1~12で入力されます。来月が何月かを出力してください。
(AtCoder Beginner Contest 011-A 改)

入力された月をmとしましょう。つまり、こういうことでしょうか?

m = input()
print (m + 1)

ちょっと違います。よく考えると、これでは12月のときに、「13」と出力されてしまいますね。正しくはこうです。

m = input()

mが11以下なら
    print (m + 1)
それ以外なら
    print(1)

「mが11以下」というのは、Pythonでは「m <= 11」と書きます。日本語で入力できる「≦」は使えません。「それ以外なら」は「else:」です。ifも使って、合わせてみましょう。

m = input()

if m <= 11:
    print(m + 1)
else:
    print(1)

これで良さそうですかね?いつものように、IDLEで動かしてみましょう。
f:id:yambe2002:20181227042454p:plain
あれ、エラーになってしまいました。なぜでしょうか?

m = input()

じつは、このinput()はユーザーからの入力を「文字列として」扱うのです。そのため、変数mには数字ではなく、文字列(たとえばユーザーが5とタイプしたら文字列としての’5’)が入っています。そのため、次の

if m <= 11:

がエラーになるのです。文字列の’5’と数字の11は比べることができませんからね。このエラーを直したコードがこれです。

m = input()  # mには文字列が入る
m = int(m)   # mを数字(整数)に変かんして、mに入れる

if m <= 11:
    print(m + 1)
else:
    print(1)

このように変数には、数字や文字列などの『タイプ』があります。このタイプを変数の型(かた)といいます。上のコードだと、input()からもらったばかりのデータは「文字列型」で、そのあとにint()したあとのデータは「整数型(せいすうがた。小数点のつかない数)」です。

IDLEで問題なく動くことをチェックしたら、AtCoderにも出してみてください。もともとの問題はこれです。
A - 来月は何月?


問題4

歳が入力されます。七五三でお祝いされる歳なら”YES"、そうでないなら”NO"と出力してください。
(AtCoder Beginner Contest 114-A 改)

入力をaとしましょうか。七五三でお祝いされるのは、7才、5才、3才のときですね。

a = input()
a = int(a)

if a == 7 or a == 5 or a == 3:
    print('YES')
else:
    print('NO')

こうなります。2行目では、前の問題と同じように、入力された文字列データを整数型に変かんしています。

if a == 7 or a == 5 or a == 3:

これで「もしaが7か、aが5か、aが3なら」になります。「or」は英語で「または」という意味ですよ。

IDLEでのチェックと、AtCoderへの提出もやってみてください。こちらです。
A - 753


練習問題
ここまでの知識で解ける問題を集めました。どんどん練習するのが上達のコツです。ぜひ、やってみてください。

日付Dが入力されます。
Dが25なら”Christmas”、Dが24なら”Christmas Eve”、Dが23なら”Christmas Eve Eve”、Dが22なら”Christmas Eve Eve Eve”と出力してください
(AtCoder Beginner Contest 115-A 改)


もともとの問題はこちら:A - Christmas Eve Eve Eve

今日は12月30日です。今の時間Mが入力されたとき、年が明けるまであと何時間あるかを出力してください。
(AtCoder Beginner Contest 094-A 改)
(例1)Mが21のとき→27を出力
12月30日が残り3時間で、12月31日は24時間あります。なので、3+24=27を出力します。
(例2)Mが12のとき→36を出力
12月30日が残り12時間で、12月31日は24時間あります。なので、12+24=36を出力します。


もともとの問題はこちら:A - New Year

AtCoderで始めるPythonプログラミング入門 - 2 に続きます。