Помогите,пожалуйста,написать программу в Pascal ABC ОЧЕНЬ НУЖНО

0 голосов
40 просмотров

Помогите,пожалуйста,написать программу в Pascal ABC
ОЧЕНЬ НУЖНО


image

Информатика (2.7k баллов) | 40 просмотров
0

"Сохранение структуры пробелов" - это как надо понимать? Ни один пробел не удаляется? Т.е. если до удаляемого слова 5 пробелов и после него три, то останется восемь пробелов?

0

видимо,да

0

но наверное подразумевется,что останется 2 пробела: 1 был до,другой-после

0

Нет, я о случае, когда пробелов не один. Когда один - там все просто.

0

Если заранее оговорено, что между словами ровно один пробел, все гораздо проще, чем когда допускается и больше.

0

И вот еще непонятный момент: в первом слове какие-то буквы по определению дублируются, если производится удаление слов. Само это слово остается?

0

да,думаю,остаётся

0

Получается монстр такой, если пробелов больше одного...((

0

может,попробовать с 1 пробелом,я уже как только не пробовала,всё равно почему-то не получается(

0

Да потому что сама задача гадкая. Сделать её получится, конечно, но громоздко. Нешкольный это уровень... либо учитель перемудрил.

Дан 1 ответ
0 голосов
Правильный ответ

// PascalABC.NET 3.1, сборка 1219 от 16.04.2016
begin
  var s:=ReadlnString('>');
  var s1:=s.Trim;
  var a:=s1.ToWords.ToArray; // a - массив слов
  // b - массив слов с хвостовыми пробелами
  var q:=Regex.Matches(s1,'(\S+\s*)');
  var b:array of string;
  SetLength(b,q.Count);
  var i:=0;
  foreach var e in q do begin
    b[i]:=e.ToString;
    Inc(i)
    end;
  // частотный словарь для первого слова
  var d:=new Dictionary;
  foreach var e in a[0] do d[e]:=d.Get(e)+1;
  // все повторяющиеся символы из словаря помещаем в массив dub
  var dub:=d.Where(x->x.Value>1).Select(x->x.Key).ToArray;
  if dub.Length=0 then Writeln('НЕТ')
  else begin
    var res:=b[0]; // начало выходной строки
    i:=1;
    while s[i]=' ' do begin res:=' '+res; Inc(i) end;
    for i:=1 to a.Length-1 do begin
      var found:=false;
      foreach var e in dub do begin
        found:=Pos(e,a[i])>0;
        if found then break
        end;
      if found then b[i]:=' '*(b[i].Length-a[i].Length);
      res+=b[i]
      end;
      i:=s.Length;
      while s[i]=' 'do begin res+=' '; Dec(i) end;
      Writeln(res)
  end
end.

Тестовое решение:
>  балабол - по  данным словаря болтун,  человек, который  много говорит попусту 
 балабол - по       который  много говорит попусту

(142k баллов)