В общем робот проверяет два параметра 1) есть ли слева от него стена, 2) нет ли перед ним стены. Если есть стена слева, но нет спереди - он красит, если есть перед ним стена, то он поворачивает направо и делает шаг на след. клетку, если же ни слева ни перед ним стены нет - он останавливается.
PascalABC.NET 3.3.5, сборка 1660 от 20.04.2018 Внимание! Если программа не работает, обновите версию!
procedure Preobraz(var Stroka:string); begin var bq:=new Queue<(integer,integer)>; foreach var m in Stroka.Matches('\s+') do bq.Enqueue((m.Index,m.Length)); var wq:=new Queue<(integer,string)>; foreach var m in Stroka.Matches('\S+') do if m.Value.Any(t->t in ['0'..'9']) then wq.Enqueue((m.Index,'')) else wq.Enqueue((m.Index,m.Value)); Stroka:=''; var pbi,pwi:integer; while (bq.Count>0) and (wq.Count>0) do begin (pbi,pwi):=(bq.Peek[0],wq.Peek[0]); if pbi<pwi then begin Stroka:=Stroka+bq.Peek[1]*' '; bq.Dequeue end else begin Stroka:=Stroka+wq.Peek[1]; wq.Dequeue end end; while bq.Count>0 do begin Stroka:=Stroka+bq.Peek[1]*' '; bq.Dequeue end; while wq.Count>0 do begin Stroka:=Stroka+wq.Peek[1]; wq.Dequeue end end;
begin var s:=ReadlnString; Preobraz(s); s:='<'+s+'>'; // чтобы было видно, как работает s.Println end.
Не такое оно и сложное. Главная проблема - то, что между словами может быть несколько пробелов. Устраним её, написав функцию, которая оставляла бы между словами по 1 пробелу:
function RemoveSpaces(str : string) : string; begin //Тут цикл for, переписанный через while var iter := 1; //Проходим по строке while (iter < str.Length) do begin //Если видим 2 пробела подряд, удаляем 1 и откатывает итератор. if (str[iter] = ' ') and (str[iter + 1] = ' ') then begin str := str.Remove(iter, 1); iter -= 1; end; iter += 1; end; RemoveSpaces := str; end;
Теперь мы можем получить кол-во слов очень просто:
function CalcWords(str : string) : integer; begin CalcWords := RemoveSpaces(str).Split(' ').Count(); end;
Т.е. мы делим строку на массив через пробелы, и считаем кол-во элементов массива.
if(left_is_blocked && front_is_clear){
paint( );
}
else { stop( ); }
if (front_is_blocked){
turn_right( );
step( );
}
Объяснение:
В общем робот проверяет два параметра 1) есть ли слева от него стена, 2) нет ли перед ним стены. Если есть стена слева, но нет спереди - он красит, если есть перед ним стена, то он поворачивает направо и делает шаг на след. клетку, если же ни слева ни перед ним стены нет - он останавливается.