БлогNot. Где взять базу данных с FEN'ами позиций для шахматных задач?

Где взять базу данных с FEN'ами позиций для шахматных задач?

Понадобилась коллекция задач на мат в 2, 3 хода и т.д., в простейшем текстовом формате "одна строка - одна позиция"...

Ясно, что для записи задачи достаточно иметь только FEN позиции, хотя, конечно, можно сохранять в файле и дополнительную информацию, скажем, об типе задачи, авторе и/или партии, откуда взята задача, и её решении, например:

White Mates in 2.
Alexander Motylev vs David Baramidze, Germany, 10/21/2012
4rk2/1bq2p1Q/3p1bp1/1p1n2N1/4PB2/2Pp3P/1P1N4/5RK1 w - - 1 0
1. Bxd6+ Qe7 2. Qxf7#

Поиск по запросам вроде "checkmate in 2 problem FEN database download", "chess puzzles fen database" и т.п. ничего дельного не дал, а ковырять FEN'ы из форумных тем с задачами - долго. Впрочем, немного эту проблему можно облегчить, если есть текстовые файлы, откуда нужно "вытащить" FEN. Напишем соответствующий скрипт и соберём немного позиций.

Например, из текста этой задачной странички скрипт благополучно извлёк 68 позиций. Дублирующиеся строки легко можно исключить моей утилитой SUS, тогда останется 34 позиции (на момент написания заметки).

Несложный Regexp для сущности "шахматная позиция в формате FEN":

([bnrqkpBNRQKP1-8\/])+\s+[bw]\s+(-|[KQkq])+\s+(-|[a-hA-H][1-8])(\s+\d{1,3}\s+\d{1,3})?

Скрипт на PHP, которым можно "вытащить" позиции FEN из текстового файла:

<!DOCTYPE html>
<html><head>
<meta charset="windows-1251">
<title>FEN parser</title>
</head>
<body>
<?php 
 $data='';
 if (isset($_POST['data'])) $data = htmlspecialchars($_POST['data'],ENT_COMPAT|ENT_HTML401, 'cp1251');
 if (!isset($_POST['submit'])) {
  echo '<p><small>Вставьте содержимое текстового файла в поле ввода</small></p>';
  echo '<form method="post" action="'.$_SERVER['PHP_SELF'].'">
   <textarea name="data" rows="25" cols="80">'.$data.'</textarea>
   <input type="submit" name="submit" value="Выполнить">
   <a href="'.$_SERVER['PHP_SELF'].'">Очистить</a></form>'."\n";
 } 
 else {
  $k=0;
  $array = explode ("\n",$data);
  $regexp = "/([bnrqkpBNRQKP1-8\/])+\s+[bw]\s+(-|[KQkq])+\s+(-|[a-hA-H][1-8])(\s+\d{1,3}\s+\d{1,3})?/";
  $output = ''; 
  foreach ($array as $d) {
   $res = preg_match_all ($regexp,trim($d),$matches);
   if ($res===false) die ("Regexp error: ".$value);
   elseif ($res!==0) {
    for ($i=0; $i<$res; $i++) $output .= $matches[0][$i]."\n";
    $k += $res;
   }
  }
  echo '<p>Найдено записей FEN: '.$k.'</p>';
  echo '<p><form method="post" action="'.$_SERVER['PHP_SELF'].'">'.
   '<textarea name="output" rows="25" cols="80">'.$output.'</textarea>'.
   '<input type="hidden" name="data" value="'.$data.'">'.
   '<input type="submit" name="return" value="Вернуться"></form></p>'."\n";
 }  
?>
</body></html>

Предполагается, что данные вставляются и обрабатываются на сервере в кодировке русской Windows (Windows-1251), в противном случае поменяйте тег <meta charset> и параметры функции htmlspecialchars. Идеология скрипта точно такая же, на "Денвере" и PHp5.5 сработал нормально.

В общем, на вопрос заголовка я пока не ответил, но чтобы не разочаровывать читателя, прикреплю несколько файлов, корректность всех позиций не гарантирую :)

Если файлы пополнятся, перегружу их на этой странице.

 Задачи на мат в 1 ход, файл .txt с FEN'ами (51 Кб)

 Задачи на мат в 2 хода, файл .txt с FEN'ами (44 Кб)

 Задачи на мат в 3 хода, файл .txt с FEN'ами (27 Кб)

 Задачи на мат в 4 хода, файл .txt с FEN'ами (26 Кб)

Если знаете, где взять большую базу - пишите.

30.05.2017, 12:57 [7110 просмотров]


теги: программирование php шахматы форматы поиск

показать комментарии (2)