모듈:Pgn

Module
--[[ 이 모듈의 목적은 pgn 분석 로컬 기능을 제공하는 것입니다. pgn2fen이라고 불리는 주요 국소 기능: 입력: 단일 게임의 대수 표기법 또는 전체 pgn 출력: 위치 표 1개(FEN 표기법 사용), 게임의 각 동작당 1개 pgn 메타데이터가 포함된 루아테이블 1개(있는 경우)   목적: 이 로컬을 사용하여 템플릿에서 사용할 유틸리티 로컬 함수를 만들 수 있습니다. 유틸리티 로컬 기능은 다음과 같이 작동합니다. 물론 pgn 외에도 이동 목록과 캡션, "nowiki" 태그의 일부 위키코드를 받습니다. 각 이동마다 토큰 FEN을 이동의 펜으로 대체하고 토큰 COMMENT를 이동의 주석(있는 경우)으로 대체합니다. 그러면 Wiki 코드를 구문 분석하고 모든 구문 분석기 결과를 반환합니다. 다른 사람들은 그것을 사용하는 다른 방법에 자금을 댈 수 있습니다.  논리: 분석 파트는 자바스크립트 "pgn" 프로그램에서 자유롭게 복사됩니다.  주 객체: "보드": 64개의 정사각형(0-63)으로 구성된 0 기반 테이블(1차원 배열), 각 정사각형은 비어 있거나 charToFile의 문자를 포함합니다(예: "pP"는 폰입니다).  유틸리티 로컬 기능 행/열 인덱스 색인화할 행/색 disambig(파일, 행): 파일이 숫자이면 반환하고, 그렇지 않으면 행을 인덱스로 반환합니다. create(펜): ready board 반환 generate Fen(보드) - selfverständlich  pieceAt(코디): 행/콜에서 piece를 반환합니다. findPieces(피스): 특정 피스("블랙 킹", "화이트 룩" 등)를 포함하는 모든 사각형 목록을 반환합니다. roadIsClear(시작/끝 행/열): 시작 및 끝 _must_는 동일한 행, 동일한 열 또는 대각선에 있어야 합니다. 그렇지 않으면 오류가 발생합니다. 시작과 끝 사이의 모든 제곱이 명확한 경우 true를 반환합니다. canMove(source, dest, capture): 부울(capture는 일반적으로 반복적이지만, Enpassent는 제외) 프로모션(코디네이션, 지정, 색상) move(색상, 대수적 표기법): 어떤 조각이 이동해야 하는지 확인합니다. 조각이 없거나 둘 이상 발견되지 않으면 오류가 발생합니다. 이동을 실행합니다.   원시 Pgn 분석(입력) pgn 또는 대수적 표기법을 가져오고 메타데이터가 있는 표를 반환하며 개별 이동이 있는 대수적 표기법이 있는 두 번째 표를 반환합니다.  주: 메타데이터, 표기법 : = rawPgn Analysis(입력) 결과:= 빈 테이블 startFen : = 메타데이터.fen 기본값, 결과 += startFen 보드 := create(startFen) 표기법을 반복하다. 게시판, 색상 및 표기법, 수정된 게시판 가져오기 결과 += generateFen() 반환 결과  "고기"는 "움직일 수 있습니다.하지만, 밝혀진 바와 같이, 그것은 그렇게 어렵지 않습니다. 유일한 복잡성은 폰과 관련이 있는데, 둘 다 비대칭적이고 불규칙하기 때문입니다. 무차별적인 힘(가능한 우아하게)  다른 조각들은 산들바람입니다.색상은 중요하지 않습니다.calc da : = abs (날카로운 원시), db : = abs (날카로운 열) 조각 규칙 기사: da * db - 2 = 0 룩: da * db = 0 비숍: da - db = 0 King db db = 1 (비트 또는 ) Queen da * db * (da - db) = 0   이동: 어떤 작품인지 알아보세요.보드에 있는 모든 사람을 찾아서 각각에게 이동을 실행할 수 있는지 묻고 "예"를 카운트합니다.  예는 하나만 있어야 합니다(일부 실행은 처리).이동을 실행합니다.     ]]  현지의 블랙입니다. = "검은색" 현지의 하얀색 = "흰색"  현지의   = "P" 현지의   = "R" 현지의 기사 = "N" 현지의 비숍 = "B" 현지의 여왕님 = "Q" 현지의  = "K"  현지의 킹사이드 = 7 현지의 퀸사이드 = 12  현지의 기본_보드 = 'rnbqkbnr/ppppppp/8/8/8/PPPPPPPPP/RNBQKBNR'  현지의 비트32 = 비트32 또는 요구하다('bit32')  --[[로컬로 실행할 경우 다음 줄에 주석을 달아야 합니다. mw = mw 또는 { ustring = 문자열, 텍스트 = { ['filename'] = 로컬 함수(들, 패턴) local res = {} 정말로 로컬 시작, 완료 = s:find(find) 만약 끝내고 > 1을 끝낸다면, 그때. local frag = s:sub(1, 시작 - 1) table.삽입(res, frag) s = s:sub(슬롯 + 1) 또 다른 브레이크. 끝. 끝. #s인 경우 table.insert(res, s) end 리턴 레스 끝. ['timeout'] = 국소 함수(t) t = type(t) == 'string' 및 t:gsub(^%s+), ') t = t:gsub('%s+$, ') 리턴 t 끝. } } ]]  lua 5.3에서 언팩은 더 이상 퍼스트 클래스 시민이 아니지만 - 테이블 할당. 현지의 짐을 풀다 = 짐을 풀다 또는 테이블. 테이블.    현지의 기능. 적용합니다.(f, ...)  res = {}  과녁을 맞음 = {...}  위해서 인드의 = 1, #과녁을 맞음 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   res[인드의] = f(과녁을 맞음[인드의])  끝.  돌아가다 짐을 풀다(res) 끝.  현지의 기능. (s)  돌아가다 것은 아니다. s 또는 mw.본문.다듬다(s) == '' 끝.  현지의 기능. 비어 있으면 falseIf(s)  돌아가다 것은 아니다. (s) 그리고. s 끝.  현지의 기능. charTo파일(ch)  돌아가다 비어 있으면 falseIf(ch) 그리고. string.바이트(ch) - string.바이트(a.) 끝.  현지의 기능. charToRow(ch)  돌아가다 비어 있으면 falseIf(ch) 그리고. 수에 달하여(ch) - 1 끝.  현지의 기능. 색인 대상 좌표(색인을 달다)  돌아가다 색인을 달다 % 8, 수학.플로어(색인을 달다 / 8) 끝.  현지의 기능. 좌표:인덱스로(파일, 배를 젓다)   돌아가다 배를 젓다 * 8 + 파일 끝.  현지의 기능. charToPiece(편지)  현지의 조각 = mw.ustring.위쪽의(편지)  돌아가다 조각, 조각 == 편지 그리고. 하얀색 또는 블랙입니다. 끝.  현지의 기능. 조각을 차르로(조각, 색.)  돌아가다 색. == 하얀색 그리고. 조각 또는 mw.ustring.더 낮게(조각) 끝.  현지의 기능. 색인으로 모호함(파일, 배를 젓다)  한다면 배를 젓다 == 영의 그리고나서 돌아가다 파일 끝.  돌아가다 좌표:인덱스로(파일, 배를 젓다) 끝.  현지의 기능. 엔파상트 로우(색.)  돌아가다 색. == 하얀색 그리고. 5 또는 2 끝.    현지의 기능. 서명하다(a)  돌아가다 a < 0 그리고. -1    또는 a > 0 그리고. 1    또는 0 끝.  현지의 기능. 토막토막(위원회, fileOrInd, 배를 젓다) 두 개의 매개 변수, fileOr로 호출됩니다.색인은 색인이고, 그렇지 않으면 파일입니다.  현지의 편지 = 위원회[색인으로 모호함(fileOrInd, 배를 젓다)]   한다면 것은 아니다. 편지 그리고나서 돌아가다 끝.  돌아가다 charToPiece(편지) 끝.  현지의 기능. 조각 찾기(위원회, 조각, 색.)  현지의 결과 = {}  현지의 찾다 = 조각을 차르로(조각, 색.)  위해서 색인을 달다 = 0, 63 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   현지의 편지 = 위원회[색인을 달다]   한다면 편지 == 찾다 그리고나서 표.삽입(결과, 색인을 달다) 끝.  끝.  돌아가다 결과 끝.  현지의 기능. 도로 이상 없음(위원회, 인드1, 인드2)  한다면 인드1 == 인드2 그리고나서 오류('동일한 인덱스로 call to roadIsClear', 인드1) 끝.  현지의 file1, 행 1 = 색인 대상 좌표(인드1)  현지의  파일2, 2열 = 색인 대상 좌표(인드2)   한다면 (file1 - 파일2) * (행 1 - 2열) * (수학, 수학, 수학 시험답(행 1 - 2열) - 수학, 수학, 수학 시험답(file1 - 파일2)) ~= 0 그리고나서   오류('동일한 행, 열 또는 대각선이 아닌 두 개의 인덱스를 roadIsClear로 보냈습니다.', 인드1, 인드2)  끝.  현지의 델타 = 서명하다(파일2 - file1)  현지의 vdelta = 서명하다(2열 - 행 1)  현지의 배를 젓다, 파일 = 행 1 + vdelta, file1 + 델타  하는 동안에 배를 젓다 ~= 2열 또는 파일 ~= 파일2 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   한다면 토막토막(위원회, 파일, 배를 젓다) 그리고나서 돌아가다 거짓의 끝.   배를 젓다 = 배를 젓다 + vdelta   파일 = 파일 + 델타  끝.  돌아가다 진실의 끝.  현지의 기능. poneCanMove(위원회, 색., 시작파일, startRow, 파일, 배를 젓다, 포획.)  현지의 호르., ver = 파일 - 시작파일, 배를 젓다 - startRow  현지의 absVer = 수학, 수학, 수학 시험답(ver)  한다면 포획. 그리고나서   현지의 네 알겠습니다 = 호르. * 호르. == 1 그리고. (     색. == 하얀색 그리고. ver == 1 또는     색. == 블랙입니다. 그리고. ver == - 1    )       현지의 열광적인 = 네 알겠습니다 그리고.    배를 젓다 == 엔파상트 로우(색.) 그리고.     토막토막(위원회, 파일, 배를 젓다) == 영의   돌아가다 네 알겠습니다, 열광적인  또 다른    한다면 호르. ~= 0 그리고나서 돌아가다 거짓의 끝.  끝.  한다면 absVer == 2 그리고나서   한다면 것은 아니다. 도로 이상 없음(위원회, 좌표:인덱스로(시작파일, startRow), 좌표:인덱스로(파일, 배를 젓다)) 그리고나서 돌아가다 거짓의 끝.   돌아가다 색. == 하얀색 그리고. startRow == 1 그리고. ver == 2 또는    색. == 블랙입니다. 그리고. startRow == 6 그리고. ver == -2  끝.  돌아가다 색. == 하얀색 그리고. ver == 1 또는 색. == 블랙입니다. 그리고. ver == -1 끝.  현지의 기능. 이동 가능(위원회, 시작, 증류, 포획., 장황한)  현지의 시작파일, startRow = 색인 대상 좌표(시작)   현지의 파일, 배를 젓다 = 색인 대상 좌표(증류)  현지의 조각, 색. = 토막토막(위원회, 시작파일, startRow)  한다면 조각 ==  그리고나서 돌아가다 poneCanMove(위원회, 색., 시작파일, startRow, 파일, 배를 젓다, 포획.) 끝.  현지의 dx, dy = 수학, 수학, 수학 시험답(시작파일 - 파일), 수학, 수학, 수학 시험답(startRow - 배를 젓다)  돌아가다  조각 == 기사 그리고. dx * dy == 2    또는 조각 ==  그리고. bit32.bor(dx, dy) == 1     또는 (     조각 ==  그리고. dx * dy == 0      또는 조각 == 비숍 그리고. dx == dy      또는 조각 == 여왕님 그리고. dx * dy * (dx - dy) == 0    ) 그리고. 도로 이상 없음(위원회, 시작, 증류, 장황한) 끝.  현지의 기능. 노출된(위원회, 색.) 퀸, 룩, 비숍에 대한 테스트만.  현지의  = 조각 찾기(위원회, , 색.)[1]  위해서 인드의 = 1, 63 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   현지의 편지 = 위원회[인드의]   한다면 편지 그리고나서    현지의 _, pcolor = charToPiece(편지)    한다면 pcolor ~= 색. 그리고. 이동 가능(위원회, 인드의, , 진실의) 그리고나서     돌아가다 진실의     끝.   끝.  끝. 끝.  현지의 기능. 복제의(기원)  현지의 res = {}  위해서 k, v  쌍들(기원) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 res[k] = v 끝.  돌아가다 res 끝.  현지의 기능. 장소(위원회, 조각, 색., 파일, 배를 젓다) 체스 960의 경우, 우리는 검색해야 합니다.  위원회[색인으로 모호함(파일, 배를 젓다)] = 조각을 차르로(조각, 색.)  돌아가다 위원회 끝.  현지의 기능. 분명한(위원회, 파일, 배를 젓다)  위원회[색인으로 모호함(파일, 배를 젓다)] = 영의  돌아가다 위원회 끝.  현지의 기능. 도캐슬(위원회, 색., )  현지의 배를 젓다 = 색. == 하얀색 그리고. 0 또는 7  현지의 시작파일, 걸음 = 0, 1  현지의 kingDest파일, rookDestFile = 2, 3  현지의  = 조각 찾기(위원회, , 색.)[1]  현지의 rok  한다면  == 킹사이드 그리고나서   시작파일, 걸음 = 7, -1   kingDest파일, rookDestFile = 6, 5  끝.  위해서 파일 = 시작파일, 7 - 시작파일, 걸음 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   현지의 조각 = 토막토막(위원회, 파일, 배를 젓다)   한다면 조각 ==  그리고나서    rok = 좌표:인덱스로(파일, 배를 젓다)    브레이크.   끝.  끝.  위원회 = 분명한(위원회, )  위원회 = 분명한(위원회, rok)  위원회 = 장소(위원회, , 색., kingDest파일, 배를 젓다)   위원회 = 장소(위원회, , 색., rookDestFile, 배를 젓다)  돌아가다 위원회 끝.  현지의 기능. 엔파상(위원회, 전당포, 파일, 배를 젓다)  현지의 _, 색. = 토막토막(위원회, 전당포)  위원회 = 분명한(위원회, 전당포)  위원회 = 장소(위원회, , 색., 파일, 배를 젓다)  한다면 배를 젓다 == 5 그리고나서 위원회 = 분명한(위원회, 파일, 4) 끝.  한다면 배를 젓다 == 2 그리고나서 위원회 = 분명한(위원회, 파일, 3) 끝.  돌아가다 위원회 끝.  현지의 기능. 제네레이터 펜(위원회)  현지의 res = ''  현지의 상쇄하다 = 0  위해서 배를 젓다 = 7, 0, -1 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   위해서 파일 = 0, 7 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    조각 = 위원회[좌표:인덱스로(파일, 배를 젓다)]    res = res .. (조각 또는 '1')   끝.   한다면 배를 젓다 > 0 그리고나서 res = res .. '/' 끝.  끝.  돌아가다 mw.ustring.gsub(res, '1+', 기능.( s ) 돌아가다 #s 끝. ) 끝.  현지의 기능. 후보 찾기(위원회, 조각, 색., 오래된 파일, 올드 로우, 파일, 배를 젓다, 포획., 표기법)  현지의 열광적인 = {}  현지의 후보자들, 뉴 캔즈 = 조각 찾기(위원회, 조각, 색.), {} 모든 흑인 졸개나 백인 왕 등.  한다면 오래된 파일 또는 올드 로우 그리고나서    현지의 뉴 캔즈 = {}   위해서 _, 캔들  짝을 짓다(후보자들) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    현지의 파일, 배를 젓다 = 색인 대상 좌표(캔들)    한다면 파일 == 오래된 파일 그리고나서 표.삽입(뉴 캔즈, 캔들) 끝.    한다면 배를 젓다 == 올드 로우 그리고나서 표.삽입(뉴 캔즈, 캔들) 끝.   끝.   후보자들, 뉴 캔즈 = 뉴 캔즈, {}  끝.  현지의 증류 = 좌표:인덱스로(파일, 배를 젓다)  위해서 _, 후보  짝을 짓다(후보자들) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   현지의 할 수 있다   할 수 있다, 열광적인[후보] = 이동 가능(위원회, 후보, 증류, 포획.)   한다면 할 수 있다 그리고나서 표.삽입(뉴 캔즈, 후보) 끝.  끝.   후보자들, 뉴 캔즈 = 뉴 캔즈, {}  한다면 #후보자들 == 1 그리고나서 돌아가다 후보자들[1], 열광적인[후보자들[1]] 끝.  한다면 #후보자들 == 0 그리고나서    오류('실행할 수 있는 조각을 찾을 수 없습니다.' .. 표기법)   끝.  우리는 한 명 이상의 후보자가 있습니다.이것은 그들 중 한 명을 제외한 모든 사람이 실제로 움직일 수 없다는 것을 의미합니다, b/c가 왕을 노출시킬 것입니다.  이 후보가 제거된 새 보드를 만들어 테스트하고, 왕이 노출되었는지 확인합니다.  위해서 _, 후보  짝을 짓다(후보자들) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    현지의 cloneBoard = 복제의(위원회) 먼저, 보드를 복제합니다.   cloneBoard = 분명한(cloneBoard, 후보) 이제, 그 조각을 제거합니다.   한다면 것은 아니다. 노출된(cloneBoard, 색.) 그리고나서 표.삽입(뉴 캔즈, 후보) 끝.  끝.  후보자들, 뉴 캔즈 = 뉴 캔즈, {}  한다면 #후보자들 == 1 그리고나서 돌아가다 후보자들[1] 끝.  오류(mw.ustring.서식을('보드 %s에서 %s을(를) 실행할 수 있는 조각이 너무 많습니다(%d, 예상됨 1)., #후보자들, 표기법, 제네레이터 펜(위원회))) 끝.  현지의 기능. 이사를(위원회, 표기법, 색.)  현지의 게임 종료 = {['1-0']=진실의, ['0-1']=진실의, ['1/2-1/2']=진실의, ['*']=진실의}   현지의 깨끗한 표기법 = mw.ustring.gsub(표기법, '[!?+# ]', '')   한다면 깨끗한 표기법 == 'O-O' 그리고나서   돌아가다 도캐슬(위원회, 색., 킹사이드)  끝.  한다면 깨끗한 표기법 == 'O-O-O' 그리고나서   돌아가다 도캐슬(위원회, 색., 퀸사이드)  끝.  한다면 게임 종료[깨끗한 표기법] 그리고나서   돌아가다 위원회, 진실의  끝.   현지의 양식 = '([RNBKQ]?)([a-h]?)([1-8]?)(x?)([a-h])([1-8])(=?[RNBKQ]?)'  현지의 _, _, 조각, 오래된 파일, 올드 로우, is Capture, 파일, 배를 젓다, 승진 = mw.ustring.찾아내다(깨끗한 표기법, 양식)  오래된 파일, 파일 = 적용합니다.(charTo파일, 오래된 파일, 파일)   올드 로우, 배를 젓다 = 적용합니다.(charToRow, 올드 로우, 배를 젓다)  조각 = 비어 있으면 falseIf(조각) 또는   승진 = 비어 있으면 falseIf(승진)  is Capture = 비어 있으면 falseIf(is Capture)  현지의 후보, 열광적인 = 후보 찾기(위원회, 조각, 색., 오래된 파일, 올드 로우, 파일, 배를 젓다, is Capture, 표기법) #!= 1일 경우 지원자는 당황해야 합니다.  한다면 열광적인 그리고나서   돌아가다 엔파상(위원회, 후보, 파일, 배를 젓다)  끝.  위원회[좌표:인덱스로(파일, 배를 젓다)] = 승진 그리고. 조각을 차르로(승진:후보선수(-1), 색.) 또는 위원회[후보]  위원회 = 분명한(위원회, 후보)  돌아가다 위원회 끝.  현지의 기능. 만들다(  )  FEN 표기법을 64개의 위치 입력 배열로 변환합니다.enwiki 모듈에서 복사됨:체스판 (먼 과거에 내가 그것을 많이 썼습니다)  현지의 res = {}  현지의 배를 젓다 = 8  /로 구분되는 행 위에 루프  위해서 슬로우  string.gmatch( "/" .. , "/%w+" ) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다  슬로우 = 슬로우:후보선수(2)   배를 젓다 = 배를 젓다 - 1   현지의 인드의 = 배를 젓다 * 8   행에 있는 모든 문자와 숫자를 반복합니다.   위해서 조각  슬로우:성냥( %w ) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    한다면 조각:경기( "%d" ) 그리고나서 조금이라도     인드의 = 인드의 + 조각    또 다른 한 자릿수도 아닌     res[인드의] = 조각     인드의 = 인드의 + 1    끝.   끝.  끝.  돌아가다 res 끝.  현지의 기능. 프로세스메타(그로스 메타)   res = {}  공정 그로스메타 여기  위해서 항목  mw.ustring.성냥(그로스 메타 또는 '', '%[([^%]]*)%]') 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   열쇠,  = 항목:경기('([^"]+)"([^"]*)"')   한다면 열쇠 그리고.  그리고나서    res[mw.본문.다듬다(열쇠)] = mw.본문.다듬다() mw.text. 추가   또 다른    오류('잘못된 항목이 탐지되었습니다. .. 항목 .. #항목들) 나중에 오류   끝.  끝.  돌아가다 res 끝.  현지의 기능. Pgn 분석(pgn)  현지의 그로스 메타 = pgn:경기('%[(.*)%]') 첫 번째 열림에서 마지막 대괄호  pgn = string.gsub(pgn, '%[(.*)%]', '')  현지의 계단 = mw.본문.분열되다(pgn, '%s*%d+%.%s*')  현지의 움직인다 = {}  위해서 _, 걸음  짝을 짓다(계단) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   한다면 mw.ustring.(mw.본문.다듬다(걸음)) 그리고나서    계단 = mw.본문.분열되다(걸음, '%s+')    위해서 _, 스텝  짝을 짓다(계단) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다      한다면 스텝 그리고. 것은 아니다. mw.ustring.경기(스텝, '^%s*
                
) 그리고나서 표.삽입(움직인다, 스텝) 끝. 끝. 끝. 끝. 돌아가다 프로세스메타(그로스 메타), 움직인다 끝. 현지의 기능. pgn2fen(pgn) 현지의 메타데이터, 표기법 목록 = Pgn 분석(pgn) 현지의 = 메타데이터. 또는 기본_보드 현지의 위원회 = 만들다() 현지의 res = {} 현지의 색깔들 = {블랙입니다., 하얀색} 위해서 걸음, 표기법 짝을 짓다(표기법 목록) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 현지의 색. = 색깔들[걸음 % 2 + 1] 위원회 = 이사를(위원회, 표기법, 색.) 현지의 = 제네레이터 펜(위원회) 표.삽입(res, ) 끝. 돌아가다 res, 메타데이터 끝. 돌아가다 { pgn2fen = pgn2fen, 주된 = 기능.(pgn) 현지의 res, 메타데이터 = pgn2fen(pgn) 돌아가다 메타데이터, res 끝., }