見出し画像

コードの解析と学び:グリッドの方向別合計値計算

背景

最近、グリッド内の特定の点から北、南、東、西の方向の値の合計を計算するコードを書いていました。しかし、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)
#ここら辺は特にない!

まとめ:

  • このコードは、グリッド内の特定の点から北、南、東、西の方向の値の合計を計算します。

  • その後、最大の合計値を持つ方向を出力します。

何か具体的な質問やさらに詳しい説明が必要であれば、お知らせください!


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?