碁盤上の得点を数えましょう。
囲碁(baduk、igo、cờ vây、wéiqíとも呼ばれます)では、空点を自分の石で完全に囲むと得点が得られます。プレイヤーが囲んだ交点は、そのプレイヤーの陣地と呼ばれます。
各プレイヤーの陣地を計算してください。敵の陣地に取り残された石は、すでに盤上から取り除かれているとみなしてかまいません。
指定された座標を含む陣地を求めてください。
複数の空点が同時に囲まれることもあります。囲むとみなされるのは、上下左右に隣り合う点だけです。次の図では、関係する石を「O」、関係しない石を「I」(ignored)で示しています。空白は空点を表します。
+----+
|IOOI|
|O O|
|O OI|
|IOI |
+----+
より正確には、こう言えます。ある空点に隣り合う点がすべて、そのプレイヤーの石であるか、そのプレイヤーの陣地に含まれる空点であるなら、その空点もそのプレイヤーの陣地の一部です。
詳しくは、WikipediaやSensei's Libraryをご覧ください。
例外を送出する必要がある場合があります。そのときは、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めるようにしましょう。これにより、コードが読みやすくなり、デバッグがとても楽になります。エラーの原因がある型だとわかっている場合は、組み込みのエラー型のいずれかを送出する方法もありますが、その場合も意味のあるメッセージを含めるようにしましょう。
この演習では、無効な座標が与えられたときに、raise文を使ってValueErrorを「送出」する必要があります。テストに合格するには、exceptionをraiseし、かつメッセージを含める必要があります。
メッセージ付きでValueErrorを送出するには、そのメッセージをexception型の引数として書きます。
# when the coordinates for the piece are invalid
raise ValueError('Invalid coordinate')