Поиграли в шахматы

21 августа

Этот пятничный Ивент был не похож на все предыдущие. Мы решили дать только одно задание – и то не на скорость.

Суть проста: участникам было необходимо написать программу на BASH, которая будет двигать фигуры на шахматной доске. Победит тот, чей код окажется короче.

Но над этой задачкой можно было засесть на все выходные. Итоги мы уже подвели. Победителем оказался Николай Мурзин.

Его решение выглядит так:

А вот и разбор кода от победителя:

`...` # Выполнить shell код внутри

iconv -tucs2 # Перевод кодировки, из двухбайтных символов в однобайтные, сокращает код в два раза

command<<<$string # То же самое, что echo "$string" | command

После перевода получаем shell код:

eval perl -C -Mutf8 -nE'@_=map[y/i-t/♔-♟/r=~/./g],(qsrporsq,"t"x8,($"x8)x4,"n"x8,kmljilmk)if!@_;y/a-z/0-9/,s/(.) (.)/$_[-$'\''][$2]=${$t=\$_[-$1][$`]},$$t=$"/e}{$,="|",say$\--+8,@$_,for@_;say$,=$",a..h'

eval perl -C -Mutf8 # Запускаем перл с поддержкой utf8

-n # Оборачиваем код в while (<>) { ... } (на самом деле число символов не сокращает, но потенциально могло бы)

E # Включаем фичи 5.10, чтобы работал say

@_= # Приравнять к массиву @_

  map[y/i-t/♔-♟/r  # В каждой строке сделать замену букв на шахматные фигуры

    =~/./g], # и перевести в массив символов

      (qsrporsq, # ряд черных фигур ♜♞♝♛♚♝♞♜

      "t"x8, # ряд черных пешек

      ($"x8)x4, # 4 ряда пустых клеток, в переменой $" лежит пробел по умолчанию

      "n"x8, # ряд белых пешек

      kmljilmk) ряд белых фигур ♖♗♕♔♗♘♖

  if!@_; # Приравнять. Если ещё ни разу не приравнивали, приравняется только один раз в начале цикла

y/a-z/0-9/, # Заменить буквы цифрами, y/// то же самое, что tr///

s/(.) (.)/  # Так, например, матча строчку "12 34", цифры 1, 2, 3, 4 можно достать соответственно из $'(PREMATCH), $1, $2, $`(POSTMATCH)

  $_[-$'\''][$2] # Значение массива доски по первой координате

  =${$t=\$_[-$1][$`] # Значение по второй координате приравнивается по указателю к переменной $t и берется по значению

  },$$t=$" # Меняем значение по указателю на пробел $"

  /e # Режим выполнения s/паттерн/код/e

}{ # Закрываем цикл while, добавляем

$,="|", # Ставим сепаратор элементов массива для вывода

say$\--+8, # Выводим и декрементим $\, прибавляя 8 (т.к. в $\ уже удобно лежит 0)

@$_, # Выводим ряд доски

for@_; # Итерируемся по рядам

say$,=$",a..h' # Выводим нижние подписи, одновременно ставя пробел в качестве сепаратора.

Если ты хочешь не только решать Ивенты, но и придумывать их, пиши на inbox@pinguem.ru. Классные задачи опубликуем, а ты получишь гонорар.

Есть что обсудить – заходи в наш телеграм-чат.

Оставайся с нами! :)

0 комментариев