ce que j'essaie de faire, est de déterminer si les crochets sont dans le bon ordre. Par exemple ([][[]]<<>>)
est vallid, mais ][]<<(>>)
ne l'est pas.Vérifiez si l'ordre de support est valide
J'ai obtenu une version de travail, mais il a une efficacité terrible et quand il obtient 1000+ supports, c'est juste fou lent. J'espérais que quelqu'un pourrait suggérer des améliorations possibles ou une autre façon de le faire.
Voici mon code:
program Codex;
const
C_FNAME = 'zavorky.in';
var TmpChar : char;
leftBrackets, rightBrackets : string;
bracketPos : integer;
i,i2,i3 : integer;
Arr, empty : array [0..10000] of String[2];
tfIn : Text;
result : boolean;
begin
leftBrackets := ' ([ /* ($ <! << ';
rightBrackets := ') ] */ $) !> >> ';
i := 0;
result := true;
Assign(tfIn, C_FNAME);
Reset(tfIn);
{ load data into array }
while not eof(tfIn) do
begin
while not eoln(tfIn) do
begin
read(tfIn, TmpChar);
if (TmpChar <> ' ') then begin
if (TmpChar <> '') then begin
Arr[i] := Arr[i] + TmpChar;
end
end
else
begin
i := i + 1;
end
end;
i2 := -1;
while (i2 < 10000) do begin
i2 := i2 + 1;
{if (i2 = 0) then
writeln('STARTED LOOP!');}
if (Arr[i2] <> '') then begin
bracketPos := Pos(' ' + Arr[i2] + ' ',rightBrackets);
if (bracketPos > 0) then begin
if (i2 > 0) then begin
if(bracketPos = Pos(' ' + Arr[i2-1] + ' ',leftBrackets)) then begin
{write(Arr[i2-1] + ' and ' + Arr[i2] + ' - MATCH ');}
Arr[i2-1] := '';
Arr[i2] := '';
{ reindex our array }
for i3 := i2 to 10000 - 2 do begin
Arr[i3 - 1] := Arr[i3+1];
end;
i2 := -1;
end;
end;
end;
end;
end;
{writeln('RESULT: ');}
For i2:=0 to 10 do begin
if (Arr[i2] <> '') then begin
{write(Arr[i2]);}
result := false;
end;
{else
write('M');}
end;
if (result = true) then begin
writeln('true');
end
else begin
writeln('false');
end;
result := true;
{ move to next row in file }
Arr := empty;
i := 0;
readln(tfIn);
end;
Close(tfIn);
readln;
end.
Les données d'entrée dans le fichier zavorky.in chercher par exemple comme ceci:
<< $) >> << >> ($ $) [ ] <! () !>
() /* << /* [ ] */ >> <! !> */
je détermine pour chaque ligne si elle est valide ou non. Le nombre maximal de parenthèses sur une ligne est 10000.
Mais le fait est que, puisqu'une rangée de parenthèses peut contenir jusqu'à 10.000 parenthèses, je ne peux pas la lire en chaînes, car elle ne rentre pas . Et diviser les 10.000 caractères en chaînes ne fonctionnera pas bien avec les contrôles .. – Mykybo
@Mykybo En fait, ce n'est pas un problème. La chaîne dans Pascal est comme un tableau de char. Déclarez un tableau de char et remplissez-le à partir du fichier. Ensuite, utilisez l'idée que je vous ai donnée ici. Si nécessaire, vous pouvez également redéclarer une fonction comme 'Pos'. Mais, s'il vous plaît, ne lisez pas vos fichiers byte-byte-byte. C'est très lent. –
@Mykybo J'ai ajouté la réponse. Voir l'idée comment faire le bloc de lecture de votre fichier. –