Обычно довольно утомительно генерировать поля шахматной доски, которые могут быть атакованы слонами или конями, но мы быстро справляемся с этим, используя включения для генерации и фильтрации позиций на доске до решения, чтобы решить задачу из последнего раза. .
Стратегия высокого уровня (0:23)
Легче и быстрее решать алгоритмические задачи сначала логически, а затем кодировать их, а не делать и то, и другое одновременно. Давайте начнем с изучения способов перемещения шахматных фигур и выясним, какие поля они могут атаковать. Визуальные эффекты в начале этого видео очень помогают в решении этой задачи.
- Ладьи. Ходы на любое расстояние по прямой горизонтальной или вертикальной линии. Это они могут атаковать фигуры, которые находятся в том же столбце или ряду, что и они.
- Слоны: Ходы на любое расстояние по диагонали. Квадраты, в которых разница между их номерами строки и столбца такая же, как у слона, могут быть атакованы им по восходящей диагонали. Квадраты, в которых сумма их значений строки и столбца такие же, как у слона, могут быть атакованы им по наклонной вниз диагонали.
- Рыцари: совершает L-образный прыжок. Квадраты с номером столбца на единицу меньше, чем у коня, и номером ряда на два меньше, чем у коня, могут быть атакованы им. То же самое можно сказать и о тех, у кого столбец меньше на два, а номер строки меньше на один.
Кодирование решения (3:55)
Для начала возьмем модуль Квадрат из урока игрового поля. Затем мы создадим вспомогательную функцию для создания новой доски и одну функцию для генерации квадратов для каждого типа атак фигур.
Самый простой способ сгенерировать поля, которые атакует фигура, — это использовать for
понимание того, что шаблон соответствует столбцам и строкам каждого квадрата доски, а затем фильтрует их на основе приведенной выше логики. Для каждого типа изделия необходимо проверить два критерия.
Для рыцарей оба критерия никогда не совпадают. На поле не может быть колонны, в которой нет ни одного коня, ни двух. Для ладей и слонов возможно выполнение оба критерия. Квадрат может иметь тот же столбец и тот же ряд, что и ладья. Это поле, на котором стоит ладья, и это недопустимый ход. То же самое верно и для слона — соответствие обоим критериям означает его собственное поле.
Отсутствует оператор xor (6:23)
Так что для слонов и ладей нам нужен эксклюзив или, что удивительно, в Эликсире его нет! К счастью, Erlang делает, так что мы можем просто вызвать :erlang.xor(condition1, condition2)
. Он вернет true только тогда, когда одно, но не оба условия истинны. Для рыцарей мы можем просто использовать обычный or
.
Есть много способов решить эту проблему без сопоставления с образцом или понимания. Если вы придумали такое решение, вы можете быть удивлены, насколько краток код в этом видео… и это нормально! иногда трудный путь — отличный способ тщательно изучить проблемное пространство и отличная мотивация для изучения новых техник, когда вы с ними сталкиваетесь!
Не стесняйтесь делиться своими решениями ниже!
Первоначально опубликовано на alchemist.camp.