Forth
http://fforum.winglion.ru/

*преобразование табуляций в тексте
http://fforum.winglion.ru/viewtopic.php?f=19&t=739
Страница 3 из 3

Автор:  Ethereal [ Пн июл 25, 2011 06:46 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

О задаче про замену табуляций в тексте пробелами.

Удовольствие от решения задач можно получить только если решаешь задачи красиво.
Красиво (на мой вкус) - это без переменных, т.е. когда все данные, которыми
оперирует алгоритм присутствуют только на стеке, причем располагать их на
стеке нужно так, чтобы не приходилось их изымать по PICK или вращать по ROLL.
Ибо PICK и ROLL - это некрасиво.
Код:
Входной текст расположен с адреса c-addr1 и он длиной u1.
c-addr2 - адрес буфера для приёма преобразованного текста.
u2 - длина получившегося преобразованного текста

HEX
8 VALUE ОТСТУП

: TABS>SPACES ( c-addr1 c-addr2 u1 - c-addr2 u2 )
  OVER >R 2>R 0 SWAP 2R>
  0 ?DO
    OVER C@ ROT CHAR+ >R 2>R
    R@ 9 =
    IF
      RDROP BEGIN
        1+ BL R@ C! R> CHAR+ >R
        DUP ОТСТУП MOD 0=
      UNTIL 2R>
    ELSE
      R@ D = R@ A = OR IF DROP TRUE THEN
      1+ R> R@ C! 2R> CHAR+
    THEN
  LOOP
  NIP NIP R> TUCK -
;
Входные параметры тут как у CMOVE CMOVE> MOVE , а выходные готовы для TYPE

Автор:  chess [ Пн июл 25, 2011 08:06 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

Табуляции заменяются на 8-мь пробелов, рез. строка помещается во временный буфер

Код:
: tabs>spaces ( src us tab# --> res ur )
  tab! us! src! ntab) 0. ntab ! sr!
  src us + as DO I C@ tab = IF ntab 1+! THEN LOOP
  ntab @ 7 * us + DUP ur! ALLOCATE THROW res!
  res ur + res DO BL I C! LOOP
  src us + src DO I C@ DUP tab = IF  DROP 8  ELSE res sr + C! 1 THEN sr + is sr LOOP
  res ur ;

Ps. Решение тривиальное, не требует отладки и не дает никакого удовольствия. :)

Автор:  Ethereal [ Пн июл 25, 2011 09:22 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

Так табуляции должны заменяться не на 8 пробелов, а на от одного до восьми пробелов (точнее от одного до ОТСТУП пробелов, согласно условию mOleg-а) в зависимости от позиции в которой встретилась табуляция.

З.Ы. Видимо я один такой. Если программирование не даёт удовольствия, то зачем тогда вообще программировать ? Я когда пишу программы на ассемблере не прекращаю оптимизацию пока программу можно ужать ещё хотя бы на байт. Когда уже никак не ужимается, то начинает так переть от того кода который сотворил, так переть, аж в зобу дыхание спирает. Только поэтому программированием и занимаюсь. Код получается такой, что в нём ничего стронуть нельзя - сразу всё развалится. Один кусок программы использует побочные эффекты другого и всё так переплетено друг с другом, что невыносимо как для прочтения так и для модификации (кем-либо кроме меня). Зато так прёт ! Так прёт ! ;)
Помню давно уже одна местная организация сделала программу на Клиппере, а на компьютере заказчика она как начнет делить на ноль... Выяснилось, что на медленных компьютерах программа работает, а на быстрых - Divide by Zero. Ну не посоветуешь-же заказчику купить более медленный компьютер. И вот тогда они мне заказали написать патчилку ко всем своим программам на Клиппере. И я тогда за эту работу попросил по рублю за байт моей программы. Согласились, однако. Знали уже, что будет написано на ассемблере и пока ещё можно хотя-бы байт умять, я не успокоюсь. ;)
Ещё помню как в GoldWafer уминал алгоритм который в него вроде бы невозможно вогнать в принципе. На уминание последних десяти слов ушла неделя, причем самое последнее слово я искал как вогнать в адресное пространство GoldWafer-а аж два дня. Но таки вогнал. И до сих пор прусь. И люди этим программистским безумием долго пользовались. ;)

Автор:  chess [ Пн июл 25, 2011 14:27 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

Ethereal писал(а):
Так табуляции должны заменяться не на 8 пробелов, а на от одного до восьми пробелов (точнее от одного до ОТСТУП пробелов, согласно условию mOleg-а) в зависимости от позиции в которой встретилась табуляция.

Ага, оказывается я не знал что такое табуляция(никогда не пользовался). Сейчас знаю.
Программа немного усложнилась из-за фиксации начала строк.
Код:
\ Табуляции заменяются на от 1-8-мь пробелов, рез. строка помещается во временный буфер
: tabs>spaces ( src us tab# --> res ur )
  tab! us! src! ntab) 0. ntab ! sr! 0 os!
  src us + src DO   I C@ tab = IF ntab 1+! THEN LOOP
  ntab @ 7 * us + DUP ur! ALLOCATE THROW res!
  res ur + res DO BL I C! LOOP
  src us + src DO I C@ DUP tab =
                  IF DROP 8 os 8 MOD - DUP sr + is sr os + is os
                  ELSE 0xA 0xD 3\112=13=| IF -1 is os THEN
                       res sr + C! sr 1+ is sr os 1+ is os
                  THEN LOOP res sr 1- ;
Ethereal писал(а):
З.Ы. Видимо я один такой. Если программирование не даёт удовольствия, то зачем тогда вообще программировать ?

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

Автор:  dynamic-wind [ Пн июл 25, 2011 18:54 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

chess писал(а):
Ага, оказывается я не знал что такое табуляция(никогда не пользовался). Сейчас знаю.

:mrgreen:

Автор:  вопрос [ Пн июл 25, 2011 21:26 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

dynamic-wind писал(а):
chess писал(а):
Ага, оказывается я не знал что такое табуляция(никогда не пользовался). Сейчас знаю.

:mrgreen:

Забавно, что задача при этом всё-таки была решена :shock:

Автор:  chess [ Пн июл 25, 2011 21:33 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

вопрос писал(а):
Забавно, что задача при этом всё-таки была решена

Решена путем замены символа табуляции на 8 символов пробелов. Именно так я понимал табуляцию. :(

Автор:  Ethereal [ Сб авг 13, 2011 06:33 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

Хорошо, тогда я предложу самое оригинальное решение данной задачи.
Самое оригинальное в смысле краткости. Но не на Форте. Ибо на Форте
такую задачу решать - все равно, что гвозди микроскопом заколачивать.

Возьмите вот эти байты :

B4 0B CD 21 84 C0 74 0B B4 07 CD 21 92 B4 02 CD
21 EB ED C3

и преобразуйте их в двоичный файл. Пусть он называется tb2sp.com

Теперь проделайте в Виндозной (MS-DOS-совместимой) среде :

type file1.txt | tb2sp.com > file2.txt

и вуаля ... табуляции текста из файла file1.txt преобразованы в пробелы
и результат находится в файле file2.txt

Решение заняло ... 20 байт кода !
Как говориццо даешь короче ! :D

Причем, я сам не понимаю почему так получается. Просто обнаружил, что на вход
фильтра текст подается операционкой уже наготово с табуляциями преобразованными
в пробелы. Осталось только написать фильтр который ничего не делает. Главное,
чтобы был сам фильтр. Вот этот фильтр и получился длиной 20 байт.

Автор:  вопрос [ Сб авг 13, 2011 12:58 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

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

Возможно, это не во всех случаях так
Ethereal писал(а):
Удовольствие от решения задач можно получить только если решаешь задачи красиво.
вот эту никто не взялся
а эта : Нерешительный кенгуру
решена только на словах (Хищником) и на Прологе

Автор:  dynamic-wind [ Сб авг 13, 2011 19:31 ]
Заголовок сообщения:  Re: *преобразование табуляций в тексте

Ethereal писал(а):
Теперь проделайте в Виндозной (MS-DOS-совместимой) среде :

type file1.txt | tb2sp.com > file2.txt

и вуаля ... табуляции текста из файла file1.txt преобразованы в пробелы
и результат находится в файле file2.txt

Решение заняло ... 20 байт кода !
Как говориццо даешь короче ! :D

Линукс:
expand < file1.txt > file2.txt

Страница 3 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/