Python初心者の思考

ARC020の結果はこんな感じ

無事2年生になったらりょすです。

最近Python3の勉強を初めてなかなか前に進めません。誰か助けて。
さて。ちょっと前にあったAtcoderRegularContest#020のCの問題を解いた時の話をします。
ARC#020:http://arc020.contest.atcoder.jp/

まず言っておきます
私はPython初心者です。
Pythonistaの皆さんは変態なので,がちな方はいろいろ仰りたいことがあるかもしれませんがご容赦ください。お願いだから。

問題の要旨

整数A, Bが与えられるのでAをBで割ったあまりを表示せよ

N
a1 L1
a2 L2
:
aN LN
B

Nは整数Aの情報の長さを示す。
整数Aはa1をL1回繰り返したものとa2をL2回繰り返したものa3を・・・aNをLN回繰り返したものをひっつけたもの
N+2行目で整数Bが示される

3
123 2
4 2
56 1
1000000007

これは
1231234456を100000007(10^9 + 7)で割ったものを示せばいいので

231234449

となる。

どう解く?

Pythonは 文字列*数値 で文字列をかけた数値分の回数を繰り返すことができる
つまり

print('SYSKEN' * 3)

と入力すれば

'SYSKENSYSKENSYSKEN'

と出力される。
それを使えば整数Aを出せます。

そこで(なぜか)こんなコードを書きました

N = int(input())
ax = []               #aNを格納するリストを作る

for i in range(N):
  a, L = map(int, input().split())
  a = str(a)          #aをstring型に変換
  ax.append(a*L)      #axにaN(a*L)を格納

ay = "".join(ax[:N])  #ax内の要素を結合
ay = int(ay)          #ayをint型に変換

B = int(input())

print(ay % B)         #A(ay)をBで割ったあまりを出力

プログラミング初心者かっっっっ
aNをなぜリストに入れる必要があったのか,for文で回してる間に足していけばいいんじゃないか
(文字列の足し算で結合ができます ‘SYSKEN ‘ + ‘is mine’で’SYSKEN is mine’に)
周りくどいというか,なんか気持ち悪い・・・変数無駄に多いし。
ちなみに.joinでリスト内の要素を結合できます。 ax[:N]でax内の最初からN-1番目までの要素を指定できる・・
何かさすがにきもかったのでこんなかんじに書きなおしました

A = ''                               #Aは文字列ですよ〜〜

for i in range(int(input())):
 a, L = map(int, input().split())
 a = str(a)
 A += a*L                            #AにaN(a*L)を足していく

print(int(A)%int(input()))           #Aをintに変換してB(入力された数値)で割る

だいぶましになりましたね
変数の数減ったし,行数減ったし無駄がだいぶなくなりました。

ただ,Atcoder。こんなに甘くない。

810143056 100000000
81671422 99999999
1639053 99999998
1657560 99999997
1000000007

あほかっっっっっ
こんなのはさすがにやばいので解けませんでした
Pythonで正解出してる方もいらっしゃいましたのでできないことはないですが,僕にはできません。

ってことで

この問題では100点中20点の部分点をもらいました。ばんざい
今後も精進してまいります

P.S.

しすけんらじおは5月からリニューアルして公開するよ!
(カテゴリーはへんなものでいいのかしら。)


コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください