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])
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)]])])