コードの解析と学び:グリッドの方向別合計値計算
背景
最近、グリッド内の特定の点から北、南、東、西の方向の値の合計を計算するコードを書いていました。しかし、cdの部分が1文字の整数か#のどちらかだと認識していたため、二桁以上の整数が来ることを想定しておらず、処理を間違えてしまいました。とても悔しい思いをしましたが、これも学びの一環です。
コードの説明
まず、コードの全体像を説明します。
HW = '3 3'
YX = '1 1'
cd = ['5#3','13#','##1']
HW = list(map(int,HW.split()))
YX = list(map(int,YX.split()))
northrawsum = 0
westcolomnsum = 0
eastcolomnsum = 0
southrawsum = 0
for i in range(HW[0]):
row = list(cd[i].replace('#','0'))
row = list(map(int,row))
if YX[1]-1 == 0:
eastcolomnsum = eastcolomnsum + sum(row[YX[1]-1+1:])
elif YX[1] == HW[0] :
westcolomnsum = westcolomnsum + sum(row[:YX[1]-2])
else :
eastcolomnsum = eastcolomnsum + sum(row[YX[1]:])
westcolomnsum = westcolomnsum + sum(row[:YX[1]-2])
if YX[0]-1>i:
northrawsum = northrawsum + sum(row)
if YX[0]-1<i:
southrawsum = southrawsum + sum(row)
comp = [northrawsum,eastcolomnsum,westcolomnsum,southrawsum]
if max(comp) == northrawsum:
print('N',northrawsum)
elif max(comp) == eastcolomnsum:
print('E',eastcolomnsum)
elif max(comp) == southrawsum:
print('S',southrawsum)
elif max(comp) == westcolomnsum:
print('W',westcolomnsum)
問題点
cdの部分が1文字の整数か#のどちらかだと認識していたため、二桁以上の整数が来ることを想定していませんでした。そのため、処理が正しく行われず、結果が期待通りになりませんでした。
学び
入力データの確認: 入力データの形式を事前にしっかり確認することが重要です。
エラーハンドリング: 想定外の入力が来た場合に備えて、エラーハンドリングを行うことが必要です。
改善点
次回は、入力データの形式をしっかり確認し、エラーハンドリングを追加することで、同じミスを防ぎたいと思います。
以下に作成したコードのブロックごとで示します。
入力の解析:
HW = '3 3'
YX = '1 1'
cd = ['5#3','13#','##1']
HW = list(map(int,HW.split())) #HWをsplitして、map関数で型をintに置き換え
YX = list(map(int,YX.split())) ♯YXも同様
初期化:
northrawsum = 0
westcolomnsum = 0
eastcolomnsum = 0
southrawsum = 0
#YXの基準より、上(北)、下(南)、左(西)、右(東)にある総和を取るので、変数を初期化
各行の処理:
for i in range(HW[0]):
row = list(cd[i].replace('#','0'))
row = list(map(int,row))
#1文字の整数か、#の2択なのでHWの要素数でrange関数でリストを生成
#足し算できるように、#を0に変換
#ここで認識間違えてた、くそー!!!!クソくだらない処理を書いてここで30分程度詰まる。
グリッドの各行をループで処理します。
# を 0 に置き換え、行を整数のリストに変換します。
列の合計値の計算:
if YX[1]-1 == 0:
eastcolomnsum = eastcolomnsum + sum(row[YX[1]-1+1:])
elif YX[1] == HW[0]:
westcolomnsum = westcolomnsum + sum(row[:YX[1]-2])
else:
eastcolomnsum = eastcolomnsum + sum(row[YX[1]:])
westcolomnsum = westcolomnsum + sum(row[:YX[1]-2])
#条件式を当てはめる。基準が一番左右に振ったとき、エラー処理もかねて、条件設定。
#頭が働いておらず、ここのエラー処理を見逃す。クソーーーー!!!!
行の合計値の計算:
if YX[0]-1 > i:
northrawsum = northrawsum + sum(row)
if YX[0]-1 < i:
southrawsum = southrawsum + sum(row)
#ここら辺は特にない!
比較と出力:
comp = [northrawsum,eastcolomnsum,westcolomnsum,southrawsum]
if max(comp) == northrawsum:
print('N',northrawsum)
elif max(comp) == eastcolomnsum:
print('E',eastcolomnsum)
elif max(comp) == southrawsum:
print('S',southrawsum)
elif max(comp) == westcolomnsum:
print('W',westcolomnsum)
#ここら辺は特にない!
まとめ:
このコードは、グリッド内の特定の点から北、南、東、西の方向の値の合計を計算します。
その後、最大の合計値を持つ方向を出力します。
何か具体的な質問やさらに詳しい説明が必要であれば、お知らせください!
この記事が参加している募集
この記事が気に入ったらサポートをしてみませんか?