Обычно довольно утомительно генерировать поля шахматной доски, которые могут быть атакованы слонами или конями, но мы быстро справляемся с этим, используя включения для генерации и фильтрации позиций на доске до решения, чтобы решить задачу из последнего раза. .

Стратегия высокого уровня (0:23)

Легче и быстрее решать алгоритмические задачи сначала логически, а затем кодировать их, а не делать и то, и другое одновременно. Давайте начнем с изучения способов перемещения шахматных фигур и выясним, какие поля они могут атаковать. Визуальные эффекты в начале этого видео очень помогают в решении этой задачи.

  • Ладьи. Ходы на любое расстояние по прямой горизонтальной или вертикальной линии. Это они могут атаковать фигуры, которые находятся в том же столбце или ряду, что и они.
  • Слоны: Ходы на любое расстояние по диагонали. Квадраты, в которых разница между их номерами строки и столбца такая же, как у слона, могут быть атакованы им по восходящей диагонали. Квадраты, в которых сумма их значений строки и столбца такие же, как у слона, могут быть атакованы им по наклонной вниз диагонали.
  • Рыцари: совершает L-образный прыжок. Квадраты с номером столбца на единицу меньше, чем у коня, и номером ряда на два меньше, чем у коня, могут быть атакованы им. То же самое можно сказать и о тех, у кого столбец меньше на два, а номер строки меньше на один.

Кодирование решения (3:55)

Для начала возьмем модуль Квадрат из урока игрового поля. Затем мы создадим вспомогательную функцию для создания новой доски и одну функцию для генерации квадратов для каждого типа атак фигур.

Самый простой способ сгенерировать поля, которые атакует фигура, — это использовать for понимание того, что шаблон соответствует столбцам и строкам каждого квадрата доски, а затем фильтрует их на основе приведенной выше логики. Для каждого типа изделия необходимо проверить два критерия.

Для рыцарей оба критерия никогда не совпадают. На поле не может быть колонны, в которой нет ни одного коня, ни двух. Для ладей и слонов возможно выполнение оба критерия. Квадрат может иметь тот же столбец и тот же ряд, что и ладья. Это поле, на котором стоит ладья, и это недопустимый ход. То же самое верно и для слона — соответствие обоим критериям означает его собственное поле.

Отсутствует оператор xor (6:23)

Так что для слонов и ладей нам нужен эксклюзив или, что удивительно, в Эликсире его нет! К счастью, Erlang делает, так что мы можем просто вызвать :erlang.xor(condition1, condition2). Он вернет true только тогда, когда одно, но не оба условия истинны. Для рыцарей мы можем просто использовать обычный or.

Есть много способов решить эту проблему без сопоставления с образцом или понимания. Если вы придумали такое решение, вы можете быть удивлены, насколько краток код в этом видео… и это нормально! иногда трудный путь — отличный способ тщательно изучить проблемное пространство и отличная мотивация для изучения новых техник, когда вы с ними сталкиваетесь!

Не стесняйтесь делиться своими решениями ниже!

Первоначально опубликовано на alchemist.camp.