unit testlib; {NPC 1.0 Copyright (c) Àíòîí Ñóõàíîâ, 1996} {TESTLIB: Áèáëèîòåêà äëÿ ïðîâåðÿþùèõ ïðîãðàìì} {Äàòà ïîñëåäíåãî èçìåíåíèÿ àâòîðîì: 17/03/96} (* modified: kitten computing *) (* modified: 22/10/01 *) (* modified: 29/10/01 *) (* 08/11/01: added support for seekeof function; added support for requirenewline; added support for *eoln; added support for read*withstring; added support for *tostring; added support for symbol&line counting; added support for get*; added support for disablepe&stricteof; file error reporting improved; added support for testjury mode; improved number reading some functions updated *) (* 10/11/01: fixed bug with range check error in readint on 32-bit ints *) (* 02/12/01: added support for nonewline method added support for assert added support for require?eof *) (* 30/01/02: added support for output file *) (* 16/03/02: added support for reopen *) (* 17/11/02: added min&max; fixed bug in fcwa with missed symbols *) (* 24/12/08: synchronized kitten testlib; added support for PE-codes *) {$ifdef VER70} {$A+,B-,D+,E-,F+,G+,I-,L+,N+,O-,P+,Q-,R+,S+,T-,V+,X+,Y+} {$M 65520, 0, 0} {$else} {$IFNDEF FPC} {$A+,B-,C+,D+,E-,F-,G+,H+,I+,J+,K-,L+,M-,N+,O+,P-,Q+,R+,S-,T-,U-,V+,W-,X+,Y+,Z1} {$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00100000} {$IMAGEBASE $00400000} {$APPTYPE CONSOLE} {$ELSE} {$I+,O+,Q+,R+} {$MODE DELPHI} {$ENDIF} {$endif} (* ================================================================= *) interface (* ================================================================= *) type trueint = integer; {$ifndef VER70} type integer = smallint; const maxint = 32767; {$endif} const EofChar = #$1A; Blanks = [#10,#13,' ',#09]; CRS = [#10,#13]; OnlyBlanks = [' ',#09]; NumberBefore = Blanks; NumberAfter = Blanks; AllChars = [#0..#255]; AfterInteger = AllChars-['0'..'9','-']; AfterUnsigned= AllChars-['0'..'9']; AfterReal = AllChars-['0'..'9','.','e','E','+','-']; AfterPReal = AllChars-['0'..'9','.','-']; Accept = true; Reject = false; Accept_EOF = Accept; Reject_EOF = Reject; Accept_Empty = Accept; Reject_Empty = Reject; type REAL = EXTENDED; {!!!!!!!!} const _OK = 0; _WA = 1; _PE = 2; _Fail = 3; _PC10BASE = 50; _PC10RANGE = 200; _PC4BASE = 110; _PC4RANGE = 80; _PC1BASE = 140; _PC1RANGE = 20; {_OK - âñå âåðíî, _WA - íåâåðíûé îòâåò, _PE - ôîðìàò âûâîäà, _Fail - Êîãäà âñå ñëîìàåòñÿ} {_PCxBASE - áàçà PC (AllowPC = x)} {_PCxRANGE - äëèíà èíòåðâàëà äëÿ PC (AllowPC = x)} type CharSet = set of char; TMode = (_Input, _Output, _Answer); TResult = trueint; InStream = object cur: char; {òåêóùèé ñèìâîë, =EofChar, åñëè êîíåö} f: TEXT; {ôàéë} name: string; {Èìÿ ôàéëà} mode: TMode; opened: boolean; linecount, linepos:longint; curstring:string; savedlinecount, savedlinepos:longint; {Äëÿ âóòðåííåãî èñïîëüçîâàíèÿ} constructor init (fname: string; m: TMode); function CurChar: char; {âûäàåò cur} function NextChar:char; {Ïåðåõîäèò íà ñëåä. ñèìâîë} function eof : boolean; { == cur = EofChar} {ïðîâåðÿåò êîíåö ôàéëà, èãíîðèðóÿ ïðîáåëû è ïåðåâîäû ñòðîêè} function seekeof:boolean; {Ïðîïóñêàåò ñèìâîëû çàäàííîãî ìíîæåñòâà} {Íå âûðàáàòûâàåò îøèáîê} procedure skip (setof: CharSet); {âûäàåò îøèáêó ïðè êîíöå ôàéëà} procedure RequireNotEof; {×èòàåì ñëîâî (èç ñèìâîëîâ). Ïåðåä ñëîâîì ïðîïóñêàþòñÿ âñå ñèìâîëû èç Before. Ïðèçíàêîì êîíöà ñëîâà ÿâëÿåòñÿ ëèáî êîíåö ôàéëà, ëèáî ñèìâîë èç After. Åñëè ReadWord íàòûêàåòñÿ íà êîíåö ôàéëà èëè ñëîâî ïóñòîå, òî îí ç àâåðøàåòñÿ ñ îøèáêîé _PE} {Åñëè ñëîâî ñîñòîèò áîëåå, ÷åì èç 255 ñèìâîëîâ => âûõîäèò ñ îøèáêîé _PE} {$ifndef VER70} function ReadWord (Before, After: CharSet): string; overload; {$endif} function ReadWord (Before, After: CharSet; EmptyPossible:boolean): string; {$ifndef VER70} overload; {$endif} {Âåðñèè *String òàêæå âîçâðàùàþò èñõîäíîå ÷èñëî â âèäå ñòðîêè äëÿ óäîáñòâà âûâîäà îøèáêè ïðè íåñîâïàäåíèè} {Âåðñèè *AndSets ïðèíèìàþò ïðîèçâîëüíûå ìíîæåñòâà ñèìâîëîâ Before è After} {Âåðñèè *Only* ÷èòàþò ÷èñëî âíóòðè òåêñòà, â òî÷íîñòè â òåêóùåé ïîçèöèè, íåçàâèñèìî îò ïðåäøåñòâóþùèõ è ïîñëåäóþùèõ ñèìâîëîâ} {×èòàåò öåëîå integer} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadIntegerWithStringAndSets (var save:string; Before, After:CharSet):integer; function ReadIntegerWithString (var save:string):integer; function ReadInteger: integer; {×èñëî âíóòðè òåêñòà} function ReadOnlyIntegerWithString (var save:string):integer; function ReadOnlyInteger:integer; function ReadOnlyUnsignedWithString (var save:string):integer; function ReadOnlyUnsigned:integer; {×èòàåò äëèííîå öåëîå} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadLongintWithStringAndSetsSafe (var save:string; Before, After:CharSet; var code : trueint): longint; function ReadLongintWithStringAndSets (var save:string; Before, After:CharSet):longint; function ReadLongintWithString (var save:string):longint; function ReadLongint: longint; {Öåëîå â çàäàííûõ ïðåäåëàõ, èíà÷å _PE} function ReadIntegerRange (fromn, ton:longint):longint; {×èñëî âíóòðè òåêñòà} function ReadOnlyLongintWithString (var save:string):longint; function ReadOnlyLongint:longint; function ReadOnlyUnsignedLongWithString (var save:string):longint; function ReadOnlyUnsignedLong:longint; {×èòàåò âåùåñòâåííîå} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadRealWithStringAndSets (var save:string; Before, After:CharSet):real; function ReadRealWithString (var save:string):real; function ReadReal: real; {×èòàåò ñòðîêó (äî ñèìâîëîâ #13, #10), òåêóùåé ïîçèöèåé ñòàíîâèòñÿ ïåðâûé ñèìâîë ñëåä. ñòðîêè} {Åñëè ñòðîêà ñîñòîèò áîëåå, ÷åì èç 255 ñèìâîëîâ => âûõîäèò ñ îøèáêîé _PE} function ReadString: string; {Òðåáóåò íàëè÷èÿ ïåðåâîäà ñòðîêè â òåêóùåé ïîçèöèè ôàéëà} procedure RequireNewLine (EOFAcceptable:boolean); {äîñòèãíóò ëè êîíåö ñòðîêè?} function eoln:boolean; {òî æå ñàìîå, íî ñ èãíîðèðîâàíèåì ïðîáåëîâ} function seekeoln:boolean; {ïîëó÷àåò íîìåð òåêóùåé ñòðîêè} function GetLineCountStr:string; function ReadableLineCountStr:string; {ïîëó÷àåò ïàðó (òåêóùàÿ ñòðîêà, òåêóùàÿ ïîçèöèÿ)} function GetPosPair:string; function ReadablePosPair:string; {ñîõðàíÿåò ïîçèöèþ äëÿ ïîñëåäóþåãî ïðåîáðàçîâàíèÿ â ñòðîêó ïðè îøèáêå} procedure SavePosition; {ïîëó÷àåò ñîõðàíåííûé íîìåð ñòðîêè} function GetSavedLineCountStr:string; function ReadableSavedLineCountStr:string; {ïîëó÷àåò ïàðó (ñîõðàíåííàÿ ñòðîêà, ñîõðàíåííàÿ ïîçèöèÿ)} function GetSavedPosPair:string; function ReadAbleSavedPosPair:string; {Âûâîäèò îøèáêó "îæèäàëñÿ êîíåö ôàéëà", íè÷åãî íå ïðîâåðÿÿ} procedure UnExpectedEOF; {ïîëó÷àåò òåêóùóþ ñòðîêó ïîëíîñòüþ äëÿ âûâîäà îøèáêè} function GetCurString:string; {òðåáóåò íàëè÷èå ñòðîêè s íà÷èíàÿ ñ òåêóùåé ïîçèöèè ÷èòàåìîãî ôàéëà} procedure RequireString (s:string); {Âûäàåò PE, åñëè â òåêóùåé ïîçèöèè íàõîäèòñÿ ïåðåâîä ñòðîêè (ïðîïóñêàåò ïðîáåëû)} procedure NoNewLine; procedure assert (what:boolean;msg:string); procedure test (what:boolean); procedure requireeof; procedure requireleof; procedure requireseof; {êîðîòêèå èìåíà} function nc:char; procedure noeof; procedure rne; function RW (Before, After: CharSet; EmptyPossible:boolean): string; function ReadW (Before, After: CharSet; EmptyPossible:boolean): string; function getint:integer; function onlyint:integer; function roi:integer; function unsonly:integer; function rou:integer; function rr:real; function rl:longint; function getl:longint; function getlong:longint; function readl:longint; function rol:longint; function onlylong:longint; function roul:longint; function onlyul:longint; function getstr:string; function reads:string; function rs:string; procedure rnl (eo:boolean); procedure newl (eo:boolean); procedure reql (eo:boolean); function lcs:string; function lcstr:string; function slcs:string; function slcstr:string; function rlcs:string; function rlcstr:string; function rslcs:string; function rslcstr:string; function lc:string; function lnum:string; function lcnt:string; function rlnum:string; function rlcnt:string; function rlc:string; function slnum:string; function slcnt:string; function slc:string; function rslnum:string; function rslcnt:string; function rslc:string; function pp:string; function pospair:string; function spp:string; function spospair:string; function rpp:string; function rpospair:string; function rspp:string; function rspospair:string; procedure savep; procedure sp; function cs:string; function cl:string; function cstr:string; function getcstr:string; function curstr:string; function getcs:string; procedure reqs (s:string); procedure reqstr (s:string); procedure nnl; procedure nonewl; procedure noeoln; procedure nnewl; procedure nonl; procedure reof; procedure rleof; procedure rseof; procedure reqeof; procedure reqleof; procedure reqseof; function getrng (fromn, ton:longint):longint; function getintr (fromn, ton:longint):longint; function intrange (fromn, ton:longint):longint; function intrng (fromn, ton:longint):longint; (* âûõîä â çàâèñèìîñòè îò òèïà ôàéëà: â ñëó÷àå input èëè answer òèï âûõîäà fail *) procedure QUIT (res: TResult; msg: string); (* ïåðåîòêðûòü îòêðûòûé ôàéë (÷èòàòü ñíà÷àëà) *) procedure reopen; procedure reset; private {Äëÿ âíóòðåííåãî èñïîëüçîâàíèÿ} last13, last10:boolean; procedure readnewline; {procedure close;} end; {$ifdef TESTJURY} const _WI=_PE; {$endif} {Âûõîä} procedure QUIT (res: TResult; msg: string); {Ïî ÷èñëó âîçâðàùàåò ñòðîêó} function IntToString (a:longint):string; function RealToString (a:real):string; {Ïî ñèìâîëó âîçâðàùàåò ÷èòàáåëüíîå åãî îïèñàíèå} function SymbolToString (c:char):string; {Äåëàåò ñòðîêó ãîòîâîé ê ïå÷àòè} function MakePrintable (s:string):string; {óäàëÿåò ïðîáåëû ñïðàâà} function StripRightSpaces (s:string):string; {ñëåâà} function StripLeftSpaces (s:string):string; {ñïðàâà è ñëåâà} function StripSpaces (s:string):string; {ñòðîãàÿ ïðîâåðêà íà EOF (ëèøíèå ïðîáåëû è ïåðåâîäû ñòðîêè ïðèâîäÿò ê îøèáêå)} procedure StrictEof; {Âìåñòî áîëüøèíñòâà PE âûâîäÿòñÿ WA} procedure DisablePE; procedure EnablePE; {Òî, ÷òî ìû âûâîäèì âìåñòî PE} function GetPE:TResult; function min (a, b:longint):longint; function max (a, b:longint):longint; function CompToString (a:extended):string; function Cp2s (a:extended):string; procedure q (res:tresult; msg:string); function i2s (a:longint):string; function i2str (a:longint):string; function int2str (a:longint):string; function inttostr (a:longint):string; function r2s (a:real):string; function r2str (a:real):string; function real2str (a:real):string; function realtostr (a:real):string; function c2s (c:char):string; function c2str (c:char):string; function chr2str (c:char):string; function chrtostr (c:char):string; function char2str (c:char):string; function chartostr (c:char):string; function s2s (c:char):string; function s2str (c:char):string; function sym2str (c:char):string; function symtostr (c:char):string; function mp (s:string):string; function makep (s:string):string; function mprt (s:string):string; function makeprt (s:string):string; function srs (s:string):string; function srsp (s:string):string; function sls (s:string):string; function slsp (s:string):string; function ss (s:string):string; function ssp (s:string):string; procedure steof; procedure nope; {$ifdef TESTJURY} procedure CreateInf (s:string); procedure AssignOutput (s:string); procedure ci (s:string); procedure ao (s:string); {$endif} {$ifdef TESTJURY} function CurChar: char; {âûäàåò cur} function NextChar:char; {Ïåðåõîäèò íà ñëåä. ñèìâîë} function eof : boolean; { == cur = EofChar} {ïðîâåðÿåò êîíåö ôàéëà, èãíîðèðóÿ ïðîáåëû è ïåðåâîäû ñòðîêè} function seekeof:boolean; {Ïðîïóñêàåò ñèìâîëû çàäàííîãî ìíîæåñòâà} {Íå âûðàáàòûâàåò îøèáîê} procedure skip (setof: CharSet); {âûäàåò îøèáêó ïðè êîíöå ôàéëà} procedure RequireNotEof; {×èòàåì ñëîâî (èç ñèìâîëîâ). Ïåðåä ñëîâîì ïðîïóñêàþòñÿ âñå ñèìâîëû èç Before. Ïðèçíàêîì êîíöà ñëîâà ÿâëÿåòñÿ ëèáî êîíåö ôàéëà, ëèáî ñèìâîë èç After. Åñëè ReadWord íàòûêàåòñÿ íà êîíåö ôàéëà èëè ñëîâî ïóñòîå, òî îí ç àâåðøàåòñÿ ñ îøèáêîé _PE} {Åñëè ñëîâî ñîñòîèò áîëåå, ÷åì èç 255 ñèìâîëîâ => âûõîäèò ñ îøèáêîé _PE} function ReadWord (Before, After: CharSet; EmptyPossible:boolean): string; {Âåðñèè *String òàêæå âîçâðàùàþò èñõîäíîå ÷èñëî â âèäå ñòðîêè äëÿ óäîáñòâà âûâîäà îøèáêè ïðè íåñîâïàäåíèè} {Âåðñèè *AndSets ïðèíèìàþò ïðîèçâîëüíûå ìíîæåñòâà ñèìâîëîâ Before è After} {Âåðñèè *Only* ÷èòàþò ÷èñëî âíóòðè òåêñòà, â òî÷íîñòè â òåêóùåé ïîçèöèè, íåçàâèñèìî îò ïðåäøåñòâóþùèõ è ïîñëåäóþùèõ ñèìâîëîâ} {×èòàåò öåëîå integer} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadIntegerWithStringAndSets (var save:string; Before, After:CharSet):integer; function ReadIntegerWithString (var save:string):integer; function ReadInteger: integer; {×èñëî âíóòðè òåêñòà} function ReadOnlyIntegerWithString (var save:string):integer; function ReadOnlyInteger:integer; function ReadOnlyUnsignedWithString (var save:string):integer; function ReadOnlyUnsigned:integer; {×èòàåò äëèííîå öåëîå} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadLongintWithStringAndSets (var save:string; Before, After:CharSet):longint; function ReadLongintWithString (var save:string):longint; function ReadLongint: longint; {×èñëî âíóòðè òåêñòà} function ReadOnlyLongintWithString (var save:string):longint; function ReadOnlyLongint:longint; function ReadOnlyUnsignedLongWithString (var save:string):longint; function ReadOnlyUnsignedLong:longint; {×èòàåò âåùåñòâåííîå} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadRealWithStringAndSets (var save:string; Before, After:CharSet):real; function ReadRealWithString (var save:string):real; function ReadReal: real; {×èòàåò ñòðîêó (äî ñèìâîëîâ #13, #10), òåêóùåé ïîçèöèåé ñòàíîâèòñÿ ïåðâûé ñèìâîë ñëåä. ñòðîêè} {Åñëè ñòðîêà ñîñòîèò áîëåå, ÷åì èç 255 ñèìâîëîâ => âûõîäèò ñ îøèáêîé _PE} function ReadString: string; {Òðåáóåò íàëè÷èÿ ïåðåâîäà ñòðîêè â òåêóùåé ïîçèöèè ôàéëà} procedure RequireNewLine (EOFAcceptable:boolean); {äîñòèãíóò ëè êîíåö ñòðîêè?} function eoln:boolean; {òî æå ñàìîå, íî ñ èãíîðèðîâàíèåì ïðîáåëîâ} function seekeoln:boolean; {ïîëó÷àåò íîìåð òåêóùåé ñòðîêè} function GetLineCountStr:string; function ReadableLineCountStr:string; {ïîëó÷àåò ïàðó (òåêóùàÿ ñòðîêà, òåêóùàÿ ïîçèöèÿ)} function GetPosPair:string; function ReadablePosPair:string; {ñîõðàíÿåò ïîçèöèþ äëÿ ïîñëåäóþåãî ïðåîáðàçîâàíèÿ â ñòðîêó ïðè îøèáêå} procedure SavePosition; {ïîëó÷àåò ñîõðàíåííûé íîìåð ñòðîêè} function GetSavedLineCountStr:string; function ReadableSavedLineCountStr:string; {ïîëó÷àåò ïàðó (ñîõðàíåííàÿ ñòðîêà, ñîõðàíåííàÿ ïîçèöèÿ)} function GetSavedPosPair:string; function ReadAbleSavedPosPair:string; {Âûâîäèò îøèáêó "îæèäàëñÿ êîíåö ôàéëà", íè÷åãî íå ïðîâåðÿÿ} procedure UnExpectedEOF; {ïîëó÷àåò òåêóùóþ ñòðîêó ïîëíîñòüþ äëÿ âûâîäà îøèáêè} function GetCurString:string; {òðåáóåò íàëè÷èå ñòðîêè s íà÷èíàÿ ñ òåêóùåé ïîçèöèè ÷èòàåìîãî ôàéëà} procedure RequireString (s:string); {Âûäàåò PE, åñëè â òåêóùåé ïîçèöèè íàõîäèòñÿ ïåðåâîä ñòðîêè (ïðîïóñêàåò ïðîáåëû)} procedure NoNewLine; procedure assert (what:boolean;msg:string); procedure test (what:boolean); procedure requireeof; procedure requireleof; procedure requireseof; {êîðîòêèå èìåíà} function nc:char; procedure noeof; procedure rne; function RW (Before, After: CharSet; EmptyPossible:boolean): string; function ReadW (Before, After: CharSet; EmptyPossible:boolean): string; function getint:integer; function onlyint:integer; function roi:integer; function unsonly:integer; function rou:integer; function rr:real; function rl:longint; function getl:longint; function getlong:longint; function readl:longint; function rol:longint; function onlylong:longint; function roul:longint; function onlyul:longint; function getstr:string; function reads:string; function rs:string; procedure rnl (eo:boolean); procedure newl (eo:boolean); procedure reql (eo:boolean); function lcs:string; function lcstr:string; function slcs:string; function slcstr:string; function rlcs:string; function rlcstr:string; function rslcs:string; function rslcstr:string; function lc:string; function lnum:string; function lcnt:string; function rlnum:string; function rlcnt:string; function rlc:string; function slnum:string; function slcnt:string; function slc:string; function rslnum:string; function rslcnt:string; function rslc:string; function pp:string; function pospair:string; function spp:string; function spospair:string; function rpp:string; function rpospair:string; function rspp:string; function rspospair:string; procedure savep; procedure sp; function cs:string; function cl:string; function cstr:string; function getcstr:string; function curstr:string; function getcs:string; procedure reqs (s:string); procedure reqstr (s:string); procedure nnl; procedure noeoln; procedure nonewl; procedure nnewl; procedure nonl; procedure reof; procedure rleof; procedure rseof; procedure reqeof; procedure reqleof; procedure reqseof; function getrng (fromn, ton:longint):longint; function getintr (fromn, ton:longint):longint; function intrange (fromn, ton:longint):longint; function intrng (fromn, ton:longint):longint; {$endif} {$IFNDEF VER70} function RussianEnding (x : int64; const s1, s2, s3 : string) : string; {$ELSE} function RussianEnding (x : longint; const s1, s2, s3 : string) : string; {$ENDIF} var inf: InStream; {$ifndef TESTJURY} ouf, ans:InStream; TestLibOutput:boolean; {$else} DisplayOK :boolean; DisplayConsole:boolean; OutputAssigned:boolean; {$endif} StrictEofMode :boolean; PEisWA :boolean; const RealDisplayPrecision:integer=6; (* ================================================================= *) implementation (* ================================================================= *) (*uses crt;*) {$ifdef VER70} procedure SetLength (var s:string; newl:longint); begin s[0]:=chr (newl); end; {$endif} function GetPE:TResult; begin if PEisWA then GetPE:=_WA else GetPE:=_PE; end; {$ifndef TESTJURY} procedure QUIT (res: TResult; msg: string); var pe:boolean; begin if (res = _OK) then begin if StrictEofMode then pe:=not ouf.eof else pe:=not ouf.seekeof; if pe then QUIT (GetPE, 'Ëèøíÿÿ èíôîðìàöèÿ â âûõîäíîì ôàéëå'); end; case res of _Fail: write ('* Îáëîì * '); _PE: write ('* Ôîðìàò â/â * '); _OK: write ('* ok * '); _WA: write ('* Íåâåðíûé îòâåò * '); else write ('* ×àñòè÷íîå ðåøåíèå * '); end; writeln (msg); if testliboutput then begin {writeln; case res of _OK:writeln ('OK'); _WA:writeln ('WA'); _PE:writeln ('PE'); _Fail:writeln ('JE'); end;} close (output); end; if res = _OK then begin close (inf.f); close (ouf.f); close (ans.f); HALT (0) end else halt (res); end; {$else} procedure QUITHelper (res: TResult;msg:string;console:boolean); var pe:boolean; begin if not inf.opened then writeln ('ÂÍÈÌÀÍÈÅ!!! Ôàòàëüíàÿ îøèáêà: íå îòêðûò âõîäíîé ôàéë'); if (res = _OK) then begin if StrictEofMode then pe:=not inf.eof else pe:=not inf.seekeof; if pe then QUIT (GetPE, 'Ëèøíÿÿ èíôîðìàöèÿ âî âõîäíîì ôàéëå'); end; case res of _Fail: write ('* Îáëîì * '); _PE: write ('* Ôîðìàò ââîäà * '); _OK: if console and DisplayOK then write ('* ok * '); _WA: write ('* Íåâåðíûé ââîä * '); else write ('* Íåîæèäàííûé ïîâîðîò * '); end; if (res<>_OK) or (DisplayOk and console) then writeln (msg); end; procedure QUIT (res: TResult; msg:string); begin if OutputAssigned then begin QuitHelper (res, msg, false); close (output); end; if DisplayConsole or not OutputAssigned then begin assign (output, ''); rewrite (output); QuitHelper (res, msg, true); end; if res=_PE then runerror (239) else if res=_WA then runerror (241) else if res=_Fail then runerror (240) else if res > 0 then runerror (res) else halt (0); end; {$endif} procedure q (res:tresult; msg:string); begin quit (res, msg);end; constructor Instream.init (fname: string; m: TMode); begin name := fname; mode := m; {$IFDEF FPC} {$IFDEF WINDOWS} FileMode := 0; {$ENDIF} {$ENDIF} assign (f, fname); linecount:=1; linepos:=0; curstring:=''; last13:=false; last10:=false; {$I-} System.reset (f); if IORESULT <> 0 then begin if mode = _Output then QUIT (_PE, 'Îòñóòñòâóåò ôàéë ''' + MakePrintable (fname) + '''') else QUIT (_Fail, 'Îòñóòñòâóåò ôàéë ''' + MakePrintable (fname) + ''''); (*cur := EofChar; {Äëÿ äðóãèõ ôàéëîâ - ìîæíî}*) end else begin opened := true; if system.eof (f) then cur := EofChar else begin cur := ' '; nextchar end; end; if cur=EofChar then linepos:=1; opened := true; end; procedure instream.reopen; begin opened:=false; init (name, mode); end; procedure instream.reset; begin instream.reopen; end; function InStream.curchar: char; begin curchar := cur end; function InStream.nextchar:char; begin if not opened then QUIT (_Fail, 'Ïîïûòêà ÷òåíèÿ èç íåîòêðûòîãî ôàéëà ('+ MakePrintable (name)+')'); nextchar:=cur; if cur = EofChar then {Íè÷åãî íå äåëàåì} else if system.eof (f) then cur := EofChar else begin {$I-} read (f, cur); if IORESULT <> 0 then Quit (_Fail, 'Îøèáêà ÷òåíèÿ ôàéëà ''' + MakePrintable (name) + ''''); end; if cur<>eofchar then if cur=#13 then begin if last13 or last10 then begin SetLength (curstring, 0); inc (linecount); linepos:=1; end else inc (linepos); last10:=false; last13:=true; end else if cur=#10 then begin if not last13 then inc (linepos); last13:=false; if last10 then begin SetLength (curstring, 0); inc (linecount); linepos:=1 end; last10:=true; end else if last10 or last13 then begin inc (linecount); linepos:=1; last13:=false; last10:=false; SetLength (curstring, 1); curstring[1]:=cur; end else begin inc (linepos); if Length (CurString)<255 then begin SetLength (Curstring, Length (CurString)+1); curstring [length (curstring)]:=cur; end; end; end; function instream.nc:char; begin nc:=nextchar;end; procedure InStream.QUIT (res: TResult; msg: string); begin {$ifndef TESTJURY} if mode = _Output then TESTLIB.QUIT (res, msg) else TESTLIB.QUIT (_Fail, msg + ' (' + MakePrintable (name) + ')'); {$else} testjury.QUIT (res, msg) {$endif} {Îøèáêà ïðè ÷òåíèè input èëè answer - ýòî òîëüêî -Fail} end; procedure InStream.UnExpectedEOF; begin QUIT (GetPE, 'Íåîæèäàííûé êîíåö ôàéëà'); end; procedure InStream.RequireNOTEof; begin if eof then UnexpectedEof; end; procedure instream.noeof; begin requirenoteof;end; procedure instream.rne; begin requirenoteof;end; function InStream.ReadWord (Before, After: CharSet; EmptyPossible:boolean): string; var i: longint; res: string; begin while cur in Before do nextchar; if (cur in After) then if not EmptyPossible then QUIT (GetPE, 'Íåîæèäàííûé ñèìâîë ' + SymbolToString (cur) + ' â ïîçèöèè '+GetPosPair) else begin readword:=''; exit end; if cur = EofChar then UnExpectedEOF; i := 0; {$IFDEF VER70} SetLength (Res, 255); {$ELSE} SetLength (Res, 65536); {$ENDIF} repeat inc (i); {$IFDEF VER70} if i > 255 then QUIT (GetPE, 'Ñëèøêîì äëèííàÿ ñòðîêà ('+ GetLineCountStr+')'); {$ELSE} if (i and 65535)=0 then SetLength (Res, Length (Res)+65536); {$ENDIF} res [i] := cur; nextchar until (cur in After) or (cur = EofChar); SetLength (Res, i); ReadWord := res end; {$ifndef VER70} function InStream.ReadWord (Before, After: CharSet): string; begin ReadWord:=ReadWord (Before, After, true); end; {$endif} function instream.rw (before, after:charset;emptypossible:boolean):string; begin rw:=readword (before, after, emptypossible);end; function instream.readw (before, after:charset;emptypossible:boolean):string; begin readw:=readword (before, after, emptypossible);end; function InStream.ReadIntegerWithStringAndSets (var save:string; Before, After:CharSet):integer; var res: longint; code: trueint; begin save := ReadWord (Before, After, Reject_Empty); {$R-} val (save, res, code); {$R+} if code <> 0 then QUIT (GetPE, 'Âìåñòî "' + save + '" îæèäàëîñü öåëîå'); if (res<-maxint-1) or (res>maxint) then quit (GetPE, 'Çàòðåáîâàíî 16-áèòíîå öåëîå, à ïîëó÷åíî "'+save+'"'); ReadIntegerWithStringAndSets := res end; function InStream.ReadIntegerWithString (var save:string):integer; begin ReadIntegerWithString:=ReadIntegerWithStringAndSets (save, NumberBefore, NumberAfter); end; function InStream.ReadInteger: integer; var help:string; begin ReadInteger:=ReadIntegerWithString (help); end; function InStream.ReadIntegerRange (fromn, ton:longint):longint; var tmp:longint; begin if tonton) then quit (getpe, 'Òðåáîâàëîñü ÷èñëî â ïðåäåëàõ îò '+i2s (Fromn)+' äî '+ i2s (ton)+', à ïîëó÷åíî '+i2s (tmp)); ReadIntegerRange:=tmp; end; function instream.intrange (fromn, ton:longint):longint; begin intrange:=readintegerrange (fromn, ton) end; function instream.intrng (fromn, ton:longint):longint; begin intrng:=readintegerrange (fromn, ton) end; function instream.getrng (fromn, ton:longint):longint; begin getrng:=readintegerrange (fromn, ton) end; function instream.getintr (fromn, ton:longint):longint; begin getintr:=readintegerrange (fromn, ton) end; function instream.getint:integer; begin getint:=readinteger; end; function InStream.ReadOnlyIntegerWithString (var save:string):integer; begin ReadOnlyIntegerWithString:=ReadIntegerWithStringAndSets (save, [], AfterInteger); end; function InStream.ReadOnlyInteger: integer; var help:string; begin ReadOnlyInteger:=ReadOnlyIntegerWithString (help); end; function instream.onlyint:integer; begin onlyint:=readonlyinteger; end; function instream.roi:integer; begin roi:=readonlyinteger; end; function InStream.ReadOnlyUnsignedWithString (var save:string):integer; begin ReadOnlyUnsignedWithString:=ReadIntegerWithStringAndSets (save, [], AfterUnsigned); end; function InStream.ReadOnlyUnsigned: integer; var help:string; begin ReadOnlyUnsigned:=ReadOnlyUnsignedWithString (help); end; function instream.unsonly:integer; begin unsonly:=readonlyunsigned; end; function instream.rou:integer; begin rou:=readonlyunsigned; end; function InStream.ReadRealWithStringAndSets (var save:string; Before, After:CharSet): real; var res: real; code: trueint; begin save := ReadWord (Before, After, Reject_Empty); val (save, res, code); if code <> 0 then QUIT (GetPE, 'Âìåñòî "' + save + '" îæèäàëîñü âåùåñòâåííîå'); ReadRealWithStringAndSets := res end; function InStream.ReadRealWithString (var save:string):real; begin ReadRealWithString:=ReadRealWithStringAndSets (save, NumberBefore, NumberAfter); end; function InStream.ReadReal:real; var help:string; begin ReadReal:=ReadRealWithString (help); end; function instream.rr:real; begin rr:=readreal;end; function InStream.ReadLongintWithStringAndSetsSafe (var save:string; Before, After:CharSet; var code : trueint): longint; var res: longint; begin save := ReadWord (Before, After, Reject_Empty); val (save, res, code); ReadLongintWithStringAndSetsSafe := res end; function InStream.ReadLongintWithStringAndSets (var save:string; Before, After:CharSet): longint; var res: longint; code: trueint; begin save := ReadWord (Before, After, Reject_Empty); val (save, res, code); if code <> 0 then QUIT (GetPE, 'Âìåñòî "' + save + '" îæèäàëîñü 32-áèòíîå öåëîå'); ReadLongintWithStringAndSets := res end; function InStream.ReadLongintWithString (var save:string):longint; begin ReadLongintWithString:=ReadLongintWithStringAndSets (save, NumberBefore, NumberAfter); end; function InStream.ReadLongint:longint; var help:string; begin ReadLongint:=ReadLongintWithString (help); end; function instream.rl:longint; begin rl:=readlongint;end; function instream.getl:longint; begin getl:=readlongint;end; function instream.readl:longint; begin readl:=readlongint;end; function instream.getlong:longint; begin getlong:=readlongint;end; function InStream.ReadOnlyLongintWithString (var save:string):longint; begin ReadOnlyLongintWithString:=ReadLongintWithStringAndSets (save, [], AfterInteger); end; function InStream.ReadOnlyLongint: longint; var help:string; begin ReadOnlyLongint:=ReadOnlyLongintWithString (help); end; function instream.rol:longint; begin rol:=readonlylongint;end; function instream.onlylong:longint; begin onlylong:=readonlylongint;end; function InStream.ReadOnlyUnsignedLongWithString (var save:string):longint; begin ReadOnlyUnsignedLongWithString:=ReadLongintWithStringAndSets (save, [], AfterUnsigned); end; function InStream.ReadOnlyUnsignedLong: longint; var help:string; begin ReadOnlyUnsignedLong:=ReadOnlyUnsignedLongWithString (help); end; function instream.roul:longint; begin roul:=readonlyunsignedlong;end; function instream.onlyul:longint; begin onlyul:=readonlyunsignedlong;end; procedure InStream.skip (setof: CharSet); begin while (cur in setof) and (cur <> eofchar) do nextchar; end; function InStream.eof : boolean; begin eof := cur = EofChar end; procedure InStream.ReadNewLine; begin if cur=#13 then nextchar; if cur=#10 then nextchar; end; function InStream.ReadString: string; var res: string; begin res := ReadWord ([], CRS, Accept_Empty); ReadNewLine; readstring := res end; function instream.getstr:string; begin getstr:=readstring;end; function instream.reads:string; begin reads:=readstring;end; function instream.rs:string; begin rs:=readstring;end; {procedure InStream.close; begin if opened then system.close (f) end;} function InStream.seekeof : boolean; begin skip (Blanks); seekeof:=eof; end; function InStream.eoln : boolean; begin eoln:=cur in [#13, #10, #26]; end; function InStream.seekeoln : boolean; begin skip (OnlyBlanks); seekeoln := eoln; end; procedure InStream.RequireNewLine (EofAcceptable:boolean); begin SavePosition; if cur=#26 then if EofAcceptable then exit else UnExpectedEOF; if cur=#10 then begin nextchar;exit end; if cur=#13 then begin nextchar; if cur<>#10 then QUIT (GetPE, 'Îæèäàëñÿ ïåðåâîä ñòðîêè â ïîçèöèè '+GetSavedPosPair); nextchar; exit; end; QUIT (GetPE, 'Îæèäàëñÿ ïåðåâîä ñòðîêè â ïîçèöèè '+GetSavedPosPair); end; procedure instream.rnl (eo:boolean);begin requirenewline (eo);end; procedure instream.newl (eo:boolean);begin requirenewline (eo);end; procedure instream.reql (eo:boolean);begin requirenewline (eo);end; function IntToString (a:longint):string; var tmp:string; begin str (a, tmp); IntToString:=tmp; end; function i2s (a:longint):string; begin i2s:=inttostring (a);end; function i2str (a:longint):string; begin i2str:=inttostring (a);end; function int2str (a:longint):string; begin int2str:=inttostring (a);end; function inttostr (a:longint):string; begin inttostr:=inttostring (a);end; function RealToString (a:real):string; var tmp:string; begin str (a:0:RealDisplayPrecision, tmp); RealToString:=tmp; end; function r2s (a:real):string; begin r2s:=realtostring (a);end; function r2str (a:real):string; begin r2str:=realtostring (a);end; function real2str (a:real):string; begin real2str:=realtostring (a);end; function realtostr (a:real):string; begin realtostr:=realtostring (a);end; function CompToString (a:extended):string; var tmp:string; begin str (a:0:0, tmp); if abs (a)>9 then begin a:=a-int (a/10)*10; tmp[length (tmp)]:=chr (trunc (abs (a))+48); end; CompToString:=tmp; end; function cp2s (a:extended):string; begin cp2s:=comptostring (a) end; function SymbolToString (c:char):string; var tmp:string; begin if (c<=#32) or (c=#127) then begin str (ord (c), tmp); tmp:='#'+tmp; SymbolToString:=tmp; end else SymbolToString:=''''+c+''''; end; function s2s (c:char):string; begin s2s:=symboltostring (c);end; function s2str (c:char):string; begin s2str:=symboltostring (c);end; function sym2str (c:char):string; begin sym2str:=symboltostring (c);end; function symtostr (c:char):string; begin symtostr:=symboltostring (c);end; function c2s (c:char):string; begin c2s:=symboltostring (c);end; function c2str (c:char):string; begin c2str:=symboltostring (c);end; function chr2str (c:char):string; begin chr2str:=symboltostring (c);end; function chrtostr (c:char):string; begin chrtostr:=symboltostring (c);end; function char2str (c:char):string; begin char2str:=symboltostring (c);end; function chartostr (c:char):string; begin chartostr:=symboltostring (c);end; function MakePrintable (s:string):string; var tmp:string; i, l:integer; begin tmp:=''; {$IFNDEF VER70} if length (s)>1024 then l:=1024 else l:=length (s); {$ELSE} l:=length (s); {$ENDIF} for i:=1 to l do if s[i]<#32 then tmp:=tmp+SymbolToString (s[i]) else tmp:=tmp+s[i]; MakePrintable:=tmp; end; function mp (s:string):string; begin mp:=makeprintable (s) end; function mprt (s:string):string; begin mprt:=makeprintable (s) end; function makeprt (s:string):string; begin makeprt:=makeprintable (s) end; function makep (s:string):string; begin makep:=makeprintable (s) end; function InStream.GetLineCountStr:string; begin GetLineCountStr:=IntToString (LineCount); end; function InStream.readableLineCountStr:string; begin readableLineCountStr:='(ñòðîêà '+GetLineCountStr+')'; end; function instream.lc:string; begin lc:=getlinecountstr; end; function instream.lcnt:string; begin lcnt:=getlinecountstr; end; function instream.lnum:string; begin lnum:=getlinecountstr; end; function instream.lcs:string; begin lcs:=getlinecountstr; end; function instream.lcstr:string; begin lcstr:=getlinecountstr; end; function instream.rlc:string; begin rlc:=readablelinecountstr; end; function instream.rlcnt:string; begin rlcnt:=readablelinecountstr; end; function instream.rlnum:string; begin rlnum:=readablelinecountstr; end; function instream.rlcs:string; begin rlcs:=readablelinecountstr; end; function instream.rlcstr:string; begin rlcstr:=readablelinecountstr; end; function InStream.GetPosPair:string; begin GetPosPair:='('+GetLineCountStr+', '+IntToString (LinePos)+')'; end; function instream.readablepospair:string; begin readablepospair:='[ïîçèöèÿ '+getpospair+']'; end; function instream.pp:string; begin pp:=getpospair; end; function instream.pospair:string; begin pospair:=getpospair; end; function instream.rpp:string; begin rpp:=readablepospair; end; function instream.rpospair:string; begin rpospair:=readablepospair; end; procedure InStream.SavePosition; begin SavedLineCount:=LineCount; SavedLinePos:=LinePos; end; procedure instream.savep; begin saveposition;end; procedure instream.sp; begin saveposition; end; function InStream.GetSavedLineCountStr:string; begin GetSavedLineCountStr:=IntToString (SavedLineCount); end; function InStream.readableSavedLineCountStr:string; begin readableSavedLineCountStr:='(ñòðîêà '+readableSavedLineCountStr+')'; end; function instream.slc:string; begin slc:=getsavedlinecountstr; end; function instream.slcs:string; begin slcs:=getsavedlinecountstr; end; function instream.slcnt:string; begin slcnt:=getsavedlinecountstr; end; function instream.slnum:string; begin slnum:=getsavedlinecountstr; end; function instream.slcstr:string; begin slcstr:=getsavedlinecountstr; end; function instream.rslc:string; begin rslc:=readablesavedlinecountstr; end; function instream.rslcs:string; begin rslcs:=readablesavedlinecountstr; end; function instream.rslcnt:string; begin rslcnt:=readablesavedlinecountstr; end; function instream.rslnum:string; begin rslnum:=readablesavedlinecountstr; end; function instream.rslcstr:string; begin rslcstr:=readablesavedlinecountstr; end; function InStream.GetSavedPosPair:string; begin GetSavedPosPair:='('+GetSavedLineCountStr+', '+IntToString (SavedLinePos)+')'; end; function instream.readablesavedpospair:string; begin readablesavedpospair:='[ïîçèöèÿ '+getsavedpospair+']'; end; function instream.spp:string; begin spp:=getsavedpospair; end; function instream.spospair:string; begin spospair:=getsavedpospair; end; function instream.rspp:string; begin rspp:=readablesavedpospair; end; function instream.rspospair:string; begin rspospair:=readablesavedpospair; end; function StripRightSpaces (s:string):string; begin while (length (s)>0) and (s[length (s)] in Blanks) do SetLength (S, Length (S)-1); StripRightSpaces:=s; end; function srs (s:string):string; begin srs:=striprightspaces (s);end; function srsp (s:string):string; begin srsp:=striprightspaces (s); end; function StripLeftSpaces (s:string):string; var p:integer; begin p:=1; while (p<=length (s)) and (s[p] in Blanks) do inc (p); if p>length (s) then StripLeftSpaces:='' else StripLeftSpaces:=copy (s, p, 255); end; function sls (s:string):string; begin sls:=stripleftspaces (s);end; function slsp (s:string):string; begin slsp:=stripleftspaces (s); end; function StripSpaces (s:string):string; begin StripSpaces:=StripLeftSpaces (StripRightSpaces (s)); end; function ss (s:string):string; begin ss:=stripspaces (s);end; function ssp (s:string):string; begin ssp:=stripspaces (s);end; procedure StrictEof; begin StrictEofMode:=true; end; procedure steof; begin stricteof;end; procedure DisablePE; begin PEisWA:=true; end; procedure EnablePE; begin PEisWA:=false; end; procedure nope; begin disablepe;end; function InStream.GetCurString:string; begin while not InStream.eoln do nextchar; GetCurString:=curstring; end; function instream.cs:string; begin cs:=getcurstring;end; function instream.cl:string; begin cl:=getcurstring;end; function instream.getcs:string; begin getcs:=getcurstring;end; function instream.getcstr:string; begin getcstr:=getcurstring;end; function instream.cstr:string; begin cstr:=getcurstring;end; function instream.curstr:string; begin curstr:=getcurstring;end; procedure InStream.RequireString (s:string); var tmp:string; i:integer; begin SavePosition; tmp:=''; for i:=1 to length (s) do begin if eof then UnExpectedEOF; tmp:=tmp+nextchar; end; if tmp<>s then QUIT (GetPE, 'Òðåáîâàëîñü íàëè÷èå "'+mp(s)+'" â ïîçèöèè '+ GetSavedPosPair+', à ïîëó÷åíî "'+mp(tmp)+'".'); end; procedure instream.reqs (s:string); begin requirestring (s);end; procedure instream.reqstr (s:string); begin requirestring (s);end; procedure InStream.NoNewLine; begin if seekeoln then QUIT (GetPE, 'Íåîæèäàííûé ïåðåâîä ñòðîêè â ïîçèöèè '+ GetPosPair); end; procedure instream.nnl; begin nonewline end; procedure instream.noeoln; begin nonewline end; procedure instream.nonl; begin nonewline end; procedure instream.nnewl; begin nonewline end; procedure instream.nonewl; begin nonewline end; procedure instream.assert (what:boolean; msg:string); begin if not what then quit (getpe, msg); end; procedure instream.test (what:boolean); begin if not what then quit (getpe, ''); end; procedure instream.RequireEOF; begin if not eof then quit (getpe, 'Îæèäàëñÿ êîíåö ôàéëà â ïîçèöèè '+GetPosPair); end; procedure instream.reof;begin requireeof;end; procedure instream.reqeof;begin requireeof;end; procedure instream.requireleof; begin requirenewline (accept); requireeof; end; procedure instream.rleof;begin requireleof;end; procedure instream.reqleof;begin requireleof;end; procedure instream.requireseof; begin if not seekeof then quit (getpe, 'Îæèäàëñÿ êîíåö ôàéëà â ïîçèöèè '+GetPosPair); end; function min (a, b:longint):longint; begin if ab then max:=a else max:=b; end; procedure instream.rseof;begin requireseof;end; procedure instream.reqseof;begin requireseof;end; {$ifdef TESTJURY} (* ìàêðîñû äëÿ æþðè *) function CurChar: char; begin curchar:=inf.curchar;end; function NextChar:char; begin nextchar:=inf.nextchar;end; function eof : boolean; begin eof:=inf.eof;end; {ïðîâåðÿåò êîíåö ôàéëà, èãíîðèðóÿ ïðîáåëû è ïåðåâîäû ñòðîêè} function seekeof:boolean;begin seekeof:=inf.seekeof;end; {Ïðîïóñêàåò ñèìâîëû çàäàííîãî ìíîæåñòâà} {Íå âûðàáàòûâàåò îøèáîê} procedure skip (setof: CharSet); begin inf.skip (setof);end; {âûäàåò îøèáêó ïðè êîíöå ôàéëà} procedure RequireNotEof; begin inf.requirenoteof;end; {×èòàåì ñëîâî (èç ñèìâîëîâ). Ïåðåä ñëîâîì ïðîïóñêàþòñÿ âñå ñèìâîëû èç Before. Ïðèçíàêîì êîíöà ñëîâà ÿâëÿåòñÿ ëèáî êîíåö ôàéëà, ëèáî ñèìâîë èç After. Åñëè ReadWord íàòûêàåòñÿ íà êîíåö ôàéëà èëè ñëîâî ïóñòîå, òî îí ç àâåðøàåòñÿ ñ îøèáêîé _PE} {Åñëè ñëîâî ñîñòîèò áîëåå, ÷åì èç 255 ñèìâîëîâ => âûõîäèò ñ îøèáêîé _PE} function ReadWord (Before, After: CharSet; EmptyPossible:boolean): string; begin readword:=inf.readword (before,after,emptypossible);end; {Âåðñèè *String òàêæå âîçâðàùàþò èñõîäíîå ÷èñëî â âèäå ñòðîêè äëÿ óäîáñòâà âûâîäà îøèáêè ïðè íåñîâïàäåíèè} {Âåðñèè *AndSets ïðèíèìàþò ïðîèçâîëüíûå ìíîæåñòâà ñèìâîëîâ Before è After} {Âåðñèè *Only* ÷èòàþò ÷èñëî âíóòðè òåêñòà, â òî÷íîñòè â òåêóùåé ïîçèöèè, íåçàâèñèìî îò ïðåäøåñòâóþùèõ è ïîñëåäóþùèõ ñèìâîëîâ} {×èòàåò öåëîå integer} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadIntegerWithStringAndSets (var save:string; Before, After:CharSet):integer;begin readintegerwithstringandsets:= inf.readintegerwithstringandsets (save, before, after);end; function ReadIntegerWithString (var save:string):integer; begin readintegerwithstring:=inf.readintegerwithstring (save);end; function ReadInteger: integer; begin readinteger:=inf.readinteger;end; {×èñëî âíóòðè òåêñòà} function ReadOnlyIntegerWithString (var save:string):integer; begin readonlyintegerwithstring:=inf.readonlyintegerwithstring(save);end; function ReadOnlyInteger:integer; begin readonlyinteger:=inf.readonlyinteger;end; function ReadOnlyUnsignedWithString (var save:string):integer; begin readonlyunsignedwithstring:=inf.readonlyunsignedwithstring(save);end; function ReadOnlyUnsigned:integer; begin readonlyunsigned:=inf.readonlyunsigned;end; {×èòàåò äëèííîå öåëîå} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadLongintWithStringAndSets (var save:string; Before, After:CharSet):longint; begin readlongintwithstringandsets:=inf.readlongintwithstringandsets (save, before, after);end; function ReadLongintWithString (var save:string):longint; begin readlongintwithstring:=inf.readlongintwithstring (save);end; function ReadLongint: longint;begin readlongint:=inf.readlongint end; {×èñëî âíóòðè òåêñòà} function ReadOnlyLongintWithString (var save:string):longint; begin readonlylongintwithstring:=inf.readonlylongintwithstring (save);end; function ReadOnlyLongint:longint; begin readonlylongint:=inf.readonlylongint;end; function ReadOnlyUnsignedLongWithString (var save:string):longint; begin readonlyunsignedlongwithstring:=inf.readonlyunsignedlongwithstring (save);end; function ReadOnlyUnsignedLong:longint; begin readonlyunsignedlong:=inf.readonlyunsignedlong;end; {×èòàåò âåùåñòâåííîå} {Ïðè îøèáêå âûõîäèò ñ _PE} function ReadRealWithStringAndSets (var save:string; Before, After:CharSet):real; begin readrealwithstringandsets:=inf.readrealwithstringandsets (save, before, after);end; function ReadRealWithString (var save:string):real; begin readrealwithstring:=inf.readrealwithstring (save);end; function ReadReal: real; begin readreal:=inf.readreal;end; {×èòàåò ñòðîêó (äî ñèìâîëîâ #13, #10), òåêóùåé ïîçèöèåé ñòàíîâèòñÿ ïåðâûé ñèìâîë ñëåä. ñòðîêè} {Åñëè ñòðîêà ñîñòîèò áîëåå, ÷åì èç 255 ñèìâîëîâ => âûõîäèò ñ îøèáêîé _PE} function ReadString: string;begin readstring:=inf.readstring;end; {Òðåáóåò íàëè÷èÿ ïåðåâîäà ñòðîêè â òåêóùåé ïîçèöèè ôàéëà} procedure RequireNewLine (EOFAcceptable:boolean); begin inf.requirenewline (eofacceptable);end; {äîñòèãíóò ëè êîíåö ñòðîêè?} function eoln:boolean;begin eoln:=inf.eoln;end; {òî æå ñàìîå, íî ñ èãíîðèðîâàíèåì ïðîáåëîâ} function seekeoln:boolean;begin seekeoln:=inf.seekeoln;end; {ïîëó÷àåò íîìåð òåêóùåé ñòðîêè} function GetLineCountStr:string; begin getlinecountstr:=inf.getlinecountstr;end; function ReadableLineCountStr:string; begin readablelinecountstr:=inf.readablelinecountstr;end; {ïîëó÷àåò ïàðó (òåêóùàÿ ñòðîêà, òåêóùàÿ ïîçèöèÿ)} function GetPosPair:string;begin getpospair:=inf.getpospair;end; function ReadablePosPair:string; begin readablepospair:=inf.readablepospair;end; {ñîõðàíÿåò ïîçèöèþ äëÿ ïîñëåäóþåãî ïðåîáðàçîâàíèÿ â ñòðîêó ïðè îøèáêå} procedure SavePosition;begin inf.saveposition;end; {ïîëó÷àåò ñîõðàíåííûé íîìåð ñòðîêè} function GetSavedLineCountStr:string; begin getsavedlinecountstr:=inf.getsavedlinecountstr;end; function ReadableSavedLineCountStr:string; begin readablesavedlinecountstr:=inf.readablesavedlinecountstr;end; {ïîëó÷àåò ïàðó (ñîõðàíåííàÿ ñòðîêà, ñîõðàíåííàÿ ïîçèöèÿ)} function GetSavedPosPair:string; begin getsavedpospair:=inf.getsavedpospair;end; function ReadAbleSavedPosPair:string; begin readablesavedpospair:=inf.readablesavedpospair;end; {Âûâîäèò îøèáêó "îæèäàëñÿ êîíåö ôàéëà", íè÷åãî íå ïðîâåðÿÿ} procedure UnExpectedEOF;begin inf.unexpectedeof;end; {ïîëó÷àåò òåêóùóþ ñòðîêó ïîëíîñòüþ äëÿ âûâîäà îøèáêè} function GetCurString:string;begin getcurstring:=inf.getcurstring;end; {òðåáóåò íàëè÷èå ñòðîêè s íà÷èíàÿ ñ òåêóùåé ïîçèöèè ÷èòàåìîãî ôàéëà} procedure RequireString (s:string);begin inf.requirestring (s);end; {Âûäàåò PE, åñëè â òåêóùåé ïîçèöèè íàõîäèòñÿ ïåðåâîä ñòðîêè (ïðîïóñêàåò ïðîáåëû)} procedure NoNewLine;begin inf.nonewline end; procedure assert (what:boolean;msg:string); begin inf.assert (what, msg);end; procedure test (what:boolean); begin inf.test (what);end; procedure requireeof;begin inf.requireeof;end; procedure requireleof;begin inf.requireleof;end; procedure requireseof;begin inf.requireseof;end; {êîðîòêèå èìåíà} function nc:char;begin nc:=inf.nc;end; procedure noeof;begin inf.noeof;end; procedure rne;begin inf.rne;end; function RW (Before, After: CharSet; EmptyPossible:boolean): string; begin rw:=inf.rw(before,after,emptypossible);end; function ReadW (Before, After: CharSet; EmptyPossible:boolean): string; begin readw:=inf.readw (before,after,emptypossible);end; function getint:integer;begin getint:=inf.getint;end; function onlyint:integer;begin onlyint:=inf.onlyint;end; function roi:integer;begin roi:=inf.roi;end; function unsonly:integer;begin unsonly:=inf.unsonly;end; function rou:integer;begin rou:=inf.rou;end; function rr:real;begin rr:=inf.rr;end; function rl:longint;begin rl:=inf.rl;end; function getl:longint;begin getl:=inf.getl;end; function getlong:longint;begin getlong:=inf.getlong;end; function readl:longint;begin readl:=inf.readl;end; function rol:longint;begin rol:=inf.rol;end; function onlylong:longint;begin onlylong:=inf.onlylong;end; function roul:longint;begin roul:=inf.roul;end; function onlyul:longint;begin onlyul:=inf.onlyul;end; function getstr:string;begin getstr:=inf.getstr;end; function reads:string;begin reads:=inf.reads;end; function rs:string;begin rs:=inf.rs;end; procedure rnl (eo:boolean);begin inf.rnl (eo);end; procedure newl (eo:boolean);begin inf.newl (eo);end; procedure reql (eo:boolean);begin inf.reql (eo);end; function lcs:string;begin lcs:=inf.lcs;end; function lcstr:string;begin lcstr:=inf.lcstr;end; function slcs:string;begin slcs:=inf.slcs;end; function slcstr:string;begin slcstr:=inf.slcstr;end; function rlcs:string;begin rlcs:=inf.rlcs;end; function rlcstr:string;begin rlcstr:=inf.rlcstr;end; function rslcs:string;begin rslcs:=inf.rslcs;end; function rslcstr:string;begin rslcstr:=inf.rslcstr;end; function lc:string;begin lc:=inf.lc;end; function lnum:string;begin lnum:=inf.lnum;end; function lcnt:string;begin lcnt:=inf.lcnt;end; function rlnum:string;begin rlnum:=inf.rlnum;end; function rlcnt:string;begin rlcnt:=inf.rlcnt;end; function rlc:string;begin rlc:=inf.rlc;end; function slnum:string;begin slnum:=inf.slnum;end; function slcnt:string;begin slcnt:=inf.slcnt;end; function slc:string;begin slc:=inf.slc;end; function rslnum:string;begin rslnum:=inf.rslnum;end; function rslcnt:string;begin rslcnt:=inf.rslcnt;end; function rslc:string;begin rslc:=inf.rslc;end; function pp:string;begin pp:=inf.pp;end; function pospair:string;begin pospair:=inf.pospair;end; function spp:string;begin spp:=inf.spp;end; function spospair:string;begin spospair:=inf.spospair;end; function rpp:string;begin rpp:=inf.rpp;end; function rpospair:string;begin rpospair:=inf.rpospair;end; function rspp:string;begin rspp:=inf.rspp;end; function rspospair:string;begin rspospair:=inf.rspospair;end; procedure savep;begin inf.savep;end; procedure sp;begin inf.sp;end; function cs:string;begin cs:=inf.cs;end; function cl:string;begin cl:=inf.cl;end; function cstr:string;begin cstr:=inf.cstr;end; function getcstr:string;begin getcstr:=inf.getcstr;end; function curstr:string;begin curstr:=inf.curstr;end; function getcs:string;begin getcs:=inf.getcs;end; procedure reqs (s:string);begin inf.reqs (s);end; procedure reqstr (s:string);begin inf.reqstr (s);end; procedure nnl;begin inf.nnl;end; procedure noeoln;begin inf.nnl;end; procedure nonewl;begin inf.nonewl;end; procedure nnewl;begin inf.nnewl;end; procedure nonl;begin inf.nonl;end; procedure reof;begin inf.reof;end; procedure rleof;begin inf.rleof;end; procedure rseof;begin inf.rseof;end; procedure reqeof;begin inf.reqeof;end; procedure reqleof;begin inf.reqleof;end; procedure reqseof;begin inf.reqseof;end; function intrange (fromn, ton:longint):longint; begin intrange:=inf.readintegerrange (fromn, ton) end; function intrng (fromn, ton:longint):longint; begin intrng:=inf.readintegerrange (fromn, ton) end; function getrng (fromn, ton:longint):longint; begin getrng:=inf.readintegerrange (fromn, ton) end; function getintr (fromn, ton:longint):longint; begin getintr:=inf.readintegerrange (fromn, ton) end; {$endif TESTJURY} {$IFNDEF VER70} function RussianEnding (x : int64; const s1, s2, s3 : string) : string; var v : int64; {$ELSE} function RussianEnding (x : longint; const s1, s2, s3 : string) : string; var v : longint; {$ENDIF} begin v := x mod 100; if (v div 10 = 1) or not (v mod 10 in [1..4]) then RussianEnding := s3 else if v mod 10 = 1 then RussianEnding := s1 else RussianEnding := s2; end; BEGIN {ˆˆ–ˆ€‹ˆ‡€–ˆŸ} if (ParamCount < 3) or (ParamCount>4) then Quit (_fail, '‘¨­â ªá¨á: []'); if paramcount=4 then begin assign (output, paramstr (4)); rewrite (output); TestLibOutput:=true; end; inf.opened := false; ouf.opened := false; ans.opened := false; inf.init (ParamStr (1), _Input); ouf.init (ParamStr (2), _Output); ans.init (ParamStr (3), _Answer); end.