プログラマーのように考える方法を学ぶには、プログラマーではないように考える方法を学ぶ必要があります

これは、 いわば 、記事lxsmkv 「The Crossing of the Crossing」に対する答えです。 その記事の最も記憶に残る部分は、(タスクの複雑さと比較して)巨大なテーブルであり、そこに問題のモデルが表現されています。



もっとシンプルなものを考えてみましょう。



1.状態



オオカミ、ヤギ、キャベツがあります。 彼らは反対側に輸送する必要があります。 人(運送業者)によって転送されます。 困難なのは、オオカミがヤギを食べ、近くに人がいなければヤギがキャベツを食べることです。 さらに、一度に1つだけを転送することができます(ボートには貨物用の場所が1つしかありません)。



2.ソリューションのアイデア



次に、タスクをデジタル化します。つまり、タスクを数字と操作の形で提示します。 海岸に沿ったオオカミ、ヤギ、キャベツの分布(配置)とそれらとの行動を説明しなければなりません。 したがって、問題の条件を言葉で定式化しています。 絵の明瞭さとモデルの数字の抽象性を組み合わせたいと思います。 つまり、モデルは人間が理解できるように視覚的であり、機械が理解できるように抽象的でなければなりません。



私が理解しやすく、簡単にプログラムできるように提示したいと思います。



画像は最も簡単に(一目で)知覚されます。 数字でアクションをプログラムする最も簡単な方法。 したがって、モデルに画像と数値の両方のプロパティを組み合わせてほしい。 さらに、将来プログラミングが予想されるため、この数が主要です。 つまり、いくつかの番号だけでなく、その視覚的イメージが問題(およびその解決の過程)を反映する番号が必要です。 問題の状態を絵の形で描きましょう。 アクション「食べる」は矢印で示されています。



画像



誰かがこの写真に食物連鎖を見、誰かが指向のグラフを見ます。 しかし、これはすべて重要ではありません。 一部のカップルは禁止されていることが重要です。 そして、どのペアが写真内の位置によって決定されます。



画像



もしそうなら、それは彼らの誰が誰で誰が誰を食べるかに完全に無関心になります。 見やすいように、隣接するペアは禁止されていることが重要です。 したがって、オオカミ、ヤギ、キャベツを同じアイコンで描くことで、スケッチをスケッチすることができます。



次に、銀行に沿った参加者の分布を示す必要があります。



画像



スキームの右側の部分に含まれる情報が左側の部分に複製されていることに気付くのは簡単です。 実際、参加者はタスクから消えず、再出現しません。 それらのそれぞれは、左または右の銀行に位置しています。 したがって、回路の右側は1つで十分です。



画像



このようなスキームには、問題を解決する過程で発生するオブジェクトの分布に関するすべての情報が含まれています。 これがどのようなオブジェクトであるかは、ダイアグラム内でそれが占める場所(位置)によって決まり、どの海岸でその場所が占められるか空かによって決まります。



今、数字を取り上げます。 現代のすべての数値システムは定位置です。つまり、数値内の数値の機能は、その数値内の位置によって決定されます。 それは放電です。 また、各桁には複数の値を設定できます。



次に、各ビットで、タスクオブジェクトを関連付けます。 そして、各カテゴリの値には2つ必要です。 最初のカテゴリーはキャベツ、2番目はヤギ、3番目はオオカミです。 各カテゴリでは、2つの値が必要です。1-開始海岸、0-終了海岸。



構成を記述するには、3桁の2進数が必要であることがわかります。 たとえば、111は開始構成、000は終了構成です。



番号コーディングについても同じことが言えます。 3桁の2進数も必要です。この場合、退院は参加者であり、退院の値はアクションをエンコードします(1-輸送する、0-しない)。



ある構成から別の構成への移行を記述することは残ります。 これを行うには、約数学演算を見つけます。 この遷移は次のように説明できます。



1   = 2
      
      





これはどのような操作ですか? 構成ビットの1つと同じアクションビットを検討してください。 ユニットがこのアクションのカテゴリにある場合、構成のカテゴリでは、ユニットはゼロに、またはその逆に変更する必要があります。 アクションビットがゼロの場合、構成ビットは変更されません。



次のようなテーブルを作成できます。

D KについてD
1 1 0
1 0 1
0 1 1
0 0 0


明らかにこれはxorです。 つまり、構成KのビットはマスクDによって反転されます。



最終的に、マスク111を使用して構成111を反転する必要があります。



 111 xor 111 = 000
      
      





さて、記事自体のトピック形成部分はこれで終了です-アイデアが見つかりました。 残りは結果です。



3.ルール



前のパートでは、問題のデジタルモデルを構築できるアイデアを策定しました。 ただし、問題の移動に関するルールもあります。 見つかったアイデアを使用してそれらを定式化すると、問題のモデルとその解決策が得られます。



ルールは禁止です。つまり、何ができないかを決定します。 この場合、禁止を許可に変換できます。 実際、位置(構成)と移動をエンコードするには、3桁の2進数を使用できます。



1.構成(移動)の初期リスト:000、100、010、001、110、101、011、111。

2.マスク(アクション)の初期リストは同じです:000、100、010、001、110、101、011、111。



禁止とは、これらの番号の一部が使用できないことを意味します。 したがって、これらのリストの一部の数値のみを使用できます。 どれを見つけてください。

これを行うには、まずモデルでの運送業者の役割を理解する必要があります。



彼が海岸にいる間、すべてが穏やかで、誰も誰も食べません。 しかし、彼が反対側に泳ぐとすぐに、オオカミはヤギまたはヤギのキャベツを食べます。 その結果、ペアの許容性は、移動が行われたバンクのターンの終わり(またはターンの後)にチェックされます。



したがって、構成と移動をエンコードする数値では、キャリアもエンコードする必要があります。 これを行うには、別のビットを追加します。 このカテゴリのユニットは、開始銀行の運送業者をエンコードし、終了時にはゼロにしましょう。 さらに、ムーブをエンコードする番号は、最高(4番目)のランクで常に1である、つまり、キャリアの参加なしにムーブがないことは明らかです。 すると、元の数字のリストは次のようになります。



1.構成の初期リスト:1000、1100、1010、1001、1110、1101、1011、1111、0000、0100、0010、0001、0110、0101、0011、0111。

2.マスクの初期リスト:1000、1100、1010、1001、1110、1101、1011、1111。



ここで、同じ原則を使用して、移動または構成(位置)の許可/禁止をエンコードします。 放電をもう1つ追加し、5回目-1回の移動または構成が許可され、0回が禁止されます。



許可された移動のリストを作成します。



反転できるのは1回だけ、または何も反転させない(1人の乗客または帆を空にして運ぶことができます)。 したがって、マスクは1000、1100、1010、1001のみになります(これは許可された移動のリストです)。



許可されたポジションのリストを作成します。

初期構成1111は禁止されています(最初の移動を空にすることはできません)。

隣接するカテゴリーのユニットまたはゼロは禁止されています(オオカミ-ヤギとヤギ-キャベツのペアは岸に配置できません)。

つまり、構成1111、1110、1011、1001、1100は禁止されているため、1000、1101、および1010が許可されます。



奇妙な動きの後、ユニットの構成がチェックされ、偶数の後-ゼロ(ユニットはこの海岸のオブジェクトであり、ゼロはその上にあります;奇数の動きはこの海岸からその偶数へ、そこからこれへ移動しています)。



ゲームを迅速かつ迅速に終了したい場合は、移動数を制限する必要があります。 したがって、ポジションの繰り返しは禁止されています。



この規則は、次の移動が行われる位置が禁止されることを要求します。 つまり、同じ位置を許可することも、禁止することもできます。 したがって、ポジションの禁止/許可をコーディングする必要があります。 再度、追加の数字を導入します-5番目:位置は許可されます-1、位置は禁止されます-0。

当然、このカテゴリのムーブコードには常に0を含める必要があります。これは、許可された位置が自動的に禁止されるのではなく、移動の結果も許容可能な位置になった場合のみです。



もちろん、最初の位置のコードには、最初に5番目のカテゴリのユニットが含まれています。一度入ると、許可されます。



最後に、有効な位置11000、11101、11010のリストと有効な移動01000、01100、01010、01001のリストが取得されます。



4.動きの計算。



次に、移動を計算する関数が何をすべきかを想像してみましょう(computeHod)。



この関数の引数は次のとおりです。



refPos-開始位置、

ProhibitionPozのリスト-禁止されているアイテムのリスト、

listDopustHod-有効な動きのリスト。



関数はresultRespos-結果の位置を返す必要があります。



したがって、関数CalculateHodは次のことを行う必要があります。



           =  xor            and  ≠ 0     xor 10000      
      
      





5.終わり



さて、メイン関数を設計し、必要な引数で計算関数を呼び出し、結果を便利なデータ構造に追加し、最終的に人間の知覚に便利な形式で結果を画面に表示できるようにします。 さて、実際にコードを書いてください。



この時点で、プログラマーのように考えることができます。 希望者は宿題としてこれを行うことができます。



All Articles