Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 21:37

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 40 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 06:46 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
О задаче про замену табуляций в тексте пробелами.

Удовольствие от решения задач можно получить только если решаешь задачи красиво.
Красиво (на мой вкус) - это без переменных, т.е. когда все данные, которыми
оперирует алгоритм присутствуют только на стеке, причем располагать их на
стеке нужно так, чтобы не приходилось их изымать по 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


Последний раз редактировалось Ethereal Пн июл 25, 2011 09:42, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 08:06 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Табуляции заменяются на 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. Решение тривиальное, не требует отладки и не дает никакого удовольствия. :)

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 09:22 
Не в сети
Аватара пользователя

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Так табуляции должны заменяться не на 8 пробелов, а на от одного до восьми пробелов (точнее от одного до ОТСТУП пробелов, согласно условию mOleg-а) в зависимости от позиции в которой встретилась табуляция.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 14:27 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
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 писал(а):
З.Ы. Видимо я один такой. Если программирование не даёт удовольствия, то зачем тогда вообще программировать ?

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 18:54 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
chess писал(а):
Ага, оказывается я не знал что такое табуляция(никогда не пользовался). Сейчас знаю.

:mrgreen:


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 21:26 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
dynamic-wind писал(а):
chess писал(а):
Ага, оказывается я не знал что такое табуляция(никогда не пользовался). Сейчас знаю.

:mrgreen:

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Пн июл 25, 2011 21:33 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
вопрос писал(а):
Забавно, что задача при этом всё-таки была решена

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

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


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

Зарегистрирован: Ср фев 23, 2011 20:42
Сообщения: 600
Откуда: Карелия
Благодарил (а): 3 раз.
Поблагодарили: 24 раз.
Хорошо, тогда я предложу самое оригинальное решение данной задачи.
Самое оригинальное в смысле краткости. Но не на Форте. Ибо на Форте
такую задачу решать - все равно, что гвозди микроскопом заколачивать.

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

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 байт.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Сб авг 13, 2011 12:58 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
Ethereal писал(а):
Причем, я сам не понимаю почему так получается. Просто обнаружил, что на входфильтра текст подается операционкой уже наготово с табуляциями преобразованнымив пробелы.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: *преобразование табуляций в тексте
СообщениеДобавлено: Сб авг 13, 2011 19:31 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
Ethereal писал(а):
Теперь проделайте в Виндозной (MS-DOS-совместимой) среде :

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

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

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

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


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

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


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

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


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

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