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

0 голосов

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


image

спросил от Одаренный (2.7k баллов) в категории Информатика
оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Одаренный (2.7k баллов)

видимо,да

оставил комментарий от Одаренный (2.7k баллов)

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

оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Одаренный (2.7k баллов)

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

оставил комментарий от Архангел (142k баллов)

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

оставил комментарий от Одаренный (2.7k баллов)

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

оставил комментарий от Архангел (142k баллов)

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

1 Ответ
0 голосов
ответил от Архангел (142k баллов)
 
Лучший ответ

// 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.

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

...