pastebin - collaborative debugging

pastebin is a collaborative debugging tool allowing you to share and modify code snippets while chatting on IRC, IM or a message board.

This site is developed to XHTML and CSS2 W3C standards. If you see this paragraph, your browser does not support those standards and you need to upgrade. Visit WaSP for a variety of options.

 > Turbo Pascal Онлайн Получить справку

Различия между изменённой записью 29022 оставленной EllPabe 13.05.2019 в 02:09 и
оригинальной записью 24 оставленной OCTAGRAM 12.02.2017 в 06:42
Показать старую версию | новую версию | обе версии

    
1-
{
1+
fp64c
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.

Использовать подсветку синтаксиса
В текущей реализации JS-DOS Read/ReadLn работают только при подключенном модуле Crt! Для подсветки отдельных строк используйте для них префикс @@


картинка


Запомнить мои настройки