Работа со словами в предложении с разделителями.
Разделитель — один из символов « ,.;:!?"'» (начиная с пробела и заканчивая апострофом). Буква — любой символ, отличный от разделителя. Слово — последовательность букв, ограниченная с каждой стороны разделителем или концом строки.
Требуется удалить все слова, которые начинаются и заканчиваются одной и той же буквой, и продублировать все остальные слова (при всех манипуляциях со словами разделители сохранять без изменений).
Алгоритм такой. Сначала находим позиции всех разделителей в предложении перебором этих разделителей и записью позиций в массив. Затем сортируем массив. Слова теперь можно получить выделив кусок строки между двумя соседними разделителями, если только два разделителя не стоят рядом. Организуем цикл по всем разделителям, выделяем слова и формируем результирующую сторку в соотвествии с условиями задачи (не забывая дублировать разделители). Чтобы не возиться с постоянными проверками на конец и начало строки, я добавил по пробелу (коий является разделителем) в начало и конец.
var delim,sent,result,tmps:string;
dArr : array[1..100] of byte;
i,p,k,w:byte;
begin
delim := ' ,.;:!?"''';
sent:= 'Let''s say, there is a test, simple: example. Clear? Sure! Next; aga well.';
sent:= ' '+sent+' ';
w:=0;
for i:=1 to 100 do dArr[i]:=0;
for i:=1 to length(delim) do
begin
tmps:=sent;
k:=pos(delim[i],tmps); p:=0;
while (k>0) do
begin
p:=p+k;
w:=w+1;
dArr[w]:=p;
Delete(tmps,1,k);
k:=pos(delim[i],tmps);
end;
end;
for i:=1 to w-1 do
for k:=i+1 to w do
if (dArr[i]>dArr[k]) then
begin
p:=dArr[i];
dArr[i]:=dArr[k];
dArr[k]:=p;
end;
result:='';
for i:=1 to w-1 do
if (dArr[i+1]-dArr[i]>1) then
begin
tmps := copy(sent,1+dArr[i],dArr[i+1]-1-dArr[i]);
if (tmps[1]=tmps[length(tmps)]) then
result:=result+sent[dArr[i+1]]
else
result:=result+tmps+' '+tmps+sent[dArr[i+1]]
end
else
result:=result+sent[dArr[i+1]];
writeln(' Original: '+sent);
writeln(' Result: '+result);
end.
|