{$IFDEF DLPH}
unit consu;
interface
uses
consu2, SysUtils, Classes;
{$ELSE}
program consu;
{$MODE DELPHI}
{$I-,OBJECTCHECKS-,Q-,R-,S-}
uses
SysUtils, Classes;
{$ENDIF}
type
TPoint = record
x,y : integer;
end;
TRect=record
left,top,right,bottom: integer;
end;
TFPoint = record
x,y : double;
end;
// ********* INSERT CONSU2 CONSTANTS HERE!!!
// ********* BEGIN OF CONSTANTS HERE!
var
ss : array[0..1831] of string[36] = (
'jhj',
'jhj',
'iji',
'iji',
'iebei',
'hfbfh',
'hfbfh',
'hedeh',
'gfdfg',
'gfdfg',
'fffff',
'fffff',
'fffff',
'efhfe',
'efhfe',
'efhfe',
'dtd',
'dtd',
'dtd',
'cvc',
'cflfc',
'cflfc',
'bfnfb',
'bfnfb',
'bfnfb',
'afpf',
'aqf',
'asd',
'atc',
'atc',
'afjgb',
'afkfb',
'afkfb',
'afkfb',
'afkfb',
'afjfc',
'asd',
'are',
'asd',
'atc',
'afjgb',
'afkg',
'aflf',
'aflf',
'aflf',
'aflf',
'afkg',
'afjgb',
'aub',
'atc',
'asd',
'aqf',
'iig',
'gme',
'epd',
'drc',
'chfhb',
'cfjfb',
'bfkg',
'bfldc',
'bfq',
'afr',
'afr',
'afr',
'afr',
'afr',
'afr',
'afr',
'afr',
'bflbe',
'bfleb',
'bfkg',
'cfigb',
'chfhb',
'drc',
'epd',
'gme',
'ihh',
'aoh',
'aqf',
'are',
'asd',
'afhhc',
'afjgb',
'afkfb',
'afkfb',
'aflf',
'aflf',
'aflf',
'aflf',
'aflf',
'aflf',
'aflf',
'aflf',
'aflf',
'aflf',
'afkfb',
'afkfb',
'afjgb',
'afigc',
'asd',
'are',
'aqf',
'aoh',
'asb',
'asb',
'asb',
'asb',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'arc',
'arc',
'arc',
'arc',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'at',
'at',
'at',
'at',
'ar',
'ar',
'ar',
'ar',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'apc',
'apc',
'apc',
'apc',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'afm',
'jih',
'goe',
'fqd',
'esc',
'dhghb',
'cgjh',
'bglg',
'bfndc',
'bfs',
'aft',
'aft',
'aft',
'afil',
'afil',
'afil',
'afil',
'afof',
'bfnf',
'bfnf',
'bgmf',
'cgkg',
'dhgi',
'eu',
'frc',
'goe',
'jih',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'au',
'au',
'au',
'au',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'af',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'lf',
'cdgf',
'afgf',
'afgf',
'agff',
'bfefb',
'bob',
'cmc',
'dkd',
'ehf',
'afkgb',
'afjgc',
'afigd',
'afhge',
'afggf',
'affhf',
'afehg',
'afdhh',
'afchi',
'afcgj',
'afbhj',
'anj',
'aoi',
'aph',
'aicfh',
'aicgg',
'ahefg',
'agfgf',
'afhge',
'afife',
'afigd',
'afjgc',
'afkfc',
'afkgb',
'aflg',
'aflg',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'afn',
'as',
'as',
'as',
'as',
'ahjh',
'ahjh',
'aihi',
'aihi',
'aihi',
'aihi',
'aebefebe',
'aebefebe',
'aebefebe',
'aecdfdce',
'aecdfdce',
'aecedece',
'aecedece',
'aeddddde',
'aeddddde',
'aedebede',
'aedebede',
'aeedbdee',
'aeedbdee',
'aeedbdee',
'aeehee',
'aefffe',
'aefffe',
'aefffe',
'aegdge',
'aegdge',
'agke',
'agke',
'ahje',
'ahje',
'aiie',
'aiie',
'ajhe',
'aebehe',
'aebfge',
'aecege',
'aecffe',
'aedefe',
'aedfee',
'aeeeee',
'aeefde',
'aefede',
'aeffce',
'aegece',
'aegfbe',
'aehebe',
'aehj',
'aeii',
'aeii',
'aejh',
'aejh',
'aekg',
'iii',
'gmg',
'eqe',
'dsd',
'chghc',
'cgigc',
'bgkgb',
'bfmfb',
'bfmfb',
'afof',
'afof',
'afof',
'afof',
'afof',
'afof',
'afof',
'afof',
'bfmfb',
'bfmfb',
'bgkgb',
'cgigc',
'chghc',
'dsd',
'eqe',
'gmg',
'iii',
'aof',
'aqd',
'arc',
'asb',
'afhgb',
'afig',
'afjf',
'afjf',
'afjf',
'afjf',
'afig',
'afhgb',
'asb',
'arc',
'aqd',
'aof',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'afo',
'iij',
'gmh',
'eqf',
'dse',
'chghd',
'cgigd',
'bgkgc',
'bfmfc',
'bfmgb',
'afofb',
'afofb',
'afofb',
'afofb',
'afofb',
'afofb',
'afofb',
'afofb',
'bfgcefc',
'bfgddfc',
'bgemc',
'cgekd',
'chfhe',
'dtd',
'eub',
'gt',
'iidfb',
'ueb',
'wbc',
'aqh',
'asf',
'ate',
'aud',
'afjhc',
'aflfc',
'aflfc',
'aflfc',
'aflfc',
'afkgc',
'afjgd',
'aud',
'ate',
'arg',
'api',
'afehh',
'afggg',
'afhgf',
'afhgf',
'afige',
'afjgd',
'afjgd',
'afkgc',
'aflfc',
'aflgb',
'afmg',
'gih',
'ene',
'dpd',
'crc',
'cgfgc',
'bfigb',
'bfjfb',
'bfjfb',
'bgo',
'bjl',
'cli',
'dnf',
'eod',
'gnc',
'jlb',
'ni',
'pg',
'cdlf',
'aflf',
'agkf',
'bgig',
'bhggb',
'csb',
'dqc',
'ene',
'gjg',
'av',
'av',
'av',
'av',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'afkf',
'agjf',
'bfifb',
'bhfgb',
'crb',
'cqc',
'end',
'gig',
'afpf',
'bfnfb',
'bfnfb',
'bfnfb',
'cflfc',
'cflfc',
'cfkgc',
'dfjfd',
'dfjfd',
'efhfe',
'efhfe',
'efhfe',
'fffff',
'fffff',
'gefff',
'gfdfg',
'gfdfg',
'hedeh',
'hfbfh',
'hfbfh',
'iebei',
'iji',
'jhj',
'jhj',
'jhj',
'kfk',
'afkfkf',
'afkfkf',
'bfihifb',
'bfihifb',
'bfihifb',
'bfihifb',
'cfgebegfc',
'cfgebegfc',
'cfgebegfc',
'cffeddgfc',
'defedefed',
'dfeedeefd',
'dfedfdefd',
'dfdefedfd',
'eedefedee',
'efcefedee',
'efbehdcfe',
'efbehebfe',
'febehebfe',
'febdjdbef',
'fijif',
'fijif',
'gglhf',
'gglgg',
'gglgg',
'gglgg',
'bgigb',
'bgigb',
'cgggc',
'dgegd',
'dgegd',
'egcge',
'ffcff',
'fmf',
'gkg',
'gkg',
'hih',
'igi',
'igi',
'hih',
'hih',
'gkg',
'fmf',
'fmf',
'egcge',
'efefe',
'dgegd',
'cgggc',
'cgggc',
'bgigb',
'agkg',
'agkg',
'aglg',
'aglg',
'bgjgb',
'cfjfc',
'cghgc',
'dfhfd',
'efffe',
'egdge',
'ffdff',
'fgbgf',
'gfbfg',
'hjh',
'hjh',
'ihi',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'jfj',
'csb',
'csb',
'csb',
'csb',
'ogb',
'ngc',
'mgd',
'mfe',
'lff',
'kgf',
'jgg',
'igh',
'ifi',
'hfj',
'gfk',
'fgk',
'egl',
'efm',
'dfn',
'cfo',
'bgo',
'agp',
'av',
'av',
'av',
'av',
'ehi',
'ehi',
'idi',
'idi',
'gdbdg',
'gdbdg',
'gdbdg',
'gdbdg',
'edfde',
'edfde',
'edfde',
'edfde',
'ele',
'ele',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'ahfh',
'ahfh',
'anc',
'anc',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'clc',
'clc',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'anc',
'anc',
'ehbd',
'ehbd',
'cdff',
'cdff',
'adjd',
'adjd',
'adjd',
'adjd',
'adm',
'adm',
'adm',
'adm',
'adm',
'adm',
'adm',
'adm',
'cdhd',
'cdhd',
'ejc',
'ejc',
'ale',
'ale',
'cdfdc',
'cdfdc',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdfdc',
'cdfdc',
'ale',
'ale',
'ap',
'ap',
'cdhd',
'cdhd',
'cdk',
'cdk',
'cddde',
'cddde',
'cje',
'cje',
'cddde',
'cddde',
'cdk',
'cdk',
'cdk',
'cdk',
'cdhd',
'cdhd',
'ap',
'ap',
'ap',
'ap',
'cdhd',
'cdhd',
'cdk',
'cdk',
'cddde',
'cddde',
'cje',
'cje',
'cddde',
'cddde',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'ajg',
'ajg',
'ehbdc',
'ehbdc',
'cdffc',
'cdffc',
'adjdc',
'adjdc',
'adjdc',
'adjdc',
'ado',
'ado',
'adfj',
'adfj',
'adjdc',
'adjdc',
'adjdc',
'adjdc',
'cdhdc',
'cdhdc',
'eje',
'eje',
'ahfh',
'ahfh',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cpc',
'cpc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'ahfh',
'ahfh',
'al',
'al',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'ede',
'al',
'al',
'gl',
'gl',
'kde',
'kde',
'kde',
'kde',
'kde',
'kde',
'kde',
'kde',
'kde',
'kde',
'kde',
'kde',
'adhde',
'adhde',
'adhde',
'adhde',
'cjg',
'cjg',
'ahbhc',
'ahbhc',
'cdfde',
'cdfde',
'cdddg',
'cdddg',
'cdddg',
'cdddg',
'cdbdi',
'cdbdi',
'chi',
'chi',
'cdddg',
'cdddg',
'cdfde',
'cdfde',
'cdhdc',
'cdhdc',
'ahff',
'ahff',
'ajg',
'ajg',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdhd',
'cdhd',
'ap',
'ap',
'afjf',
'afjf',
'cdjdc',
'cdjdc',
'cfffc',
'cfffc',
'cfffc',
'cfffc',
'cdbdbdbdc',
'cdbdbdbdc',
'cdbdbdbdc',
'cdbdbdbdc',
'cdddddc',
'cdddddc',
'cdddddc',
'cdddddc',
'cdjdc',
'cdjdc',
'ahfh',
'ahfh',
'affj',
'affj',
'cdjdc',
'cdjdc',
'cfhdc',
'cfhdc',
'cdbdfdc',
'cdbdfdc',
'cdbdfdc',
'cdbdfdc',
'cdddddc',
'cdddddc',
'cdfdbdc',
'cdfdbdc',
'cdfdbdc',
'cdfdbdc',
'cdhfc',
'cdhfc',
'ajfdc',
'ajfdc',
'ehe',
'ehe',
'cdfdc',
'cdfdc',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'cdfdc',
'cdfdc',
'ehe',
'ehe',
'anc',
'anc',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'cdhd',
'clc',
'clc',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'cdk',
'ajg',
'ajg',
'ehe',
'ehe',
'cdfdc',
'cdfdc',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'adjd',
'cdfdc',
'cdfdc',
'ehe',
'ehe',
'gfe',
'gfe',
'cfdf',
'cfdf',
'ane',
'ane',
'cdhdc',
'cdhdc',
'cdhdc',
'cdhdc',
'cdhdc',
'cdhdc',
'cdhdc',
'cdhdc',
'cle',
'cle',
'cdddg',
'cdddg',
'cdfde',
'cdfde',
'cdhdc',
'cdhdc',
'ahff',
'ahff',
'cjbd',
'cjbd',
'adhf',
'adhf',
'adjd',
'adjd',
'adm',
'adm',
'chg',
'chg',
'ifc',
'ifc',
'md',
'md',
'adjd',
'adjd',
'afhd',
'afhd',
'adbjc',
'adbjc',
'at',
'at',
'adfdfd',
'adfdfd',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'ele',
'ele',
'ahfh',
'ahfh',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'cfffc',
'cfffc',
'ghg',
'ghg',
'ahfh',
'ahfh',
'cdjdc',
'cdjdc',
'cdjdc',
'cdjdc',
'edfde',
'edfde',
'edfde',
'edfde',
'edfde',
'edfde',
'gdbdg',
'gdbdg',
'gdbdg',
'gdbdg',
'idi',
'idi',
'idi',
'idi',
'afjf',
'afjf',
'adnd',
'adnd',
'adfdfd',
'adfdfd',
'adfdfd',
'adfdfd',
'cdbdbdbdc',
'cdbdbdbdc',
'cdbdbdbdc',
'cdbdbdbdc',
'cdbdbdbdc',
'cdbdbdbdc',
'edfde',
'edfde',
'edfde',
'edfde',
'edfde',
'edfde',
'ahfh',
'ahfh',
'cdjdc',
'cdjdc',
'edfde',
'edfde',
'gdbdg',
'gdbdg',
'idi',
'idi',
'idi',
'idi',
'gdbdg',
'gdbdg',
'edfde',
'edfde',
'cdjdc',
'cdjdc',
'ahfh',
'ahfh',
'ahfh',
'ahfh',
'cdjdc',
'cdjdc',
'edfde',
'edfde',
'edfde',
'edfde',
'gdbdg',
'gdbdg',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'idi',
'ele',
'ele',
'ap',
'ap',
'adjd',
'adjd',
'kdc',
'kdc',
'ide',
'ide',
'gdg',
'gdg',
'gdg',
'gdg',
'edi',
'edi',
'cdk',
'cdk',
'adjd',
'adjd',
'ap',
'ap',
'mbm',
'mcl',
'ldl',
'lek',
'kfk',
'kgj',
'jbbfj',
'jbbfj',
'jbbgi',
'ibdfi',
'ibdgh',
'hbffh',
'hbffh',
'hbfgg',
'gbhfg',
'gbhgf',
'fbjff',
'fpf',
'eblfe',
'eblfe',
'dclgd',
'dbnfd',
'cdmgc',
'aigl',
'arf',
'cgfgd',
'dfhfc',
'dfhfc',
'dfifb',
'dfifb',
'dfifb',
'dfifb',
'dfhfc',
'dfggc',
'dfege',
'dof',
'dffgd',
'dfhfc',
'dfhgb',
'dfig',
'dfig',
'dfig',
'dfig',
'dfig',
'dfhgb',
'dfggc',
'chegd',
'aqg',
'jifb',
'hegccc',
'ffje',
'efld',
'dfnc',
'cfoc',
'cfpb',
'bgpb',
'bfr',
'agr',
'agr',
'agr',
'agr',
'agr',
'agr',
'agr',
'bgq',
'bgq',
'cfq',
'cgnbb',
'dfmcb',
'efkcc',
'gfgce',
'jig',
'aqi',
'cgffg',
'dfhfe',
'dfifd',
'dfigc',
'dfjfc',
'dfjgb',
'dfjgb',
'dfkg',
'dfkg',
'dfkg',
'dfkg',
'dfkg',
'dfkg',
'dfkg',
'dfkg',
'dfkfb',
'dfjgb',
'dfjfc',
'dfjfc',
'dfifd',
'dfhfe',
'cgffg',
'apj',
'atb',
'cgheb',
'dfidb',
'dfjcb',
'dfjcb',
'dffbebb',
'dffbebb',
'dffbg',
'dfecg',
'dfecg',
'dfddg',
'dlg',
'dfddg',
'dfecg',
'dfecg',
'dffbg',
'dffbg',
'dffbfb',
'dflb',
'dfkc',
'dfkbb',
'dfjcb',
'chgeb',
'atb',
'au',
'cghf',
'dfjd',
'dfkc',
'dfkc',
'dflb',
'dfgbeb',
'dfgbf',
'dfgbf',
'dffcf',
'dffcf',
'dfdef',
'dmf',
'dfdef',
'dffcf',
'dffcf',
'dfgbf',
'dfgbf',
'dfgbf',
'dfm',
'dfm',
'dfm',
'chl',
'alj',
'jifbd',
'gffdccd',
'fejfd',
'eeled',
'dfmdd',
'cfocd',
'bgocd',
'bgpbd',
'bfu',
'agu',
'agu',
'agu',
'agu',
'agu',
'agjl',
'aglhc',
'bfmfd',
'bglfd',
'cflfd',
'delfd',
'eekfd',
'fejfd',
'gfgfe',
'jkh',
'alel',
'chihc',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dud',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'dfkfd',
'chihc',
'alel',
'al',
'chc',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'dfd',
'chc',
'al',
'gm',
'jhc',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'kfd',
'bdgfd',
'afffd',
'afffd',
'afffd',
'aegee',
'bdgee',
'cdedg',
'egi',
'algjb',
'chkfd',
'dfmcf',
'dflcg',
'dfkbi',
'dfjbj',
'dfibk',
'dfgcl',
'dffbn',
'dfebo',
'dfcdo',
'dfbfn',
'dmm',
'dfcgl',
'dfchk',
'dfdhj',
'dfegj',
'dffgi',
'dfggh',
'dfhgg',
'dfhhf',
'dfihe',
'chhid',
'aldn',
'alk',
'chm',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfmb',
'dfmb',
'dflc',
'dflc',
'dfkcb',
'dfjdb',
'cgieb',
'aub',
'ajpi',
'chohc',
'dgogd',
'dhmbbfd',
'dbbfmbbfd',
'dbbglbbfd',
'dbbgkbcfd',
'dbcfkbcfd',
'dbcgibdfd',
'dbdfibdfd',
'dbdggbefd',
'dbefgbefd',
'dbeffbffd',
'dbegebffd',
'dbffdbgfd',
'dbfgcbgfd',
'dbgfbbhfd',
'dbgfbbhfd',
'dbggifd',
'dbhfifd',
'dbhejfd',
'dbidjfd',
'cdhcjhc',
'ahgbhl',
'aijh',
'dgkdc',
'dhkbd',
'dijbd',
'dbbgjbd',
'dbcgibd',
'dbdghbd',
'dbeggbd',
'dbeggbd',
'dbfgfbd',
'dbggebd',
'dbhgdbd',
'dbigcbd',
'dbigcbd',
'dbjgbbd',
'dbkhd',
'dblgd',
'dblgd',
'dbmfd',
'dbned',
'dbodd',
'dbpcd',
'cdocd',
'ahnbd',
'iji',
'gefeg',
'efhfe',
'dfjfd',
'cflfc',
'cflfc',
'bglgb',
'bfnfb',
'agng',
'agng',
'agng',
'agng',
'agng',
'agng',
'agng',
'agnfb',
'bfnfb',
'bglgb',
'cflfc',
'deled',
'dfjfd',
'fehef',
'gefeg',
'jhj',
'aqf',
'cgffd',
'dfgfc',
'dfhfb',
'dfif',
'dfif',
'dfif',
'dfif',
'dfif',
'dfhfb',
'dfgfc',
'dfffd',
'dmg',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'dfn',
'chm',
'alk',
'jhj',
'gefeg',
'fehef',
'dfjfd',
'deled',
'cflfc',
'bglgb',
'bfnfb',
'agng',
'agng',
'agng',
'agng',
'agng',
'agng',
'agng',
'agng',
'bfnfb',
'bglgb',
'cflfc',
'cflfc',
'dfjfd',
'efhfe',
'gefff',
'ikh',
'kgj',
'kgj',
'lgi',
'mgh',
'nhf',
'qib',
'ari',
'cggfg',
'dfief',
'dfife',
'dfjfd',
'dfjfd',
'dfjfd',
'dfjfd',
'dfjfd',
'dfife',
'dfife',
'dfggf',
'dph',
'dfcgj',
'dfdgi',
'dfegh',
'dffgg',
'dfggf',
'dfggf',
'dfhge',
'dfigd',
'dfjgc',
'chjgb',
'alhh',
'fffbb',
'ddecdbb',
'cdheb',
'bdjdb',
'aekcb',
'aekcb',
'afkbb',
'ahibb',
'aji',
'bkg',
'cle',
'dld',
'elc',
'gkb',
'ij',
'abjh',
'abkg',
'ackf',
'acle',
'adkdb',
'aejdb',
'afhdc',
'acccfdd',
'abfgf',
'av',
'adffee',
'acgfgc',
'acgfgc',
'abhfhb',
'abhfhb',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'ifi',
'hhh',
'flf',
'algh',
'cgldc',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'dfmbd',
'eelbe',
'efkbe',
'fejbf',
'gffcg',
'iii',
'algi',
'chldc',
'dglcd',
'dglcd',
'eflbe',
'egjbf',
'ffjbf',
'fgibf',
'gfhbg',
'gfhbg',
'ggfbh',
'hffbh',
'hgdbi',
'ifdbi',
'ifdbi',
'igbbj',
'jfbbj',
'jgk',
'kfk',
'kfk',
'kel',
'ldl',
'lcm',
'mbm',
'akdlfg',
'cghhjdb',
'dfifkcc',
'dfigjbd',
'efifjbd',
'efighbe',
'eghghbe',
'ffhghbe',
'ffhhfbf',
'fgfbcffbf',
'gffbcffbf',
'gffbcgdbg',
'hfdbefdbg',
'hfdbefdbg',
'hgbbgfbbh',
'ifbbgfbbh',
'ifbbggi',
'igifi',
'jfifi',
'jejej',
'jekdj',
'kdkdj',
'kclck',
'lbmbk',
'blej',
'ciied',
'dgkce',
'egjbf',
'ffibg',
'fggbh',
'ggebi',
'hgdbi',
'hgcbj',
'ihk',
'jgk',
'jgk',
'kgj',
'lgi',
'kbbfi',
'jbcgh',
'ibegg',
'hbgfg',
'gbhgf',
'fcige',
'fbkgd',
'eckgd',
'cekib',
'ajfl',
'akhh',
'cgldc',
'cgmbd',
'dgkbe',
'efkbe',
'egibf',
'ffhbg',
'fggbg',
'gffbh',
'ggebh',
'hfdbi',
'hgcbi',
'ifbbj',
'igk',
'jfk',
'jfk',
'jfk',
'jfk',
'jfk',
'jfk',
'jfk',
'jfk',
'jfk',
'glh',
'dtb',
'deigc',
'ddjfd',
'cckgd',
'ccjge',
'cbkff',
'cbjgf',
'lgg',
'lfh',
'kfi',
'jgi',
'jfj',
'ifk',
'hgk',
'hfl',
'gflb',
'fglb',
'eglc',
'efmc',
'dgld',
'cgldb',
'cfleb',
'bgjgb',
'awb'
);
sh : array[0..77] of integer = (
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 28, 26, 26, 26, 26, 26, 26, 26,
26, 26, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
20, 20, 20, 20, 20, 20, 24, 20, 20, 20, 20, 20,
20, 20, 20, 20, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 30, 24, 24, 24,
24, 24, 24, 24, 24, 24
);
sw : array[0..77] of integer = (
25, 21, 22, 21, 19, 17, 24, 20, 5, 16, 22, 18, 23,
20, 24, 19, 25, 23, 21, 21, 20, 25, 35, 22, 23,
21, 19, 15, 15, 15, 15, 15, 17, 19, 11, 17, 17,
15, 19, 19, 15, 15, 15, 17, 15, 19, 19, 19, 19,
19, 19, 15, 25, 22, 23, 24, 20, 20, 26, 26, 11,
18, 27, 21, 32, 24, 25, 21, 25, 25, 17, 21, 24,
25, 35, 25, 24, 24
);
sp : array[0..77] of integer = (
0, 26, 52, 78, 104, 130, 156, 182, 208, 234, 260,
286, 312, 338, 364, 390, 416, 444, 470, 496, 522,
548, 574, 600, 626, 652, 678, 698, 718, 738, 758,
778, 798, 818, 838, 858, 878, 898, 918, 938, 958,
978, 998, 1022, 1042, 1062, 1082, 1102, 1122, 1142,
1162, 1182, 1202, 1226, 1250, 1274, 1298, 1322,
1346, 1370, 1394, 1418, 1442, 1466, 1490, 1514,
1538, 1562, 1586, 1616, 1640, 1664, 1688, 1712,
1736, 1760, 1784, 1808
);
Const
sc='ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ';
num=78;
sslen=1832;
// ********* END OF CONSTANTS HERE!
// ********* INSERT CONSU2 CONSTANTS HERE!!!
var
// 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 Z
links: array[0..25] of integer = (1,2,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0);
l : array[1..200] of string[200];
w,h: integer; // после поворота - размер области с текстом
t : array[1..200] of string[200]; // используется для временных нужд
// L-field
p1,p2,p3,p4 : TPoint;
pb: boolean;
base1, base2: TPoint;
// fill
fc: integer;
fx,fy : array[1..100] of integer;
smb: array[1..100] of TRect; // char-fields
smbn: integer;
smax: double;
{$IFDEF DLPH}
procedure runmain;
function findstr:string; // L-to-str
procedure FindRect;
procedure ImproveRect;
procedure rotateRect;
procedure deholing;
procedure findsymbols;
function gett(n,x,y: integer):char;
procedure sortsymbols;
function setp(x,y: integer; b: boolean):boolean;
function get(x,y: integer):boolean;
procedure Denoise;
function recsymbol(r: TRect):char;
function compressline(s: string):string;
procedure decfonts;
implementation
{$ENDIF}
procedure swappoint(var a,b: TPoint);
var t: TPoint;
begin
t := a; a := b; b := t;
end;
function max(a,b: integer):integer;
begin
if a>=b then
result := a
else
result := b;
end;
function min(a,b: integer):integer;
begin
if a<=b then
result := a
else
result := b;
end;
function sign(n: integer):integer;
begin
if n>0 then result := 1 else
if n<0 then result := -1 else
result := 0;
end;
function get(x,y: integer):boolean;
begin
if (x < 1) or (x > 200) or (y < 1) or (y > 200) then
result := false
else
result := l[y][x]<>'.';
end;
function setp(x,y: integer; b: boolean):boolean;
begin
result := false;
if (x < 1) or (x > 200) or (y < 1) or (y > 200) then
exit;
result := true;
if b then
l[y][x] := 'X'
else
l[y][x] := '.';
end;
function GetField(x,y: integer; maxdepth: integer):integer;
begin
result := 0;
if (x < 1) or (x > 200) or (y < 1) or (y > 200) then
exit;
if l[y][x]<>'X' then
exit;
inc(fc);
fx[fc] := x;
fy[fc] := y;
l[y][x] := '*';
inc(result);
if result >= maxdepth then exit;
result := result + GetField(x-1,y, maxdepth-1);
if result >= maxdepth then exit;
result := result + GetField(x+1,y, maxdepth-1);
if result >= maxdepth then exit;
result := result + GetField(x,y-1, maxdepth-1);
if result >= maxdepth then exit;
result := result + GetField(x,y+1, maxdepth-1);
end;
procedure RemoveField;
var i: integer;
begin
for i := 1 to fc do
setp(fx[i], fy[i], false);
end;
procedure ResetField; // вернуть X вместо *
var i: integer;
begin
for i := 1 to fc do
setp(fx[i], fy[i], true);
end;
procedure Denoise;
var
x,y,i,n: integer;
begin
for y := 1 to 200 do
for x := 1 to 200 do
if get(x,y) then
begin
n := 0;
if get(x-1,y) then inc(n);
if get(x+1,y) then inc(n);
if get(x,y-1) then inc(n);
if get(x,y+1) then inc(n);
if n < 2 then
l[y][x] := '*';
end;
for y := 1 to 200 do
for x := 1 to 200 do
if l[y][x]='*' then
l[y][x]:='.';
for y := 1 to 200 do
for x := 1 to 200 do
if get(x,y) then
begin
fc := 0;
i := getfield(x,y,10); // get length of field (max depth = 10)
if i < 10 then
removefield
else
resetfield;
end;
end;
function len2(const a,b: TPoint):integer;
begin
result := (a.X-b.x)*(a.X-b.x) + (a.y-b.y)*(a.y-b.y);
end;
procedure rotate(var x,y: integer; xc,yc: integer; angle: double);
var tx,ty: integer;
begin
tx := x-xc;
ty := y-yc;
x := xc + round( tx*cos(angle) - ty*sin(angle) );
y := yc + round( tx*sin(angle) + ty*cos(angle) );
end;
procedure rotateline(var a,b: TPoint; angle: double);
var
xc,yc: integer;
begin
xc := (a.x + b.x) div 2;
yc := (a.y + b.y) div 2;
rotate(a.x, a.y, xc,yc, angle);
rotate(b.x, b.y, xc,yc, angle);
end;
// move to normal (-H - back dire)
procedure MoveToN(var a,b: TPoint; h: integer);
var
x,y: integer;
k,xn,yn: double;
begin
if h=0 then exit;
x := b.x-a.X;
y := b.y-a.y;
xn := x*cos(-pi/2) - y*sin(-pi/2);
yn := x*sin(-pi/2) + y*cos(-pi/2);
k := h/sqrt(xn*xn+yn*yn);
xn := xn*k;
yn := yn*k;
a.x := round(a.x + xn);
a.y := round(a.y + yn);
b.x := round(b.x + xn);
b.y := round(b.y + yn);
end;
// number of points for line
function linew(const a,b: TPoint):integer;
var
i, x,y, d,xerr, yerr,dx,dy,incx,incy: integer;
begin
xerr := 0;
yerr := 0;
dx := b.x-a.x;
dy := b.y-a.y;
incx := sign(b.x-a.x);
incy := sign(b.y-a.y);
dx := abs(dx);
dy := abs(dy);
d := max(dx,dy);
x := a.x;
y := a.y;
result := 0;
for i := 0 to d do
begin
if get(x,y) then
inc(result);
inc(xerr,dx);
inc(yerr,dy);
if xerr>=d then
begin
dec(xerr,d);
inc(x,incx);
end;
if yerr>=d then
begin
dec(yerr,d);
inc(y,incy);
end;
end;
end;
// по контрасту - "хорошая" граница при паралл-м перем-ии резко входит в контакт с точками (и выходит из него) }
function lineq(const a,b: TPoint):integer;
var
w1,w2,i: integer;
c,d: TPoint;
begin
result := 0; // максимальный "контраст" (разница в весе линий) при параллельном перемешении
w2 := 0;
for i := -4 to 4 do
begin
c := a;
d := b;
moveton(c,d, i);
w1 := w2;
w2 := linew(c,d);
if i<>-4 then
result := max(result, abs(w1-w2));
end;
end;
procedure FindRect;
var
x,y,i: integer;
a1,a2,b1,b2 : TPoint;
begin
// top line
i := 0;
for y := 1 to 200 do
if i>0 then break else
for x := 200 downto 1 do
if get(x, y) then
begin
p1.X := x;
p1.Y := y;
i := 1;
break;
end;
// right line
i := 0;
for x := 200 downto 1 do
if i>0 then break else
for y := 1 to 200 do
if get(x, y) then
begin
p2.X := x;
p2.Y := y;
i := 1;
break;
end;
// bottom line
i := 0;
for y := 200 downto 1 do
if i>0 then break else
for x := 1 to 200 do
if get(x, y) then
begin
p3.X := x;
p3.Y := y;
i := 1;
break;
end;
// left line
i := 0;
for x := 1 to 200 do
if i>0 then break else
for y := 200 downto 1 do
if get(x, y) then
begin
p4.X := x;
p4.Y := y;
i := 1;
break;
end;
if p2.X-p1.X>p1.X-p4.x then // больше справа
begin
a1 := p1;
a2 := p2;
moveton(a1,a2, 3);
a2.x := p2.x;
a2.Y := a1.Y;
end
else
begin // больше слева
a1 := p1;
a2 := p4;
moveton(a1,a2, -3);
a2.x := p4.x;
a2.y := a1.y;
end;
while linew(a1,a2) = 0 do
inc(a2.Y);
dec(a2.Y);
if p2.X-p3.X>p3.X-p4.x then // больше справа
begin
b1 := p3;
b2 := p2;
moveton(b1,b2, -3);
b2.x := p2.x;
b2.Y := b1.Y;
end
else
begin // больше слева
b1 := p3;
b2 := p4;
moveton(b1,b2, 3);
b2.x := p4.x;
b2.y := b1.y;
end;
while linew(b1,b2) = 0 do
dec(b2.Y);
inc(b2.Y);
if a2.X > a1.X then
swappoint(a1,a2);
p1 := a1;
p2 := a2;
if b2.X < b1.X then
swappoint(b1,b2);
p3 := b1;
p4 := b2;
pb := true;
if (len2(p1,p2)>len2(p2,p3)) and (len2(p1,p2)>len2(p4,p1)) or
(len2(p3,p3)>len2(p2,p3)) and (len2(p3,p4)>len2(p4,p1)) then
// width: p1-p2/p3-p4 (height:p2-p3/p4-p1)
if lineq(p1,p2) > lineq(p3,p4) then
begin
base1 := p1;
base2 := p2;
end else begin
base1 := p3;
base2 := p4;
end
else // width: p4-p1/p2-p3 (height: p1-p2/p3-p4)
if lineq(p2,p3) > lineq(p4,p1) then
begin
base1 := p2;
base2 := p3;
end else begin
base1 := p4;
base2 := p1;
end
end;
procedure ImproveRect;
var
i,j: integer;
a,b: TPoint;
begin
for i:=0 to 10 do // shift to notmal dir (both directions)
begin
a := base1;
b := base2;
movetoN(a,b, i);
if linew(a,b)=0 then
begin
base1 := a;
base2 := b;
break;
end;
a := base1;
b := base2;
movetoN(a,b, -i);
if linew(a,b)=0 then
begin
base1 := a;
base2 := b;
break;
end;
end;
// find another boundary
p1 := base1;
p2 := base2;
a := base1;
b := base2;
moveton(a,b, 3);
if linew(a,b) > 0 then
i := 3
else
i := -3;
repeat
if i>0 then inc(i) else dec(i);
a := base1;
b := base2;
moveton(a,b, i);
until linew(a,b) = 0;
p3 := b;
p4 := a;
// move high-lines
i := 0;
repeat
a := p4;
b := p1;
moveton(a,b, i);
if linew(a,b) = 0 then
begin
if i>=0 then j := i + 5 else j := i -5;
a := p4;
b := p1;
moveton(a,b, j);
if linew(a,b) = 0 then
break;
end;
i := -i;
if i>=0 then inc(i);
until false;
moveton(p4,p1, i);
i := 0;
repeat
a := p2;
b := p3;
moveton(a,b, i);
if linew(a,b) = 0 then
begin
if i>=0 then j := i + 5 else j := i -5;
a := p2;
b := p3;
moveton(a,b, j);
if linew(a,b) = 0 then
break;
end;
i := -i;
if i>=0 then inc(i);
until false;
moveton(p2,p3, i);
if p1.X > p2.X then
begin
swappoint(p1,p2);
swappoint(p3,p4);
end;
if p1.y > p4.y then
begin
swappoint(p1,p4);
swappoint(p2,p3);
end;
end;
procedure GetSrcPoint(x,y: integer; w,h: integer; var dx,dy: double);
var
a1,a2 : TFPoint;
begin
dec(x); dec(y);
a1.x := p1.x+(p2.x-p1.x)*x/w;
a1.y := p1.y+(p2.y-p1.y)*x/w;
a2.x := p4.x+(p3.x-p4.x)*x/w;
a2.y := p4.y+(p3.y-p4.y)*x/w;
dx := a1.x+(a2.x-a1.x)*y/h;
dy := a1.y+(a2.y-a1.y)*y/h;
end;
// getpixel (interpolated)
function getInt(x,y: double):double;
var
i,j : integer;
fx,fy : double;
begin
result := 0;
i := trunc(x);
j := trunc(y);
fx := frac(x);
fy := frac(y);
if get(i, j) then
result := result + (1-fx)+(1-fy);
if get(i+1, j) then
result := result + fx+(1-fy);
if get(i+1, j+1) then
result := result + fx+fy;
if get(i, j+1) then
result := result + (1-fx)+fy;
result := result / 2;
end;
procedure rotateRect;
var
x,y: integer;
i,j: double;
begin
for y := 1 to 200 do
t[y] := stringofchar('.',200);
// align rect
w := round (sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y)) );
h := round (sqrt(sqr(p1.x-p4.x)+sqr(p1.y-p4.y)) );
for y := 1 to h do
for x := 1 to w do
begin
GetSrcPoint(x,y, w,h, i,j);
if getint(i,j) >= 0.95 then
t[y][x] := 'X';
end;
for y := 1 to 200 do
l[y] := t[y];
p1.X := 1;
p1.Y := 1;
p2.X := w;
p2.Y := 1;
p3.X := w;
p3.Y := h;
p4.X := 1;
p4.Y := h;
base1.X := 1;
base1.Y := h+1;
base2.X := w;
base2.Y := h+1;
end;
procedure deholing;
var
x,y,n: integer;
begin
for y := 1 to h do
for x := 1 to w do
t[y][x]:='.';
for y := 1 to h do
for x := 1 to w do
if get(x,y) then
t[y][x] := 'X'
else
begin
n := 0;
if get(x-1,y) then inc(n);
if get(x+1,y) then inc(n);
if get(x,y-1) then inc(n);
if get(x,y+1) then inc(n);
if n>2 then
t[y][x] := 'X';
end;
for y := 1 to h do
for x := 1 to w do
l[y][x] := t[y][x];
end;
function fill_(x,y: integer; var r: TRect):boolean;
var
f,t, i: integer;
begin
if (x < 1) or (y < 1) or (x > w) or (y > h) then
result := false
else
result := l[y][x]='X';
if not result then exit;
l[y][x] := '*';
if y<r.Top then r.Top := y;
if y>r.Bottom then r.Bottom := y;
f := x; // область для дальнейшего сканирования
t := x;
for i := x-1 downto 1 do
if l[y][i] <> 'X' then break else
begin
f := i;
l[y][i] := '*';
if i < r.Left then r.Left := i;
if i > r.Right then r.Right := i;
end;
for i := x+1 to w do
if l[y][i] <> 'X' then break else
begin
t := i;
l[y][i] := '*';
if i < r.Left then r.Left := i;
if i > r.Right then r.Right := i;
end;
for i := f to t do
begin
fill_(i,y-1, r);
fill_(i,y+1, r);
end;
end;
function fill(x,y: integer; var r: TRect):boolean;
begin
r.Left := x;
r.Right := x;
r.Top := y;
r.Bottom := y;
result := fill_(x,y,r);
end;
function rect_in_rect(src, dst: TRect):boolean;
var r: TRect;
begin
r := src;
src.Left := max(src.Left, dst.Left);
src.Right := min(src.Right, dst.Right);
src.Top := max(src.Top, dst.Top);
src.Bottom := min(src.Bottom, dst.Bottom);
result := (src.Right-src.Left+1)*(src.Bottom-src.Top+1) * 100 / ((r.Right-r.Left+1)*(r.Bottom-r.Top+1)) >= 70;
end;
procedure findsymbols;
var
pn,simw,sn,x,y,i,j,n,m,k,nn : integer;
begin
pn := h*85 div 100;
// get fields
smbn := 0;
for y := 1 to h do
for x := 1 to w do
if fill(x,y, smb[smbn+1]) then
inc(smbn);
// remove "char inside of char"
for i := smbn downto 1 do
begin
n := 0;
for j := 1 to smbn do
if i<>j then
if rect_in_rect(smb[i], smb[j]) then
if (smb[i].Right-smb[i].Left+1)*(smb[i].Bottom-smb[i].Top+1)*100/((smb[j].Right-smb[j].Left+1)*(smb[j].Bottom-smb[j].Top+1)) <= 50 then
begin
n := 1;
break;
end;
if n=0 then continue;
for n := i to smbn-1 do
smb[n] := smb[n+1];
dec(smbn);
end;
// precise PN (char width)
j := 0;
n := 0;
for i := 1 to smbn do
begin
m := smb[i].Right-smb[i].Left+1;
if abs(m-pn) <= 4 then // skip small/large "I", "l",...
begin
inc(n);
inc(j, m+2);
end;
end;
if n>1 then // по одному символу судить бесполезно
pn := j div n;
// divide field to symbols
j := pn div 2;
nn := smbn;
for i := 1 to nn do
begin
m := smb[i].Right-smb[i].Left+1;
if m-pn >= j then // DO not use ABS here (leave thin chars)!
begin
{ sn := m div pn; // chars for field
if m-sn*pn >= 2/3*pn then
inc(sn);}
sn := (m+pn div 2) div pn;
simw := m div sn; // width of single char
for k := 1 to sn-1 do
begin
inc(smbn);
smb[smbn].Left := smb[i].Left + k*simw + 1;
if k < sn-1 then
smb[smbn].Right:= smb[smbn].Left + simw - 2
else
smb[smbn].Right:= smb[i].Right - 1;
smb[smbn].Top := smb[i].Top;
smb[smbn].Bottom := smb[i].Bottom;
end;
smb[i].Left := smb[i].Left+1;
smb[i].Right:= smb[i].Left+simw-1;
end;
end;
for y := 1 to h do
for x := 1 to w do
if l[y][x]='*' then
l[y][x] := 'X';
end;
procedure sortsymbols_(L, R: Integer);
var I, J, P: Integer;
t: TRect;
begin
repeat
I := L;
J := R;
P := (L + R) shr 1;
repeat
while smb[i].Left < smb[p].Left do Inc(I);
while smb[j].Left > smb[p].Left do Dec(J);
if I <= J then
begin
t := smb[i]; smb[i] := smb[j]; smb[j] := t;
if P = I then
P := J
else if P = J then
P := I;
Inc(I);
Dec(J);
end;
until I > J;
if L < J then sortsymbols_(L, J);
L := I;
until I >= R;
end;
procedure sortsymbols;
begin
sortsymbols_(1,smbn);
end;
// X,Y - 1-based!
function gett(n,x,y: integer):char;
begin
if (x < 1) or (x > sw[n]) or (y < 1) or (y > sh[n]) then
result := '.'
else
result := ss[sp[n]+y-1][x];
end;
function similarity(lr: TRect; snum: integer):double;
var tw,th,n,nn,x,y,tx,ty: integer;
begin
tw := sw[snum];
th := sh[snum];
n := 0; // число точек вообще в символе который сраниваем из L
nn := 0; // число точек которые совпали с символом в snum
for y := lr.top to lr.bottom do
for x := lr.left to lr.right do
if l[y][x]<>'.' then
begin // проверим эту же точку в итоговой картинке
tx := round((x-lr.left)*tw/(lr.right-lr.left+1)+1);
ty := round((y-lr.top)*th/(lr.bottom-lr.top+1)+1);
if (gett(snum, tx,ty)<>'.') or
(gett(snum, tx,ty-1)<>'.') or
(gett(snum, tx,ty+1)<>'.') or
(gett(snum, tx-1,ty)<>'.') or
(gett(snum, tx+1,ty)<>'.') then
inc(nn);
inc(n);
end;
result := nn/n;
end;
function similarity_back(lr: TRect; snum: integer):double;
var tw,th, n,nn,x,y,lx,ly: integer;
begin
tw := sw[snum];
th := sh[snum];
n := 0; // число точек вообще в символе который сраниваем из L
nn := 0; // число точек которые совпали с символом в snum
for y := 1 to th do
for x := 1 to tw do
if gett(snum,x,y)<>'.' then
begin // проверим эту же точку в итоговой картинке
lx := round((x-1)*(lr.right-lr.left+1)/tw+lr.left);
ly := round((y-1)*(lr.bottom-lr.top+1)/th+lr.top);
if get(lx,ly) or get(lx-1,ly) or get(lx+1,ly) or get(lx,ly-1) or get(lx,ly+1) then
inc(nn);
inc(n);
end;
result := nn/n;
end;
function dofill(x,y: integer; var r: trect): integer;
begin
result := 0;
if l[y][x]<>'.' then exit else l[y][x] := 'E';
inc(result);
if x>r.left then result := result + dofill(x-1,y,r);
if x<r.right then result := result + dofill(x+1,y,r);
if y>r.top then result := result + dofill(x,y-1,r);
if y<r.bottom then result := result + dofill(x,y+1,r);
end;
function getlinks(var r: trect): integer;
var x,y: integer;
begin
result := 0;
for x:=r.left to r.right do
begin
dofill(x,r.top, r);
dofill(x,r.bottom, r);
end;
for y:=r.top+1 to r.bottom-1 do
begin
dofill(r.left,y, r);
dofill(r.right,y, r);
end;
for y := r.top to r.bottom do
for x:=r.left to r.right do
if dofill(x,y, r)>4 then
inc(result);
for y := r.top to r.bottom do
for x:=r.left to r.right do
if l[y][x]='E' then l[y][x] := '.';
end;
// get L-char from rect
function recsymbol(r: TRect):char;
var
i,th,tw,lnk : integer;
s1,s2,s: double;
begin
result := '?';
smax := -1;
lnk := getlinks(r);
for i := 0 to num-1 do
if lnk=links[i mod 26] then
begin
tw := sw[i];
th := sh[i];
if abs(tw/th-(r.Right-r.Left+1)/(r.Bottom-r.Top+1)) > 0.45 then // too bad prop
continue;
s1 := similarity(r, i);
s2 := similarity_back(r, i);
s := (s1+s2)/2;
if s>smax then
begin
smax := s;
result := sc[i+1];
end;
end;
end;
// L to str
function findstr:string;
var i: integer;
begin
denoise;
findrect;
improverect;
rotateRect;
// denoise;
// deholing;
findsymbols;
sortsymbols;
result := '';
for i := 1 to smbn do
result := result + recsymbol(smb[i]);
end;
// a-z = 0..25
// A-Z = 26..51
function lentoc(l: integer):char;
begin
if l<26 then
result := char(byte('a')+l)
else
result := char(byte('A')+(l-26));
end;
function ctolen(c: char):integer;
begin
if (c>='a') and (c<='z') then
result := byte(c)-byte('a')
else
result := byte(c)-byte('A')+26;
end;
function compressline(s: string):string;
var
i,n: integer;
c: char;
begin
c := '.';
n := 0;
result := '';
for i := 1 to length(s) do
if c=s[i] then
inc(n)
else
begin
result := result + lentoc(n);
c := s[i];
n := 1;
end;
if n>0 then
result := result + lentoc(n);
end;
function decompressline(s: string):string;
var
i: integer;
c: char;
begin
if (s[1]='.') or (s[1]='X') then
begin
result := s;
exit;
end;
c := '.';
result := '';
for i := 1 to length(s) do
begin
result := result + stringofchar(c, ctolen(s[i]));
if c='.' then c:='X' else c := '.';
end;
end;
procedure decfonts;
var i: integer;
begin
for i := 0 to sslen-1 do
ss[i] := decompressline(ss[i]);
end;
procedure runmain;
var i,j,n: integer;
begin
decfonts;
readln(n);
for i := 1 to n do
begin
for j := 1 to 200 do
readln(l[j]);
writeln(findstr);
end;
end;
{$IFDEF DLPH}
end.
{$ELSE}
begin
runmain;
end.
{$ENDIF}