Удаление лишних пробелов

Задача

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

Пояснение к задаче и алгоритм решения

Чтобы удалить все пробелы в начале строки, надо проверять первый символ, не является ли он пробелом, до тех пор, пока он им являться не будет. Если первый символ пробел, то его следует удалять.

Для удаления пробелов в конце используется примерно тот же алгоритм, что и для удаления в начале. Однако надо уменьшать на 1 индекс последнего элемента, если пробел был удален, или постоянно измерять длину строки (значение длины либо совпадает с последним индексом, либо меньше на 1).

Для удаления лишних пробелов внутри строки, надо, посимвольно перебирая строку, проверять, если очередной символ пробел, то не пробел ли следующий за ним. Если это так, то надо взять строку от начала до текущего (пробельного) символа включительно и присоединить к этой части часть строки, начинающуюся после второго пробела и до конца. При этом не надо увеличивать индекс элементов (т.к. может оказаться, что после удаленного пробела есть еще пробелы). Если же очередной символ не пробел или пробел, но после него идет не пробел, то надо перейти к следующему символу строки.

Исходный код на языке программирования Pascal

var
    str: string;
    i: byte;
begin
    readln(str);
    i := 1;
    while str[i] = ' ' do
        delete(str,i,1);
    while str[length(str)] = ' ' do
        delete(str, length(str), 1);
    i := 2;
    while i < length(str) do
        if (str[i] = ' ') and (str[i+1] = ' ') then
            str := copy(str,1,i) + copy(str,i+2,length(str))
        else
            i := i + 1;
    writeln(str);
end.

Пример(ы) выполнения программы на языке Pascal

   drink    who I mark   ten                  one   dump
drink who I mark ten one dump

Исходный код на языке программирования Python

s = input()
i = 0
while s[i] == ' ':
    s = s[1:]
while s[len(s)-1] == ' ':
    s = s[:-1]
i = 1
while i < len(s)-1:
    if s[i] == ' ' and s[i+1] == ' ':
        s = s[:i+1] + s[i+2:]
    else:
        i += 1
print(s)

Пример(ы) выполнения программы на языке Python

    ты что       делаешь    сейч    
ты что делаешь сейч

Исходный код на языке программирования КуМир

алг удаление пробелов
нач
  лит s
  цел i
  ввод s
  i := 1
  нц пока s[i] = " "
    s := s[2:длин(s)]
  кц
  нц пока s[длин(s)] = " "
    s := s[1:длин(s)-1]
  кц
  i := 2
  нц пока i < длин(s)
    если s[i] = " " и s[i+1] = " " то
      s := s[1:i] + s[i+2:длин(s)]
     иначе
      i := i + 1
    все
  кц
  вывод s
кон

Пример(ы) выполнения программы на языке КуМир

          кто   где когда   и почему  
кто где когда и почему

Исходный код на языке программирования Basic

input s$
i = 1
while mid(s$,1,1) = " "
        s$ = right(s$,length(s$)-1)
end while
 
while mid(s$,length(s$),1) = " "
        s$ = left(s$,length(s$)-1)
end while
 
i = 2
while i < length(s$)
        if mid(s$,i,1) = " " and mid(s$,i+1,1) = " " then
                s$ = left(s$,i) + right(s$,length(s$)-i-1)
        else
                i = i + 1
        endif
end while
print s$

Пример(ы) выполнения программы на языке Basic

  where      is   ball  
where is ball

Тема

Строки

Уровень сложности

Сложный

Дата публикации

Комментарий

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

s=input()
st=""
s=s.strip()
for i in range(len(s)):
    n=s.find(" ")
    if n==-1:
        st=st+s
        break
    st=st+s[:n]+' '
    s=s[n+1:]
    s=s.lstrip()
print(st.rstrip())