見出し画像

情報オリンピック予選全問の最短解答例を作成してみた話(じゃんけん他)

先週日曜、情報オリンピック一次予選の第二回目が開催された。
開催から約一週間経ったが、
公式模範解答や解説はまだ出ていない模様。

プログラミング授業を数回受けただけの生徒も多数チャレンジしたが、
「簡単そうに見えて、解きにくかった」との声がちらほら。

問題は一般人の人もAtCoder等でチャレンジ可能。


「せっかくだから、日本で一番短い長さのPythonプログラムで
正答出せるプログラム作ろう!」
と試してみたら、首尾よく全問題分完成。

でも短さ追求しすぎて、
お行儀悪いプログラムだから
授業での解説には使えそうにない…
いろいろ考えてみるのは楽しいけれど。



問題と作成した解答例


B - 鉄道旅行 3 (Railway Trip 3)

問題文

ビ太郎は JOI 鉄道に乗って旅行をする.JOI 鉄道の運賃は
はじめの Pkm までは 1km あたり A 円,
それ以降の運賃は 1km あたり B 円で計算される.
Qkm 乗車するとき,運賃はいくらになるか出力せよ.

・回答したコード

p,q,a,b=map(int,open(0).read().split())
print(min(p,q)*a+max(0,q-p)*b)

QがPより小さかったら、全距離が初乗り料金A円、
そうでなかったらQ-P分がB円と場合分けする問題。
(max、minを用いれば、場合分けと同等のことが一行で出力可能)


じゃんけん:

問題文
長さ N の文字列
S,T が与えられる.
S の各文字は R,S のいずれかである.
T の各文字は R,P のいずれかである.

葵とビ太郎は
N 回じゃんけんを行った.葵が
i 回目 (1≦i≦N) のじゃんけんで出した手は
S の i 文字目が R,S のときそれぞれグー,チョキである.
ビ太郎が i 回目 (1≦i≦N) のじゃんけんで出した手は
T の i 文字目が R,P のときそれぞれグー,パーである.

全 N 回のじゃんけんにおいて,
葵が勝った回数とビ太郎が勝った回数を求めよ.

S は長さ N の文字列である.
S の各文字は R,S のいずれかである.
T は長さ N の文字列である.
T の各文字は R,P のいずれかである.

作成したコード:

_,s,t=open(0)
a,b,c=map([x+y for x,y in zip(s,t)].count,('SP','RP','SR'))
print(a,b+c)

方針として、
入力した二人の手を二文字の文字列として扱い、
a,b,cに「'SP','RP','SR'」がそれぞれ出た回数を求め、
・SP(チョキとパー)がAの勝ち、
・RP(グーとパー)とSR(チョキとグー)はBの勝ち、
として表示させてみた。


限定じゃんけんだから場合の数は4つ、
すべてのじゃんけんでも場合の数は9つ。
場合分けがうまく扱えなかった生徒が多かった模様。

D - 三角足し算 (Triangle Addition)
問題:

作成してみたコード

n,*a=map(int,open(0).read().split())
while a:
  a=[x+y for x,y in zip(a,a[1:])]
  print(*a)



いいなと思ったら応援しよう!

Hiiro
公務員で受取出来ませんので、お気持ちだけで大丈夫です~

この記事が参加している募集