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. Входные параметры тут как у CMOVE CMOVE> MOVE , а выходные готовы для TYPE
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 - ; |
Автор: | 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 писал(а): Ага, оказывается я не знал что такое табуляция(никогда не пользовался). Сейчас знаю. |
Автор: | вопрос [ Пн июл 25, 2011 21:26 ] |
Заголовок сообщения: | Re: *преобразование табуляций в тексте |
dynamic-wind писал(а): chess писал(а): Ага, оказывается я не знал что такое табуляция(никогда не пользовался). Сейчас знаю. Забавно, что задача при этом всё-таки была решена |
Автор: | 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 и преобразуйте их в двоичный файл. Пусть он называется tb2sp.com Теперь проделайте в Виндозной (MS-DOS-совместимой) среде : type file1.txt | tb2sp.com > file2.txt и вуаля ... табуляции текста из файла file1.txt преобразованы в пробелы и результат находится в файле file2.txt Решение заняло ... 20 байт кода ! Как говориццо даешь короче ! Причем, я сам не понимаю почему так получается. Просто обнаружил, что на вход фильтра текст подается операционкой уже наготово с табуляциями преобразованными в пробелы. Осталось только написать фильтр который ничего не делает. Главное, чтобы был сам фильтр. Вот этот фильтр и получился длиной 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 байт кода ! Как говориццо даешь короче ! Линукс: expand < file1.txt > file2.txt |
Страница 3 из 3 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |