Конвертер длинной нотации PGN в короткую
Ссылки, поясняющие разницу, были в этой заметке. Мне лично удобней и понятней длинная нотация, читать и "видеть" которую без доски я могу хотя бы несколько ходов (а короткую уже "ниасиливаю" и сбиваюсь, как многие другие любители).
Но на многих ресурсах допустима только короткая запись, а единственный конвертер длинной нотации в короткую, который я нашёл, не работает.
Как Вы понимаете, главная проблема такого преобразования - неоднозначные ходы, например, при ладьях на a1 и a3, если между ними свободная клетка, бессмысленно писать ход Ra2 - непонятно, какая из ладей сходила. Правильно R1a2 или R3a2.
С учётом всего этого, попробую написать свой скрипт, если он кому-то ещё понадобится или обнаружатся баги - пишите, проверим... а сегодня больше времени на chess нет.
Сервис непосредственно в работе доступен по этой ссылке:
Конвертер длинной нотации PGN в короткую
Исходник можно увидеть, открыв код страницы. Она в кодировке Windows-1251.
Всё, что "не узнаёт", скрипт просто переписывает в выходной файл. Пока не думал, как это может сказаться на вложенных в тег комментария { } вариантах и т.п. особенностях формата PGN. Мне для моих простейших файлов, сгенерированных несложными программами, хватает. Что будет делать скрипт при "очень неправильных" входных данных - тоже пока не озадачивался :)
Если в файле PGN несколько партий в длинной нотации - это не должно создать проблем, а вот если там уже короткая нотация вместо длинной - проблемы могут быть любыми.
Тестировал вот на этом PGN:
[FEN "r3k2r/1N1b2P1/8/1b1pPpB1/2PpP3/1NP1B3/1p1Q1Q2/R3K2R w KQkq - 0 1"] [Event "Название турнира"] [Site "Город, страна"] [Date "2015.04.22"] [Round "1"] [White "Player1"] [Black "Player2"] [Result "*"] 1. O-O Bd7-c6 2. Nb7-c5 b2-b1=Q 3. Bg5-h6 O-O-O 4. c3xd4 f5-f4 5. Qd2-b2 Qb1-d3 {коммент1} 6. Rf1-d1 Rh8-e8 7. g7-g8=R Re8xg8+ 8. Kg1-h2 Rg8-g2+ 9. Qf2xg2 Kc8-c7 10. Qb2-c1 d5xc4 {коммент2} 11. Qc1xc4 Bc6-d5 12. Nc5-e6++ Kc7-b7
Возможно, ещё надо обдумать и доработать в листинге:
1. В отличие от чисел и строк, объекты в Javascript копируются по ссылке, а не по значению, так что если сделать
var a = b;
где a
, b
- объекты, а потом поменять a
, то изменится и b
!
Правильно так:
var a = clone(b);
где clone
- функция, копирующая объект (в том числе, содержащий другие объекты) - см. исходник страницы конвертера.
2. Регулярное выражение для сущности "шахматный ход":
/^([NBRQK])?([a-h])([1-8])(x|\-)?([a-h])([1-8])(\=)?([NBRQK])?(\#|\+|\+\+)?(\!|\!\!|\?|\?\?)?$/
После выполнения этой регулярки методом string.exec
, получим массив со следующими "частями" хода" (приведены индексы элементов):
1. фигура (N, B, R, Q, K) или пусто
2-3. столбец и строка, откуда ходим, в обычной нотации (e2)
4. знак "бьёт" (x) или дефис (-) или пусто
5-6. столбец и строка, куда ходим, в обычной нотации (e4)
7. знак =, если было превращение пешки, или пусто
8. фигура, в которую превратилась пешка (N, B, R, Q, K) или пусто
9. знак мат (#), шах (+) или двойной шах (++) или пусто
10. знак сильный - слабый ход (от 1 до двух вопросительных или восклицательных знаков) или пусто.
22.04.2015, 15:58 [8870 просмотров]