指定した通りに配列の要素を書き換えたい
二次元配列の要素を、別の配列のデータに従って入れ替えたいです。
今、1つの配列に縦5横6の二次元配列があり、配列(array)の中身は全て "." で埋まっています。つまりarrayは
array = [
[".",".",".",".",".","."],
[".",".",".",".",".","."],
[".",".",".",".",".","."],
[".",".",".",".",".","."],
[".",".",".",".",".","."] # ←①
]
となっています。
この "." を str_array
配列の数字に従って書き換えたいです。たとえば str_array
が
str_array = [[1, 1, 0], [1, 3, 2], [3, 3, 1]]
のときを考えます。この str_array
は要素を3つもっています。
- 最初の
[1, 1, 0]
はarrayの最後のブロック(①で示したもの)を書き変えます。[1, 1, 0]
の 0 は[".",".",".",".",".","."]
の左から0番目の場所を表し、1, 1 は縦横1つずつの "." を書き換えることを示します。- これによって、最後のブロックが
["#",".",".",".",".","."]
になるということです。
次の
[1, 3, 2]
は左から2番目の "." を書き換えます。今 array はarray=[ [".",".",".",".",".","."], [".",".",".",".",".","."], [".",".",".",".",".","."], [".",".",".",".",".","."], ["#",".",".",".",".","."] ]
という状態であり、一番下のブロックの左から2番目が空いているので、縦1横3で "#" を敷き詰め、下のように書き換わります。
array=[ [".",".",".",".",".","."], [".",".",".",".",".","."], [".",".",".",".",".","."], [".",".",".",".",".","."], ["#",".","#","#","#","."] ]
最後の
[3, 3, 1]
は左から1番目の "." を書き換えますが、一番下のブロックには縦横3つをもう入れ替えられないので、array=[ [".",".",".",".",".","."], [".","#","#","#",".","."], [".","#","#","#",".","."], [".","#","#","#",".","."], ["#",".","#","#","#","."] ]
と array を書き換えます。
最終的に、
array=[
[".",".",".",".",".","."],
[".","#","#","#",".","."],
[".","#","#","#",".","."],
[".","#","#","#",".","."],
["#",".","#","#","#","."]
]
を出力させたいです。
これを行えるようなアルゴリズムとしてfor文をまず思いつきました。次にスタート "." を入れ替えられるように 4 * 6 + 1
という風に (縦幅-1) * 横幅 + スタートの順番
という式を使うのではと思いましたが、これらをどう組み合わせればいいのかわかりません。特に "." が既に埋まっていて "#" になっている時とそうでない時で処理が違います。このプログラムはどのように書けますか?
今の断片コードですが、
for i in range(len(str_array))
str_array[0][i] * str_array[1][i] + x
(x
はスタートの順番)と書きました。