Dagaz: В нетрях нотацій

imageПлюнь йому в очі, хто скаже, що можна обійняти неосяжне!

Старанність все перемагає!
 
                          Козьма Прутков "Думки і афоризми


Люди постійно щось вигадують. Після винаходу шахів, було розроблено ще кілька тисяч схожих ігор. Спочатку, за давньою звичкою, що залишилася ще з часів твори античних міфів, створювалися химери, що поєднали в собі якості двох і більше шахових фігур, але згодом фантазія авторів зміцніла і стала видавати більш цікаві варіанти. Щоб не заплутатися у всьому цьому зоопарку, була потрібна якась система, можливість класифікації нових фігур. І вона виникла. Власне, я знаю дві. На жаль, обидві вони не працюють.

Різноманітні варіанти шахів завжди були у фокусі уваги шахового співтовариства. спеціалізованих виданнях можна знайти описи нових ігор, розбори партій, а також статті з історії шахів. Спроби систематизації правил ніколи не розглядалися як щось екстраординарне. Скоріше це життєва необхідність. В основу таких класифікацій було покладено поділ всіх шахових фігур на два великих класи: leapers та riders.

Leaper-и — стрибаючі фігури (наприклад, шаховий «Кінь» — це (1,2)-leaper), що переміщаються на вказане в дужках кількість полів, не звертаючи уваги на що зустрічаються по шляху фігури. Фігури переміщаються на одне поле також можна вважати leaper-ами (Ferz Шатрандж — це (1,1)-leaper), але, оскільки вони переміщуються на сусіднє поле, то можуть перестрибнути лише 0 фігур (все законно). При великому бажанні, до того ж класу можна віднести і шахову "Пішака", але зазвичай так не надходять. Більшість ортодоксів взагалі не вважає її фігурою.

Ладьи слоны і ферзі потрапляють в іншу категорію фігур. Це rider-и — фігури, що переміщаються по прямій через довільну кількість порожніх полів (Тура — (1,0)-rider). Існують і «стрибаючі» rider-и, такі як Nightrider (отриманий з шахового коня), але і вони, по шляху свого проходження, можуть пересуватися лише по порожніх полів. Запропонована класифікація вважалася розумною і зручною до тих пір, поки не виявилися фігури, які в неї не укладаються. Так з'явилися Hopper-и і Locust-и. Проблему це не вирішило, оскільки існували сотні фігур, що не є ні тим ні іншим.

Parlett's movement notation

Першу масштабну спробу навести порядок в цьому звіринці, зробив, по всій видимості, David Parlett. У своїй книзі "The Oxford History of Board Games" він використовував позначення власного винаходу, для класифікації різних фігур використовуються в численних варіантах шахових ігор.

ParlettДистанція:
  • 1 — переміщення на сусіднє поле

  • 2 — через одне поле
  • n — на довільну кількість полів (як Човен або Слон)
Напрям:
  • * — Переміщення в усіх (восьми) напрямках
  • + — За ортогоналям (вертикалях і горизонталях)
  • > — Вперед по вертикалі
  • < — Назад по вертикалі
  • <> — Вперед і назад по вертикалі
  • = — По горизонталі (вправо або вліво)
  • >= — По горизонталі чи по вертикалі вперед
  • <= — По горизонталі чи по вертикалі назад
  • X — По діагоналях
  • X> — По діагоналях вперед
  • X< — По діагоналях тому
Угруповання:
  • / — Послідовне виконання двох ортогональних переміщень
  • & — Повторення руху у тому ж напрямку
  • . — Виконання однієї дії слідом за іншим
Цього набору цілком достатньо для опису простих випадків, таких як Король (1*) або Ладья (nX) у класичних Шахах. Але вже в разі шахового Коня починаються складності. Як виразити той факт, що ця фігура може «перестрибувати через інші фігури? Пішаком теж усе непросто. Це єдина фігура в Шахах виконує «тихий» і «ударні» ходи по-різному. Відповідно, потрібні спеціальні символи, що дозволяють ці ситуації розділити. Виникла необхідність у розширенні нотації:

Умови виконання ходу:
  • i — Перший хід фігурою (наприклад хід Пішаком з початкової позиції через одне поле)
  • c — Виконання взяття (ударний хід)
  • o — Хід без взяття (тихий)
Типи ходів:
  • ~ — Перестрибування через інші фігури
  • ^ — Взяття перепрыгиваемой фігури (як в шашках
Додаткові типи угруповання:
  • , — Роздільник варіантів ходів (наприклад, для Пішаки визначається три можливі варіанти ходу)
  • - — Визначення діапазону можливого переміщення фігури

  • Король: 1*
  • Ферзь: n*
  • Слон: nX
  • Тура: n+
  • Кінь: ~1/2
  • Пішак: o1>, c1X>, oi2>
Що можна сказати про цю нотації? Насамперед, вона не дуже-то очевидна і (що набагато гірше) зовсім не універсальна. Так, ми передбачили спеціальний символ для «стрибаючих» фігур і для взяття при перестрибуванні», як в шашках (cn(^2X>), o1X>), але зовсім забули про такий важливий клас фігур, як Hoppers.

В результаті, всілякі «гармати» (наприклад, Xiangqi і Janggi) залишилися «за бортом» нашого опису. Більш того, навіть шахові фігури описані неточно. Так, для пішаки описана можливість «стрибка» через порожнє поле з початкової позиції (oi2>), але де опис взяття на проході? Де нотація рокировок виконуваних Королем? Якщо якась можливість складна для опису, це не означає, що описувати її не треба!

Ralph Betza's «funny notation»

Ralph Betza — особистість, у світі шахів, також відома. Крім серйозного захоплення класичними шахами, він відомий як розробник більш ніж 40 вельми оригінальних варіантів цієї гри, таких як "Chess with different armies" або "The Way of the Knight". Гостро розуміючи необхідність системи класифікації шахових фігур, Ralph запропонував свій варіант нотації. Запропонована ним система стала, фактично, загальноприйнятим стандартом, використовуваним для опису можливостей шахових фігур.

BetzaОснову описи складають заголовні літери латинського алфавіту. Кожна з них визначає хід фундаментального leaper-а:

WWazir (0,1)-leaper
FFers (1,1)-leaper («Ферзь» з Шатрандж
DDabbaba (0,2)-leaper
NKnight (1,2)-leaper (всім відомий шаховий «Кінь»)
AAlfil (2,2)-leaper
HThreeleaper (0,3)-leaper
CCamel (1,3)-leaper
JZebra (2,3)-leaper
GTripper (3,3)-leaper

Для найбільш уживаних фігур вводяться скорочення. Так шаховий «Король» (K = FW) поєднує в собі ходи фігур Fers і Wazir. Rider виходить з leaper-а подвоєнням великої літери. Шаховий «Слон» (B = FF) — це ні що інше як rider, отриманий з фігури Fers, також як «Човен» (R = WW) побудована на основі фігури Wazir. Шаховий «Ферзь» (Q = BR) поєднує ходи цих двох фігур. Зрозуміло, цього недостатньо. Для «Пішаки» (самої складної фігури) необхідно задавати модифікатори:

  • f — Рух вперед
  • b — Рух назад
  • v — Коротка запис модифікатора fb
  • l — Рух вліво
  • r — Рух вправо
  • s — Коротка запис модифікатора r
  • t — Виконання однієї дії слідом за іншим
  • — Взяття
  • m — «Тихий» хід
Крім модифікаторів, в нотації Betza можуть використовуватися цифри. W5, наприклад, визначає обмежений range, що дозволяє переміщатися по ортогоналям, не більше ніж на 5 кроків. У деяких випадках, для угруповання «атомів» можуть використовуватися квадратні дужки. Наприклад, t[WB] або 1+.nX, в нотації Parlett-а) описує фігуру «Aanca», переміщається на одне поле ортогонально і, вслід за тим, на довільну кількість полів по діагоналі.

  • Король: K = WF
  • Ферзь: Q = RB
  • Слон: B = FF
  • Тура: R = WW
  • Кінь: N
  • Пішак: mfWcfF
Все це чудово, але «Пішак» повинна вміти ходити через одне поле з початкової позиції! Потрібно більше модифікаторів для нотації Betza!

Betza (продовження)
  • gGrasshopper
  • p — «Гармата» (це з "Китайських шахів")
  • h — Забавний модифікатор, про який скажу трохи нижче
  • j — Обов'язкове «перестрибування» фігури
  • n — Рух без «стрибків» через фігури
  • o — Рух по циліндричній дошці
  • z — Рух фігури «зигзагом» (ще один кумедний модифікатор)
Що означає модифікатор "h"? Щоб зрозуміти це, потрібно згадати одну з фігур "Японських шахів". Кінь в них «стрибучий», як і в класичних шахах, але ходить тільки вперед, всього на два поля. Як виразити це, за допомогою нотації Betza? fN — гарна спроба, але, рухаючись вперед, кінь, взагалі кажучи, може потрапити на 4, а не на 2 поля! Модифікатор h покликаний «розрулити» цю ситуацію:

  • ff — Рух «вперед-вперед» (як «Кінь» в Сьоги)
  • fs — Рух «вперед-в сторони» (з поля e4 можна потрапити на c5 або g5)
  • fh — Рух вперед (на всі чотири сторони)
Повинен сказати, що при використанні «Parlett's notation» японський кінь виглядає не краще: (~1/2)> (narrow).

  • Пішак: mfWcfFimfW2
Тут не описано "взяття на проході", але не будемо занадто дріб'язковими. Зрозуміло, ця нотація не універсальна! Ось що, з цього приводу, пише автор:

The notation is not універсальний or perfect yet. Imagine a piece that moves square one diagonally, and if that square is empty it can continue by jumping two squares diagonally in the same direction, and then three squares (like a Bishop that goes faster and faster!). My notation has no way to describe such a piece.
Втім, такі жахи як «Слон» з «змінюваною геометрією ходу» зовсім не потрібні для того, щоб поставити позначення Betza в глухий кут. Існує маса інших цікавих фігур, століттями використовуються в численних варіантах Сеги. Почати, безумовно, слід з Chu Shogi і її «Лева»:


Ця фігура робить як би два ходи (обидва на одне поле в будь-яку сторону, як «Король»). Таким чином, «Лев» може з'їсти дві фігури за хід або виконати ще більш хитрий акробатичний номер — з'їсти фігуру знаходиться поруч з ним і, другим ходом, повернутися на своє місце. Такий хід, в різних «Shogi variants», має настільки фундаментальне значення, що йому присвоєно ім'я власне — igui. І це далеко не саме екзотичне застосування концепції «другого ходу»:


Це три фігури з Ko Shogi. Cavalry (騎総 kisō) дуже схожа на фігуру «Лева», але використовує хід шахового «Коня», при цьому рухаючись в «ту» сторону. Winged horse (天馬 temba) — більш сильна фігура, яка продовжує хід у будь-якому доступному для «Коня» напрямку. Twelve-mile fog (五里霧) виглядає простіше, рухаючись двічі як Alibaba (AD), але після кожного ходу, він може «вбити» опинилася з ним поруч фігуру супротивника ходом igui. Якщо цих прикладів мало — знайдуться ще:


Roaming assault (招揺 shōyō) — «Бойова колісниця», що рухається на п'ять (або менше) полів по прямій, вбиваючи всі фігури супротивника, трапляються на шляху. Thunderclap (霹靂 hekireki) робить все ті ж п'ять ортогональних ходів, але довільно змінюючи напрямок! І не треба думати, що таке зустрічається тільки в Ko Shogi! Dai dai shogi, Tenjiku shogi, Taikyoku shogi — у всіх цих іграх використовуються схожі фігури. H. G. Muller, розробник чудовою шахової програми WinBoard/XBoard, запропонував ще один кумедний модифікатор, що дозволяє вирішити цю проблему.

Модифікатор "a" означає виконання «другого ходу», що дозволяє описати хід «Лева» aK (подвійний хід «Королем»). Як правило, додаткові модифікатори дозволяють описувати складні ходи. Ось так, наприклад, у розширеної нотації Betza виглядає хід фігури з «Шашок»: fmF(fcafmF). Можете спробувати розшифрувати це самі. Саме ця нотація використовується при описі фігур в «історичних» варіантах Сеги:

  • Cavalry: [NaffN][xN]
  • Winged horse: aN
  • Twelve-mile fog: a[DA]acxK
  • Roaming assault: Wa5fW
  • Thunderclap: a!5W
Думаєте, нотація Betza стала універсальною? Тоді спробуйте описати, з її допомогою, цю гру:


Отже…

Якщо у вас є проблеми, і ви хочете використовувати регулярні вирази...

Зрозумійте мене правильно, я не шукаю складність заради самої складності! Мені просто не подобається те, що існуючі нотації неконструктивні. У насправді, що ми робимо коли виявляємо новий тип фігури? Ми додаємо нову літеру! За прикладом далеко ходити не треба. Ось що пише H. G. Muller з приводу рокіровок:

'O' is not an original Betza atom, but many extensions use it as null-move. As such, any repetition of it, like O2, would be pointless, as would be any modifier prefixes. I therefore propose to use O + number as a shorthand for (conventional) castling. (After all, castling in PGN is denoted as O-O or O-O-O) The number would indicate how many steps the King moves. The move of the Rook (or in general, the corner piece) is implied: it ends up next to the King on its other side. Also implied is that you cannot move or through out of check, and that all squares between King and corner have to be empty. So the full description of a King would be FIDE: WFisO2
Резервування окремої літери для настільки приватної речі як рокіровка, мені особисто здається дуже марнотратним! Йдучи по цьому шляху, ми почнемо резервувати все нові і нові літери для всіх специфічних ходів! Наприклад, в Jetan-е «Принцеса», один раз за гру, має право стрибнути на будь-яке вільне поле дошки, не перебуває під боєм. На рокіровку цей хід не схожий. Значить потрібна нова буква? А що робити коли всі букви закінчаться? І це не кажучи про те, що на виході ми маємо не цілком очевидну, не універсальну і, найголовніше, надлишкову нотацію:

  • g — Grasshopper
  • p — «Гармата» з "Китайських шахів"
  • j — Обов'язкове «перестрибування» фігури
  • ...
Grasshopper — це майже те ж саме, що і Пушка (у всякому разі, корейська)! Навіщо витрачати на нього ще одну букву? І його поведінка безпосередньо пов'язана з «перепрыгиванием» через фігури (j)! З нотацією Parlett-а та ж історія: '~' — перестрибування через фігури, '^' — взяття перепрыгиваемой фігури, а про hopper-ов ми взагалі забули! Повернемося до Фанороне. Вся проблема полягає в її специфічному способі взяття:


Це не шахове і не шашкова взяття. З урахуванням обмеженого розміру дошки, такий хід можна описати, використовуючи модифікатор 'a' для нотації Betza, але опис буде дуже громіздким! Доведеться описувати переміщення фігури за цільове поле (зі взяттям по дорозі ворожих фігур), а потім повернення, для кожної довжини ланцюжка і для всіх восьми напрямків! І це не кажучи про те, що далеко не на всіх полях Фанороны всі ці вісім напрямків доступні. А адже Фанорона — не якийсь новомодний винахід! На Мадагаскарі в цю гру грають з 1600-го року.

(*)[p]|((\1[ex])*;~1(~1[ex])*)

Виглядає як повна абракадабра і чимось нагадує регулярні вирази. Загалом-то, це не випадково. Регулярні вирази були придумані для опису кінцевих автоматів, а що таке ігрова дошка, з переміщається по ній фігурою, як не кінцевий автомат? Розглянемо складові частини більш докладно:

DagazФактично, всі вираз являє собою перелік дій, які виконуються послідовно або альтернативно. Послідовні дії розділяються комою (','), а альтернативи — символом крапки з комою (';'). Дії можуть групуватися дужками. Оскільки дії змінюють стан дошки і фігур, важливо, що кома визначає порядок виконання дій. Успішно виконавши всі дії, перераховані через кому (в більшості випадків її можна опускати), у зазначеному порядку, ми генеруємо можливий хід.

З альтернативою справа йде трохи складніше. Дві (або більше) альтернативи починають з однакового початкового стану і працюють незалежно один від одного. Ми досягаємо мети якщо вдається виконати будь-яку з альтернатив. Для простоти можна вважати, що кома пов'язує дії як 'і', а крапка з комою — як 'або'. В принципі, цих двох дій вже достатньо, але, щоб скоротити опис, нам потрібні кванторів:

  • {n,m} — Повторення дії від n m разів (n < m)
  • {n} — Повторення дії n раз рівне
  • {n,} — Не менше n разів
  • {m} — Не більш m разів
Все як у регулярних виразах. Зрозуміло, визначаємо і звичні скорочення:

  • ?{0,1}
  • *{0,}
  • +{1,}
Тепер поговоримо про дії. Очевидним дією є переміщення по одному з напрямків дошки. Традиційно, використовуються позначення сторін світу: 'N', 'S', 'W', 'E' — для ортогональних і 'NW', 'NE', 'SW', 'SE' — для діагональних напрямків, але з причин, про які я скажу трохи нижче, я б не хотів використовувати двох-літерні позначення. Замість них я вирішив використовувати 'M', 'O', 'R', 'T', аналогічно до того, як це робиться у проекті "LUDÆ". Таким чином:

  • N
  • S — Південь
  • W — Захід
  • E — Схід
  • M — Північно-захід
  • O — Північно-схід
  • R — Південно-захід
  • T — Південно-схід
  • U — Вгору (про це розповім нижче)
  • D Вниз
  • + — За ортогоналям (аналогічно Parlett і LUDÆ)
  • X — По діагоналях
  • * — По всьому (стандартним) напрямами
Позначення узагальнених напрямків конфліктують з квантификаторами, але цю колізію нескладно дозволити. Дія переміщення завжди може бути взято в дужки, а квантіфікатор ніколи не може слідувати відразу за дужки що відкривається. Слід зауважити, що визначення напрямів тісно пов'язані з описом дошки. Виглядає це приблизно ось так:

Дошка Фанороны
fanorona-9x5
grid: a-i x 5-1
N = (0, -1)
E = (1, 0)
S = (0, 1)
W = (-1, 0)
O = a3>b4>c5,a1>b2>c3>d4>e5,c1>d2>e3>f4>g5,e1>f2>g3>h4>i5,g1>h2>i3
T = a3>b2>c1,a5>b4>c3>d2>e1,c5>d4>e3>f2>g1,e5>f4>g3>h2>i1,g5>h4>i3
R = c5>b4>a3,e5>d4>c3>b2>a1,g5>f4>e3>d2>c1,i5>h4>g3>f2>e1,i3>h2>g1
M = c1>b2>a3,e1>d2>c3>b4>a5,g1>f2>e3>d4>c5,i1>h2>g3>f4>e5,i3>h4>g5

Якщо для фігури задано рух «в будь-яку сторону» ('*'), а позиція, на якій вона знаходиться, визначає лише ортогональні напряму — фігура зможе переміщатися тільки ортогонально. Чому я не хочу використовувати двох-літерні позначення? Все просто — якщо я перераховую кілька альтернативних напрямків, то повинен обробити їх символом крапки з комою (наприклад, рух не перетвореної фігури в "Турецьких шашках" — W;N;E), але, оскільки такий запис буде зустрічатися часто, я хотів би опускати крапки з комою, для більшої лаконічності (писати просто — WNE). Мені не хотілося б, щоб в цих випадках виникали конфлікти з двубуквенными позначеннями напрямків.

Інші дії:

  • \1,...\9 — Переміщення в напрямку, раніше захопленому в змінну
  • ~1,...~9 — Переміщення в напрямку протилежному захопленого
  • | — Постановка фігури на дошку (всі наступні переміщення виконуємо фігури)
  • [...] — Спеціальні дії, перевірки та інше
Про змінних варто розповісти докладніше. Велика спокуса описати хід «Човна» наступним чином: NEWS+ (або навіть просто: ++), але це буде очевидною помилкою. Фактично, цим описом ми говоримо, що Човен рухається по ортогонали, один або більше кроків, але ніде не згадуємо про те, що рух має відбуватися в одному і тому ж напрямку! Це дуже схоже на хід раніше згадуваної фігури Thunderclap, але без будь-якого обмеження дальності ходу.

Вибір напрямку повинен проводитися один раз за хід, а це означає, що обраний напрям необхідно зафіксувати в змінної: (+)\1*. Це опис краще, але і воно не зовсім вірно. Човен може рухатися по прямій, до першої ворожої фігури, але лише по порожніх полів. Щоб Човен не проходила крізь інші фігури, необхідно уточнити опис: (+)([p]\1)*. Буква у квадратних дужках тут — спеціальна перевірка того, що поле, на якому ми знаходимося вільно (якщо це не так, генерація ходу переривається). Це одне із стандартних дій, визначених специфікацією:

  • [p] — Поле пусте?
  • [P] — Поле не порожнє?
  • [e] — Ворожа фігура?
  • [E] — Не ворожа фігура?
  • [f] — Дружня фігура?
  • [F] — Не дружня фігура?
  • [a] — Поле атаковано?
  • [A] — Поле не атаковано?
  • [s] — Поле захищено?
  • [S] — Поле не захищено?
  • [o] — Хід цього типу виконується в перший раз за гру?
  • [m] — Фігура переміщалася?
  • [M] — Фігура не переміщалася?
  • [r] — Поле посещалось раніше, в межах складеного ходу?
  • [R] — Поле не посещалось раніше, в межах складеного ходу?
  • [l] — Поле початку попереднього часткового ходу?
  • [t] — Поле завершення попереднього часткового ходу?
  • [x] — Взяття фігури
Крім перерахованого, квадратні дужки дозволяють розширювати специфікацію, вставляючи посилання на обробники на якійсь універсальній мові програмування (наприклад JavaScript). Вказуючи цифру в квадратних дужках, ми говоримо, що в цьому місці необхідно викликати спеціальний обробник, для виконання дій, опис яких мовою специфікації неможливо або недоцільно (як я вже згадував вище, ніхто не може осягнути неосяжне). Хорошим прикладом гри, ілюструє необхідність таких розширень може послужити Ритмомахия.

Строго кажучи, я трохи лукавлюВизначаючи хід «Човна» (+)([p]\1)* я описав, як постать рухається по полю, але тут немає нічого про те, як виконується взяття. По перше, ми не повинні мати можливість завершити хід на полі, зайнятій фігурою свого кольору. Далі, якщо на цільовому поле є фігура супротивника, потрібно її взяти і вже після цього ставити свою фігуру на дошку: [F][ex]?|. З початком ходу теж все не так просто. По-перше, якщо у нас визначено дію постановки фігури на дошку, повинно бути визначено і протилежне йому, але найголовніше (і про це дуже легко забути), ми маємо право рухати по полю лише фігури свого кольору (в "Ставропольских шашках" це не так): [f]^.

Це дійсно важливі моменти (якщо ми говоримо про універсальної нотації), але не повторювати їх в описі практично кожній фігури було б надмірно. Розумно зробити ці постфікс і префікс частиною опису ігрової дошки. Дошка такого типу (default) володіє двома властивостями. По-перше (і це головне) — кожне поле дошки може містити не більше однієї фігури. Якщо ми ставимо іншу фігуру на зайняте поле, фігура стояла на ньому раніше автоматично «забирається». Друге правило полягає в тому, що гравець має право переміщувати тільки свої фігури (це справедливо для переважної більшості ігор).

Такий тип побудови дошки не є єдино можливим. Я можу визначити ще, як мінімум, два типи: stack (для таких ігор як "Пулук" або "Стовпові шашки") і heap (для різного роду "Манкал"). У випадку «стовпових» ігор, гравець має право переміщувати «стопки» фігур (за умови того, що нагорі стопки розташована його фігура) і встановлювати «стопки» один на одного. У манкалах, «фігури» розміщуються на полі невпорядкованою «купою». Гравець бере «купу» цілком і розподіляє по інших полях дошки. Фігури на heap-дошці не обов'язково однотипні! Існує, як мінімум одна манкала, для якої це не так.

Ще одним важливим конструктивним елементом є навігація всередині квадратних дужок. Наприклад, якщо нам необхідно виконати взяття, не переміщаючи саму фігуру, не обов'язково писати щось на зразок N[x]S, запис вигляду [x>N] буде також цілком коректна.

Після всіх цих необхідних роз'яснень, я можу «розшифрувати» свою нотацію ходу фігур в Фанороне:

(*) # Рухаємося в довільному напрямку (захопивши його в змінну)
[p] # Якщо поле не порожнє - перериваємо генерацію ходу
| # Ставимо фігуру на дошку
(
(\1[ex])* # Рухаємося вперед і поки є ворожі фігури - беремо їх
; # або
~1 # Йдемо назад (на стартове поле)
(~1[ex])* # Продовжуючи рух, беремо по шляху ворожі фігури
)

Тут, я свідомо опускаю моменти пов'язані з описом складеного ходу (це окрема і досить цікава тема). Продовжуючи порівняння нотацій, наведу свій опис ходів шахових фігур. Жирним шрифтом виділено та частина опису, за яку Parlett та Betza навіть не бралися (рокіровки і взяття на проході»):

  • Король: *[A];[MA](E[p]){2}[A]|E^[M]W{2};[MA](W[p]){3}[A]|W^[M]E{2}
  • Ферзь: (*)([p]\1)*
  • Слон: (X)([p]\1)*
  • Тура: (+)([p]\1)*
  • Кінь: N,OM;E,OT;S TR;W,RM
  • Пішак: N[p];OM[e];[M](N[p]){2};[(te,=Pawn,x)>E]O[l>N];[(te,=Pawn,x)>W]M[l>N]
Завершити цю розповідь я хотів би афоризмом все того ж Козьми Пруткова:

Буває, що старанність пересилює і розум

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.