読者です 読者をやめる 読者になる 読者になる

唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Pythonワンライナーでpaizaオンラインハッカソン5に挑戦してみた

paizaがイラスト付きでプログラミングの問題を出しているpaizaオンラインハッカソンも5回目になりました
前回ぐらいから難易度が下がった代わりに、イラストとかストーリーとかに力を注ぎ始めているみたいです(?)
なんとストーリーの分岐がありますpaiza.jp

前回↓は簡単だったのでPythonワンライナーに挑戦しました
せっかくなので今回もワンライナーのコードも書きましたsucrose.hatenablog.com
下記のまとめを見るとワンライナーで解いてたりbashで解いてたりいろいろな人がいるみたいですpaiza.hatenablog.com

1問目

偶数番目の文字を出力するだけ

print raw_input()[::2]

2問目

7の倍数の個数の要素が与えられるので、添字を7で割ったあまりが等しいグループごとにそれぞれの総和を求める

n = input()
data = [input() for i in xrange(n)]
for i in xrange(7):
    print sum(data[i::7])

ワンライナー
iterとzipをうまく使うと楽に書けます

print '\n'.join([str(sum(s)) for s in zip(*zip(*7 * [iter([input() for i in range(input())])]))])

3問目

どっちのキャラの分岐に進むかを出力するだけ

4問目A

2次元の落ちものパズルの盤面を考える
現在の盤面と次に消える部分が与えられるので落下後の盤面を答える

消えないものの個数を数えて下から積んでいくだけ

x, y = map(int, raw_input().split())
field = []
for i in xrange(y):
    field.append(map(int, raw_input().split()))

new_field = [['0'] * x for i in xrange(y)]

for j in xrange(x):
    count = 0
    for i in xrange(y - 1, -1, -1):
        if field[i][j] == 1:
            count += 1
            new_field[y - count][j] = '1'

for i in xrange(y):
    print ' ' .join(new_field[i])

ワンライナー

print '\n'.join([' '.join(i) for i in zip(*[('1' * sum(map(lambda x: x==1, i))).zfill(len(i)) for i in zip(*[map(int, raw_input().split()) for i in xrange(map(int, raw_input().split())[1])])])])

4問目B

数値の2次元配列が与えられる
長方形の範囲が複数与えられるので、2次元配列の中でそのいずれかの長方形に含まれる数値の合計を答える

最初に、含まれる範囲だけ別の配列に書き出してチェックした

x, y, N = map(int, raw_input().split())
cell = []
for i in xrange(y):
    cell.append(map(int, raw_input().split()))

mask = [[1] * x for i in xrange(y)]

for i in xrange(N):
    x1, y1, x2, y2= map(int, raw_input().split())
    for j in xrange(x1 - 1, x2):
        for k in xrange(y1 - 1, y2):
            mask[k][j] = 0

print sum([cell[i][j] for i in xrange(y) for j in xrange(x) if mask[i][j] == 0])

ワンライナー
上のコードとは違って愚直に毎回範囲の条件を判定しています

x, y, N = map(int, raw_input().split());
cell = [map(int, raw_input().split()) for j in range(y)];
print sum([max(i) for i in zip(*[[cell[i][j] if x1 - 1 <= j <= x2 - 1 and y1 - 1 <= i <= y2 - 1 else 0 for i in xrange(y) for j in xrange(x)] for x1, y1, x2, y2 in [map(int, raw_input().split()) for k in xrange(N)]])])
-->