--[[ 이 모듈의 목적은 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*