Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб сен 22, 2018 23:38

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: *удалить вертикальный блок из текста
СообщениеДобавлено: Сб апр 03, 2010 10:28 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 4949
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 18 раз.
Поблагодарили: 56 раз.
дано: в памяти по указанному адресу находится текстовый блок, включающий в себя некоторое количество строк в ISO кодировке(т.е. размер символа фиксирован и равен одному байту). В явном виде заданы адрес начала блока и его длина. Каждая строка отделена от следующей символом(символами) перевода строки. Необходимо удалить из текста прямоугольный блок, заданный начальной строкой и начальной позицией в строке, начиная с которой будет вырезаться текстовый блок, а так же количество строк и количество символов, которые необходимо вырезать из текста. В случае, если заданный размер блока выходит за пределы текстового блока, удалять только существующие символы в строке и строки в тексте.

\ удалить вертикальный блок из текста
\ вернуть адрес начала и длину результирующего текста
: del-block ( pos-x pos-y #x #y addr # --> addr # )
;

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт апр 06, 2010 16:50 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2120
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 40 раз.
Код:
: del-block { a u x y dx dy \ at yt -- a u }
  a TO at u 0
  DO I a + C@ 0xA =
     IF yt y y dy + WITHIN
        IF at x + dx +  at x +  u at x + a - - MOVE
           dx NEGATE R@ + RP@ !
        THEN
        a I 1+ + TO at yt 1+ TO yt
     THEN
     yt 1+ y dy + >
     IF LEAVE THEN
  LOOP a u dy dx * - ;


\ EOF

: cr!
  S" 0x0A0D SWAP 2R@ DROP + W!" EVALUATE ; IMMEDIATE

: s1
  S" 01234..56789..ABCDRTTY..RWRWRT.."
\         5      12        22      30
  2>R 5 cr! 12 cr! 22 cr! 30 cr! 2R>  ;


s1 TYPE CR

s1 1 1 2 3 del-block  TYPE


LOG
Код:
01234
56789
ABCDRTTY
RWRWRT

01234
589
ADRTTY
RWRT

Ok

_________________
С уважением, chess


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB