| | | |
1 | | - | { |
| 1 | + | 6r99b |
2 | | - | Разградыватель японских кроссводров (c) OCTAGRAM, 2004. |
4 | | - | В Интернете встречается под именем файла MGET.PAS |
6 | | - | Поскольку Turbo Pascal Онлайн позволяет передать в виртуальную |
7 | | - | машину только один файл, и программу, и условие нужно объединить |
8 | | - | в один файл. |
9 | | - | Формат: количество строк, строки, количество столбцов, столбцы. |
10 | | - | Каждая строка и столбец - это последовательности символов, |
11 | | - | кодирующих объекты на поле. 1..9 - соответственно 1..9, |
12 | | - | a..z - 10..35, дальше русские буквы, дальше см. функцию ToNum. |
14 | | - | START |
15 | | - | 25 |
16 | | - | 23 |
17 | | - | 2222 |
18 | | - | 1222 |
19 | | - | 61 |
20 | | - | 1222 |
21 | | - | 2222 |
22 | | - | 43 |
23 | | - | 8 |
24 | | - | 2112 |
25 | | - | c |
26 | | - | 22122 |
27 | | - | 12221 |
28 | | - | g |
29 | | - | 211112 |
30 | | - | 122211 |
31 | | - | g |
32 | | - | 111111 |
33 | | - | 222212 |
34 | | - | g |
35 | | - | 111111 |
36 | | - | 4223 |
37 | | - | c |
38 | | - | 2111 |
39 | | - | 213 |
40 | | - | 6 |
41 | | - | 17 |
42 | | - | 7 |
43 | | - | 414 |
44 | | - | 21112 |
45 | | - | 112b |
46 | | - | 226224 |
47 | | - | 1141112 |
48 | | - | 14a1 |
49 | | - | 84225 |
50 | | - | 8121111 |
51 | | - | 14a2 |
52 | | - | 314225 |
53 | | - | 2261111 |
54 | | - | 222b |
55 | | - | 1121112 |
56 | | - | 22414 |
57 | | - | 227 |
58 | | - | 3 |
61 | | - | } |
62 | | - | {$R-,Q-} |
63 | | - | Program MoneyGetter; |
64 | | - | Uses CRT; |
65 | | - | Const UnKnown = '?'; Plus = '█'; Minus = ' '; Error = '!'; |
66 | | - | UseGrid = False; |
67 | | - | Type ListType = String[79] {^TListType}; |
68 | | - | TListType = Record Count : Byte; Next : ListType End; |
69 | | - | Str79 = String[79]; |
70 | | - | Function ToNum(Symb : Char) : Byte; Forward; |
73 | | - | Function Obsh(Str1, Str2 : Str79) : Str79; |
74 | | - | Var a : Byte; |
75 | | - | TempRes : Str79; |
76 | | - | Begin |
77 | | - | TempRes := ''; |
78 | | - | For a := 1 To Length(Str1) Do |
79 | | - | If Str1[a] <> Str2[a] Then TempRes := TempRes + UnKnown |
80 | | - | Else TempRes := TempRes + Str2[a]; |
81 | | - | Obsh := TempRes |
82 | | - | End; |
85 | | - | Function CanRazmest(Str : Str79; Place, Len : Byte) : Boolean; |
86 | | - | Var a : Byte; |
87 | | - | Begin |
88 | | - | CanRazmest := True; |
89 | | - | If Place > 1 Then If Str[Place - 1] = Plus Then CanRazmest := False; |
90 | | - | If Place + Len - 1 < Length(Str) Then If Str[Place + Len] = Plus Then CanRazmest := False; |
91 | | - | For a := Place To Place + Len - 1 Do |
92 | | - | If Str[a] = Minus Then CanRazmest := False |
93 | | - | End; |
94 | | - | Function AddLine(Str : Str79; Place, Len : Byte) : Str79; |
95 | | - | Var a : Byte; |
96 | | - | Begin |
97 | | - | If Place > 1 Then Str[Place - 1] := Minus; |
98 | | - | If Place + Len - 1 < Length(Str) Then Str[Place + Len] := Minus; |
99 | | - | For a := Place To Place + Len - 1 Do |
100 | | - | Str[a] := Plus; |
101 | | - | AddLine := Str |
102 | | - | End; |
103 | | - | Function MinLen(Uslov : ListType) : Byte; {For first objects} |
104 | | - | Var Tmp : Byte; |
105 | | - | Begin |
106 | | - | Tmp := 255; |
107 | | - | While Uslov <> '' Do |
108 | | - | Begin |
109 | | - | Tmp := Tmp + ToNum(Uslov[1]) + 1; |
110 | | - | Uslov := Copy(Uslov, 2, Length(Uslov) - 1) |
111 | | - | End; |
112 | | - | MinLen := Tmp |
113 | | - | End; |
115 | | - | Function ToNum(Symb : Char) : Byte; |
116 | | - | Begin |
117 | | - | Case Symb Of |
118 | | - | '0' .. '9' : ToNum := Byte(Symb) - Byte('0'); |
119 | | - | 'a' .. 'z' : ToNum := Byte(Symb) - Byte('a') + 10; |
120 | | - | 'A' .. 'Z' : ToNum := Byte(Symb) - Byte('A') + 10; |
121 | | - | 'А' .. 'Я' : ToNum := Byte(Symb) - Byte('А') + 36; |
122 | | - | 'а' .. 'п' : ToNum := Byte(Symb) - Byte('а') + 36; |
123 | | - | 'р' .. 'я' : ToNum := Byte(Symb) - Byte('р') + 52; |
124 | | - | '!' : ToNum := 68; |
125 | | - | '@' : ToNum := 69; |
126 | | - | '#' : ToNum := 70; |
127 | | - | '$' : ToNum := 71; |
128 | | - | '%' : ToNum := 72; |
129 | | - | '^' : ToNum := 73; |
130 | | - | '&' : ToNum := 74; |
131 | | - | '*' : ToNum := 75 |
132 | | - | End |
133 | | - | End; |
135 | | - | Function FillMinus(Str : Str79; Start, Finish : Byte) : Str79; |
136 | | - | Var a : Byte; |
137 | | - | Begin |
138 | | - | For a := Start To Finish Do |
139 | | - | Str[a] := Minus; |
140 | | - | FillMinus := Str |
141 | | - | End; |
143 | | - | Function FillPlus(Str : Str79; Start, Finish : Byte) : Str79; |
144 | | - | Var a : Byte; |
145 | | - | Begin |
146 | | - | For a := Start To Finish Do |
147 | | - | Str[a] := Plus; |
148 | | - | FillPlus := Str |
149 | | - | End; |
151 | | - | Function AllUnKnown(Str : Str79; Start, Finish : Byte) : Boolean; |
152 | | - | Var a : Byte; |
153 | | - | Begin |
154 | | - | AllUnKnown := True; |
155 | | - | For a := Start To Finish Do |
156 | | - | If Str[a] <> UnKnown Then AllUnKnown := False |
157 | | - | End; |
159 | | - | Function PolElem(Uslov : Str79; Elem : Byte) : Byte; |
160 | | - | Var a, Tmp : Byte; |
161 | | - | Begin |
162 | | - | Tmp := 1; |
163 | | - | For a := 1 To Elem - 1 Do |
164 | | - | Inc(Tmp, ToNum(Uslov[a]) + 1); |
165 | | - | PolElem := Tmp |
166 | | - | End; |
168 | | - | Function NoPlus(Str : Str79; Start, Finish : Byte) : Boolean; |
169 | | - | Var a : Byte; |
170 | | - | Begin |
171 | | - | NoPlus := True; |
172 | | - | For a := Start To Finish Do |
173 | | - | If Str[a] = Plus Then NoPlus := False |
174 | | - | End; |
176 | | - | Function Utochn(Str : Str79; Uslov : ListType; |
177 | | - | StartPlace, FinishPlace : Byte) : Str79; Forward; |
178 | | - | Procedure ShowVert(Str : Str79; Col : Byte); Forward; |
180 | | - | Function Utochn2(Str : Str79; Uslov : ListType; StartPlace, FinishPlace : Byte) : Str79; |
181 | | - | Var Prom, NewRes : Str79; |
182 | | - | a : Byte; |
183 | | - | NoError : Boolean; |
184 | | - | Label Ext; |
185 | | - | Begin |
186 | | - | Prom := Str; |
187 | | - | NoError := False; |
188 | | - | If Uslov = '' Then |
189 | | - | Begin |
190 | | - | If NoPlus(Str, StartPlace, FinishPlace) Then |
191 | | - | Utochn2 := FillMinus(Str, StartPlace, FinishPlace) |
192 | | - | Else Utochn2 := Error; |
193 | | - | GoTo Ext End; |
194 | | - | If StartPlace > FinishPlace - MinLen(UsLov) + 1 Then Begin Utochn2 := Error; GoTo Ext End; |
196 | | - | If AllUnKnown(Str, StartPlace, FinishPlace) Then |
197 | | - | Begin |
198 | | - | For a := 1 To Length(Uslov) Do |
199 | | - | Prom := FillPlus(Prom, PolElem(Uslov, a) + FinishPlace - MinLen(Uslov), |
200 | | - | PolElem(Uslov, a + 1) + StartPlace - 3); |
201 | | - | If MinLen(Uslov) = FinishPlace - StartPlace + 1 Then |
202 | | - | For a := 2 To Length(Uslov) Do |
203 | | - | Prom[PolElem(Uslov, a) - 2 + StartPlace] := Minus; |
204 | | - | Utochn2 := Prom; |
205 | | - | NoError := True |
206 | | - | End |
207 | | - | Else |
208 | | - | For a := FinishPlace - ToNum(Uslov[Length(Uslov)]) + 1 |
209 | | - | DownTo StartPlace + MinLen(Uslov) - ToNum(Uslov[Length(Uslov)]) Do |
211 | | - | If CanRazmest(Str, a, ToNum(Uslov[Length(Uslov)])) Then |
212 | | - | If NoPlus(Str, a + ToNum(Uslov[Length(Uslov)]), FinishPlace) Then |
213 | | - | Begin |
214 | | - | NewRes := AddLine(Str, a, ToNum(Uslov[Length(Uslov)])); |
215 | | - | NewRes := FillMinus(NewRes, a + ToNum(Uslov[Length(Uslov)]), FinishPlace); |
216 | | - | NewRes := Utochn(NewRes, Copy(Uslov, 1, Length(Uslov) - 1), |
217 | | - | StartPlace, a - 2); |
218 | | - | If NewRes <> Error Then |
219 | | - | Begin |
220 | | - | ShowVert(NewRes, 79); |
221 | | - | If NoError Then |
222 | | - | Begin |
223 | | - | Prom := Obsh(Prom, NewRes); |
224 | | - | If Prom = Str Then |
225 | | - | Begin |
226 | | - | Utochn2 := Prom; |
227 | | - | GoTo Ext |
228 | | - | End |
229 | | - | End |
230 | | - | Else Prom := NewRes; |
231 | | - | NoError := True |
232 | | - | End |
233 | | - | End; |
234 | | - | If NoError Then Utochn2 := Prom |
235 | | - | Else Utochn2 := Error; |
237 | | - | Ext : |
238 | | - | End; |
241 | | - | Function Utochn(Str : Str79; Uslov : ListType; StartPlace, FinishPlace : Byte) : Str79; |
242 | | - | Var Prom, NewRes : Str79; |
243 | | - | a : Byte; |
244 | | - | NoError : Boolean; |
245 | | - | Label Ext; |
246 | | - | Begin |
247 | | - | Prom := Str; |
248 | | - | NoError := False; |
249 | | - | If Uslov = '' Then |
250 | | - | Begin |
251 | | - | If NoPlus(Str, StartPlace, FinishPlace) Then |
252 | | - | Utochn := FillMinus(Str, StartPlace, FinishPlace) |
253 | | - | Else Utochn := Error; |
254 | | - | GoTo Ext End; |
255 | | - | If StartPlace > FinishPlace - MinLen(UsLov) + 1 Then Begin Utochn := Error; GoTo Ext End; |
257 | | - | If AllUnKnown(Str, StartPlace, FinishPlace) Then |
258 | | - | Begin |
259 | | - | For a := 1 To Length(Uslov) Do |
260 | | - | Prom := FillPlus(Prom, PolElem(Uslov, a) + FinishPlace - MinLen(Uslov), |
261 | | - | PolElem(Uslov, a + 1) + StartPlace - 3); |
262 | | - | If MinLen(Uslov) = FinishPlace - StartPlace + 1 Then |
263 | | - | For a := 2 To Length(Uslov) Do |
264 | | - | Prom[PolElem(Uslov, a) - 2 + StartPlace] := Minus; |
265 | | - | Utochn := Prom; |
266 | | - | NoError := True |
267 | | - | End |
268 | | - | Else |
269 | | - | For a := StartPlace To FinishPlace - MinLen(Uslov) + 1 Do |
270 | | - | If CanRazmest(Str, a, ToNum(Uslov[1])) Then |
271 | | - | If NoPlus(Str, StartPlace, a - 1) Then |
272 | | - | Begin |
273 | | - | NewRes := AddLine(Str, a, ToNum(Uslov[1])); |
274 | | - | NewRes := FillMinus(NewRes, StartPlace, a - 1); |
275 | | - | NewRes := Utochn2(NewRes, Copy(Uslov, 2, Length(Uslov) - 1), |
276 | | - | a + ToNum(Uslov[1]) + 1, FinishPlace); |
277 | | - | If NewRes <> Error Then |
278 | | - | Begin |
279 | | - | ShowVert(NewRes, 79); |
280 | | - | If NoError Then |
281 | | - | Begin |
282 | | - | Prom := Obsh(Prom, NewRes); |
283 | | - | If (StartPlace = 1) And (FinishPlace = Length(Str)) Then ShowVert(Prom, 80); |
284 | | - | If Prom = Str Then |
285 | | - | Begin |
286 | | - | Utochn := Prom; |
287 | | - | GoTo Ext |
288 | | - | End |
289 | | - | End |
290 | | - | Else Prom := NewRes; |
291 | | - | NoError := True |
292 | | - | End |
293 | | - | End; |
294 | | - | If NoError Then Utochn := Prom |
295 | | - | Else Utochn := Error; |
297 | | - | Ext : |
298 | | - | End; |
300 | | - | Type HeapTp = Array[1 .. 80, 1 .. 80] Of Char; |
301 | | - | Var StrNow : Str79; |
302 | | - | HeapSt : HeapTp; |
303 | | - | HeapOldSt : HeapTp; |
304 | | - | SizeX, SizeY : Byte; |
305 | | - | HorizUsl, VertUsl : Array[1 .. 80] Of Str79; |
306 | | - | FileName : Str79; TheFile : Text; |
308 | | - | Procedure MakeHeap(DimX, DimY : Byte); |
309 | | - | Var a, b : Byte; |
310 | | - | Begin |
311 | | - | SizeX := DimX; |
312 | | - | SizeY := DimY; |
313 | | - | For a := 1 To DimY Do |
314 | | - | For b := 1 To DimX Do |
315 | | - | HeapSt[a, b] := UnKnown |
316 | | - | End; |
318 | | - | Function HeapEqu : Boolean; |
319 | | - | Var a : Word; |
320 | | - | Begin |
321 | | - | HeapEqu := True; |
322 | | - | For a := 1 To 1600 Do |
323 | | - | If HeapSt[1, a] <> HeapOldSt[1, a] |
324 | | - | Then HeapEqu := False; |
325 | | - | HeapOldSt := HeapSt |
326 | | - | End; |
328 | | - | {Function NoError : Boolean; |
329 | | - | Var a : Byte; |
330 | | - | Begin |
331 | | - | NoError := True; |
332 | | - | For a := 1 To SizeY Do |
333 | | - | If HeapSt[a, 1] = Error Then NoError := False; |
334 | | - | For a := 1 To SizeX Do |
335 | | - | If HeapSt[1, a] = Error Then NoError := False |
336 | | - | End;} |
338 | | - | Const NoError : Boolean = True; |
340 | | - | Procedure IzvlHoriz(Row : Byte); |
341 | | - | Var a : Byte; |
342 | | - | Begin |
343 | | - | StrNow := ''; |
344 | | - | For a := 1 To SizeX Do |
345 | | - | StrNow := StrNow + HeapSt[Row, a] |
346 | | - | End; |
348 | | - | Procedure IzvlVert(Col : Byte); |
349 | | - | Var a : Byte; |
350 | | - | Begin |
351 | | - | StrNow := ''; |
352 | | - | For a := 1 To SizeY Do |
353 | | - | StrNow := StrNow + HeapSt[a, Col] |
354 | | - | End; |
356 | | - | Procedure SaveHoriz(Row : Byte); |
357 | | - | Var a : Byte; |
358 | | - | Begin |
359 | | - | For a := 1 To SizeX Do |
360 | | - | HeapSt[Row, a] := StrNow[a] |
361 | | - | End; |
363 | | - | Procedure SaveVert(Col : Byte); |
364 | | - | Var a : Byte; |
365 | | - | Begin |
366 | | - | For a := 1 To SizeY Do |
367 | | - | HeapSt[a, Col] := StrNow[a] |
368 | | - | End; |
370 | | - | Procedure UtochnHoriz(Row : Byte); |
371 | | - | Begin |
372 | | - | IzvlHoriz(Row); |
373 | | - | StrNow := Utochn(StrNow, HorizUsl[Row], 1, Length(StrNow)); |
374 | | - | If StrNow <> Error Then SaveHoriz(Row) Else NoError := False |
375 | | - | End; |
377 | | - | Procedure UtochnVert(Col : Byte); |
378 | | - | Begin |
379 | | - | IzvlVert(Col); |
380 | | - | StrNow := Utochn(StrNow, VertUsl[Col], 1, Length(StrNow)); |
381 | | - | If StrNow <> Error Then SaveVert(Col) Else NoError := False; |
382 | | - | End; |
384 | | - | Var TextScreen : Array[1 .. 50, 1 .. 80] Of |
385 | | - | Record Symb : Char; Attr : Byte End Absolute $B800 : 0000; |
387 | | - | Procedure MakeGrid; |
388 | | - | Var a, b : Byte; |
389 | | - | Begin |
390 | | - | If not UseGrid then Exit; |
391 | | - | For a := 1 To SizeY Do |
392 | | - | For b := 1 To SizeX Do |
393 | | - | TextScreen[a, b].Attr := $07 + ((a + b) Mod 2) * $88 |
394 | | - | End; |
396 | | - | Procedure ShowVert(Str : Str79; Col : Byte); |
397 | | - | Var a : Byte; |
398 | | - | Begin |
399 | | - | For a := 1 To Length(Str) Do |
400 | | - | TextScreen[a, Col].Symb := Str[a] |
401 | | - | End; |
403 | | - | Procedure HLC(Col : Byte); |
404 | | - | Var a : Byte; |
405 | | - | Begin |
406 | | - | For a := 1 To SizeY Do |
407 | | - | TextScreen[a, Col].Attr := $8F |
408 | | - | End; |
410 | | - | Procedure HLR(Row : Byte); |
411 | | - | Var a : Byte; |
412 | | - | Begin |
413 | | - | For a := 1 To SizeX Do |
414 | | - | TextScreen[Row, a].Attr := $8F |
415 | | - | End; |
417 | | - | Procedure UpdateScreen; |
418 | | - | Var a, b : Byte; |
419 | | - | Begin |
420 | | - | Asm |
421 | | - | mov ax, 0720h {Clear Screen} |
422 | | - | push 0B800h |
423 | | - | pop es |
424 | | - | mov di,0 |
425 | | - | cld |
426 | | - | mov cx,4000 |
427 | | - | rep stosw |
428 | | - | End; |
429 | | - | For a := 1 To SizeY Do For b := 1 To SizeX Do |
430 | | - | TextScreen[a, b].Symb := HeapSt[a, b] |
431 | | - | End; |
433 | | - | Function Done : Boolean; |
434 | | - | Var a, b : Byte; |
435 | | - | Begin |
436 | | - | Done := True; |
437 | | - | For a := 1 To SizeY Do For b := 1 To SizeX Do |
438 | | - | If HeapSt[a, b] = UnKnown Then Done := False |
439 | | - | End; |
441 | | - | Procedure FFQC(CT : Char); {Find First Question & Change to ... ( Change To ) } |
442 | | - | Var a, b : Byte; |
443 | | - | Label Ext; |
444 | | - | Begin |
445 | | - | For a := 1 To SizeY Do |
446 | | - | For b := 1 To SizeX Do |
447 | | - | If HeapSt[a, b] = UnKnown Then |
448 | | - | Begin |
449 | | - | HeapSt[a, b] := CT; |
450 | | - | GoTo Ext |
451 | | - | End; |
452 | | - | Ext : |
453 | | - | End; |
455 | | - | Type STp = Record Q : Array[1 .. 2500] Of Record X, Y : Byte End; Count : Word End; |
456 | | - | Var StackQ : Array[1 .. 40] Of ^STp; |
457 | | - | Const SP : Byte = 1; |
459 | | - | Procedure Push; |
460 | | - | Var a, b : Byte; |
461 | | - | Begin |
462 | | - | New(StackQ[SP]); |
463 | | - | StackQ[SP]^.Count := 0; |
464 | | - | For a := 1 To SizeY Do |
465 | | - | For b := 1 To SizeX Do |
466 | | - | If HeapSt[a, b] = UnKnown Then |
467 | | - | Begin |
468 | | - | Inc(StackQ[SP]^.Count); |
469 | | - | StackQ[SP]^.Q[StackQ[SP]^.Count].X := b; |
470 | | - | StackQ[SP]^.Q[StackQ[SP]^.Count].Y := a |
471 | | - | End; |
472 | | - | Inc(SP) |
473 | | - | End; |
474 | | - | Procedure Pop; |
475 | | - | Var a : Byte; |
476 | | - | Begin |
477 | | - | Dec(SP); |
478 | | - | For a := StackQ[SP]^.Count DownTo 1 Do |
479 | | - | HeapSt[StackQ[SP]^.Q[a].Y, StackQ[SP]^.Q[a].X] := UnKnown; |
480 | | - | Dispose(StackQ[SP]); |
481 | | - | End; |
483 | | - | Function ColEqu(Col : Byte) : Boolean; |
484 | | - | Var a : Byte; |
485 | | - | Begin |
486 | | - | ColEqu := True; |
487 | | - | For a := 1 To SizeY Do |
488 | | - | If HeapSt[a, Col] <> HeapOldSt[a, Col] Then |
489 | | - | ColEqu := False |
490 | | - | End; |
492 | | - | Var RowEqu : Array[1 .. 80] Of Boolean; |
494 | | - | Procedure RowEq; |
495 | | - | Var Row, Col : Byte; |
496 | | - | Begin |
497 | | - | For Row := 1 To SizeY Do |
498 | | - | Begin |
499 | | - | RowEqu[Row] := True; |
500 | | - | For Col := 1 To SizeX Do |
501 | | - | If HeapSt[Row, Col] <> HeapOldSt[Row, Col] Then |
502 | | - | RowEqu[Row] := False |
503 | | - | End |
504 | | - | End; |
506 | | - | Procedure Test; |
507 | | - | Var Sum1, Sum2 : Word; |
508 | | - | a : Byte; |
509 | | - | Begin |
510 | | - | Sum1 := 0; |
511 | | - | Sum2 := 0; |
512 | | - | For a := 1 To SizeX Do |
513 | | - | Inc(Sum1, MinLen(VertUsl[a]) + 1 - Length(VertUsl[a])); |
514 | | - | For a := 1 To SizeY Do |
515 | | - | Inc(Sum2, MinLen(HorizUsl[a]) + 1 - Length(HorizUsl[a])); |
516 | | - | If Sum1 <> Sum2 Then |
517 | | - | Begin |
518 | | - | WriteLn('Checksum error!'); |
519 | | - | Repeat Until KeyPressed; |
520 | | - | Halt(1) |
521 | | - | End |
522 | | - | End; |
524 | | - | {$DEFINE ErStop} |
526 | | - | Procedure Think; |
527 | | - | Label Ret, Ext, Ext2; |
528 | | - | Var a : Byte; |
529 | | - | Begin |
530 | | - | Ret : UpdateScreen; |
531 | | - | NoError := True; |
532 | | - | For a := 1 To SizeY Do |
533 | | - | If Not RowEqu[a] Then |
534 | | - | Begin |
535 | | - | HLR(a); |
536 | | - | UtochnHoriz(a); |
537 | | - | UpdateScreen |
538 | | - | End; |
539 | | - | {$IFDEF ErStop} |
540 | | - | If Not NoError Then GoTo Ext; |
541 | | - | {$ENDIF} |
543 | | - | UpdateScreen; |
544 | | - | NoError := True; |
545 | | - | For a := 1 To SizeX Do |
546 | | - | If Not ColEqu(a) Then |
547 | | - | Begin |
548 | | - | HLC(a); |
549 | | - | UtochnVert(a); |
550 | | - | UpdateScreen |
551 | | - | End; |
552 | | - | RowEq; |
553 | | - | If (Not Done) And (Not HeapEqu) {$IFDEF ErStop} And NoError {$ENDIF} Then GoTo Ret; |
554 | | - | Ext : |
555 | | - | UpdateScreen; |
556 | | - | If Done Then GoTo Ext2; |
557 | | - | If Not NoError Then |
558 | | - | If SP > 1 Then |
559 | | - | Begin |
560 | | - | Pop; |
561 | | - | FFQC(Minus); |
562 | | - | GoTo Ret |
563 | | - | End |
564 | | - | Else |
565 | | - | Begin |
566 | | - | {TextMode(CO80);} |
567 | | - | WriteLn('Error!'); |
568 | | - | GoTo Ext2 |
569 | | - | End |
570 | | - | Else |
571 | | - | If HeapEqu Then |
572 | | - | Begin |
573 | | - | Push; |
574 | | - | FFQC(Plus); |
575 | | - | GoTo Ret |
576 | | - | End; |
577 | | - | Ext2 : |
578 | | - | End; |
580 | | - | Var a : Byte; |
581 | | - | S: String; |
582 | | - | Begin |
583 | | - | { Write('Введите имя файла условия : '); } |
584 | | - | { ReadLn(FileName); } |
585 | | - | Assign(TheFile, 'PROGRAM.PAS'); |
586 | | - | ReSet(TheFile); |
587 | | - | repeat |
588 | | - | ReadLn(TheFile, S); |
589 | | - | until S = 'START'; |
590 | | - | ReadLn(TheFile, SizeY); |
591 | | - | For a := 1 To SizeY Do |
592 | | - | ReadLn(TheFile, HorizUsl[a]); |
593 | | - | ReadLn(TheFile, SizeX); |
594 | | - | For a := 1 To SizeX Do |
595 | | - | ReadLn(TheFile, VertUsl[a]); |
596 | | - | Close(TheFile); |
597 | | - | Test; |
598 | | - | MakeHeap(SizeX, SizeY); |
599 | | - | TextMode(265); |
600 | | - | Asm |
601 | | - | mov dx,3DAh |
602 | | - | in al,dx |
603 | | - | mov dx,3C0h |
604 | | - | mov al,10h |
605 | | - | out dx,al |
606 | | - | mov al,04h |
607 | | - | out dx,al |
608 | | - | mov dx,3DAh |
609 | | - | in al,dx |
610 | | - | mov dx,3C0h |
611 | | - | mov al,20h |
612 | | - | out dx,al |
613 | | - | End; { No Blink } |
616 | | - | Think; |
618 | | - | MakeGrid; |
619 | | - | Repeat Until KeyPressed; |
621 | | - | TextMode(CO80) |
622 | | - | End. |