もう、ちょっと諦めてるんですけど「魔法陣」の問題が解けん!なんかもう、全然違う考えでやらんとイカンのでは?と。なんか関数をインポートしたら簡単に出来るんだろうけど、知ってる基本的な命令を組み合わせて解けるようにならんとイカンのだろうなぁ・・
![](https://blogimg.goo.ne.jp/user_image/66/8d/110fc92d9b0a9e6eb42d4b5d2f7d6f83.png)
問題はこれっすね。縦横斜め等どう足しても同じ数になるってのが魔法陣ですね。このウチの2つの数字が分からなくなっていて、それを割り出して正しい魔法陣を・・ん!?待てよ・・・今まで、空白の部分を割り出して、その座標を新たに自動的に作った変数に代入して・・・と考えてたんだけど、別に空白部分を保存しておかなくても出力するのは正しい魔法陣だけなので、空白の座標が含まれてる部分を無視するようにすれば良いか・・と、今、これを書きながら思い至った。これは後で試してみないとイカンな・・・
とりあえず、記録として現在までの流れをメモしておくか・・・
![](https://blogimg.goo.ne.jp/user_image/11/8b/9737ae79ad406f80291b0c3a265eba8e.png)
まあ、こういう感じで3x3〜10x10の魔法陣の空白を特定して補完すると。
![](https://blogimg.goo.ne.jp/user_image/65/d3/719d4cb6ca4466c6b0864c10fd64d034.png)
結局、間違ってるんですけど・・・考えてゆく上で新しい文法とかを調べて、文字列として作られたリストを数値のリストに一括変換する方法。なるほど〜
![](https://blogimg.goo.ne.jp/user_image/0d/ab/0b7a99a6486b1529163a05114bb6e494.png)
こういうのもあるのか・・・map命令で一気に変換する方法。ほうほう・・
![](https://blogimg.goo.ne.jp/user_image/36/5c/2ddc44b69ad3d311c4a63f19358dc8a4.png)
まあ、構想としては・・・
☆文字列を数値のリストに変換して
☆入れ子形式のforループで数値0の部分を特定する
☆その数値を、そこでリストに格納して・・・ここでループ内で自動的に変数を作るってのが出来ない! けどまてよ・・今、これを書きながら思うのは、空白は2箇所と決まってるなら、自動で作らなくても良いよなぁ・・・
☆縦横の列を出して、その合計を計算して合計値を出す
☆数値が全部埋まってる縦横のラインと0が入ってるラインを比較して、その差を座標と共に格納して・・うーん、ここがなぁ!
☆正しい魔法陣を出力
とまあ、こんな感じで?悩みどころは例えば横の行(3x3の場合)に 「5 0 0」ってな感じで未知の数字が2つ入ってた場合なんですよね。これがなければ、まだ!この場合、縦の列で同じようにチェックすれば良いんだけど・・・まあ、結局はその場合分けが異様に面倒って事なんですよねぇ・・これはもっと単純化出来るように根本的な考え方を変えないとイカンのだと思う。
今は、最初に行ごとに0が2つ無いかどうかをチェックして、なければ横のラインでチェック、あれば縦のラインでチェック・・ってのが改善として思いつく方法なんだけども。
他に何かあるかなぁ・・・例えば、魔法陣ってのがそれぞれのサイズでパターンが1つづつしかないってのであれば・・自動的に魔法陣を作るアルゴリズムってのがあるみたいだから、そこで作り出したものと問題の四隅をチェックして方向を揃えれば正解は出せるしね。
後は・・・思いつかん! まあけど、ちょっと改善案の方は試してみても良いかな・・。けど、forループの中でチェックの結果によって動的に変数を新たに作るってのが出来ないってのが意外だった(調べきれてないのかも知れないが)。