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

意味悲鳴

PythonとかUnityとか.技術ブログでしたが,研究ブログにシフトしました.

Python3でPOH5を解いた

paiza.jp

Python3の勉強にもなるだろうと思って、POH5を解いてみました。決してPOH5+の方(16パズルの方)ではない。


1問目

入力された文字列のうち偶数番目を出力するだけ。簡単なんだけど、スマートな書き方が分からなかった……。

# coding: utf-8

string = input()
result = ""

for i , char in enumerate(string):
    if i % 2 == 0:
        result += char

print(result)

うーん、微妙。テストも通るんだけどなんかダサいコードって感じがする。

for i in range(0, len(string), 2) :
        result += string[i]

今forループ部分だけ書きなおしてみたんだけど、それでもなんか微妙。短くはなったけど、Pythonやってない人が読むとしたら、上の方がマシな感じもする。

2問目

月曜日から日曜日までの各曜日の合計を改行区切りで出力する問題。
日数が7の倍数になることが確定していたってことをうまく使いたかったんだけど、なんか違う感じがするんだよなぁ。

# coding: utf-8

number = int(input())
week_list = [0] * 7

for i in range(number):
    index = i % 7
    week_list[index] += int(input())

for i in week_list:
    print(i)

1問目と大体おんなじ感じになった。なんというか、芸がないなぁ。Pythonistaの方々はどんなふうに書くんだろうな。
リストを長さ指定して初期化する時は、week_list宣言した時みたいに[0] * nで出来るのは恥ずかしながら初めて知った。競技プログラミングする時にはほぼ確実に使う気がする。


3問目は省略。私はレナちゃんを選びました。

4問目

数値が入力された表があって、その表の矩形選択された部分だけ足して出力する問題。矩形選択された部分は重なっている可能性もあるので、要するに重複して足さないように何かしらで管理すればOK。というわけで、フラグのテーブルを作成して対応することに。

# coding: utf-8

#表の縦、横、矩形選択範囲の総数を取得
x, y, N = map(int, input().rsplit())

#配列だけ先に宣言
number_table = []
flag_table = [[False for i in range(x)] for j in range(y)]

#数値表の作成
for i in range(y):
    number_table.append(list(map(int, input().rsplit())))

#矩形選択された部分のフラグを立てる
for i in range(N):
    x1, y1, x2, y2 = map(int, input().rsplit())

    for m in range(y1 - 1, y2):
        for n in range(x1 - 1, x2):
            flag_table[m][n] = True

result = 0

#フラグが立っている要素だけ足す
for i in range(y):
    for j in range(x):
        if flag_table[i][j]:
            result += number_table[i][j]

print(result)

文法的に無知だったせいで、標準入力で2次元配列の表を作る部分に一番手間取った。1次元配列みたいにすると参照型になってしまうので、わざわざforで書かないといけないらしい。面倒だけど仕方ないね。


とりあえず、こんな感じでした。Python3でこういう問題解くのは初めてだったので、アルゴリズムよりも文法考える方でだいぶ苦戦していましたが、なんやかんや楽しかったです。ただ、相変わらずPython3の扱いはもうちょっと勉強していろいろ覚えたほうが良さそうな感じがしました。これじゃいつまでたってもPythonistaになれない\(^o^)/