パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

プログラムの難問に挑む手法1 クロスワードを作る

2021-07-12 | プログラムをマスター計画2021

挑んでみたのはこちら、100%解答率が38%と低め

https://www.codingame.com/training/medium/crossword

 

クロスワードを解く問題かと思いきや、答えからクロスワードを作る問題

水平2つ 垂直2つのワードから条件にそって作成できる数を答える。1つのみならその解答を表示

 

 

着手前に悩んだ所

1. まずデータどうしよう

2. ループの回し方がわからない

3. 解答の表示方法どうしよう

 

ようはお手上げ状態、しばらくは神待ち、悩んでいるとなにかしら着手できそうな所が見つかる。

 

まずは上の問題の時限定で答えを表示させてみることにする。

広めのボードを作って、縦横に配置、縦横の開始終了位置を探して表示。

一問ハードコーディングで解く 7%

 

作れそうな所から関数をつくっていくのは割と有効だと思います。

 

キーとなる判定処理を探す

縦横に配置する時に元のあったものと文字と一致する数を判定するようにする。

あと残ったのはループの回し方

 

小さなパーツを作って確認

まず縦横1つずつ クロスさせたものを表示させることに、下のループで65から68

経験のない処理を新規で作成する時はこまめに表示させて確認していく方法がいいと思います。

65行目からの多重ループは作成時に都度盤面を表示させて確認していました。

 

ループの回し方

今回は頭の中があまり整理できていなかったのでベタな多重ループにしました。

最初に横1を定位置に置く

1. 縦1を横1と重なる範囲で配置して、重なる文字数が1でいずれも同じならば 2.

2. 縦2を横1と重なる範囲で配置して、重なる文字数が1でいずれも同じで さらに縦1とくっつかなければ 3.

3. 横2を縦1、縦2と重なる範囲で配置して、重なる文字数が1でいずれも同じで さらに横1とくっつかなければ 回答数に加算して、その画面を保持

残念ながら、反省点が多いプログラムです。

 

 

難問でもどこかしら緒(いとぐち)はあるものです。

できるところから手を動かして、精度を高めていけば、関数が勝手に答えに導いてくれることもあります。(という錯覚が起こります)

最期のループの開始終了位置の調整も大変でしたが

なんとか解けたのは22行目までの2つの関数のおかげです。

 


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。