Forth http://www.fforum.winglion.ru/ |
|
преобразование строкового представления угла вида 12°12'12" http://www.fforum.winglion.ru/viewtopic.php?f=25&t=2929 |
Страница 5 из 5 |
Автор: | mOleg [ Пн май 20, 2013 14:32 ] |
Заголовок сообщения: | Re: преобразование строкового представления угла вида 12°12' |
VoidVolker писал(а): Не? А еще можно без всех этих кружочков, апострофов и кавычек просто написать три числа. конечно проще, а еще проще вообще только бинарные числа писать, скажем, надо 10 набрать, набираем 1010, подумаешь, в уме числа в двоичную систему из любой другой переводить! зато просто 8) Углы читают люди, более того, люди не имеющие понятия на каком языке написана программа, более того, программа не одна, а с десяток. И данных не одна две строчки, а мегабайты. VoidVolker писал(а): зачем так все усложнять-то? VoidVolker писал(а): 0x как-то привычнее, а hex - переключение системы счисления. я иллюстрирую смысл, можно и так: 0x 2E3BA9 (главное пробел не забыть 8) |
Автор: | Alex [ Пн май 20, 2013 17:13 ] |
Заголовок сообщения: | Re: преобразование строкового представления угла вида 12°12' |
Да Вы правы, можно проще, в исходном строковом представлении угла сделать замену символов на подстроки: на стек 0 ( или дописать 0 с пробелом перед началом строки) ° -> <пробел>3600<пробел>*<пробел>+<пробел> ' -> <пробел>60<пробел>*<пробел>+<пробел> " -> <пробел>+<пробел> а затем просто EVALUATE полученную строку |
Автор: | VoidVolker [ Пн май 20, 2013 18:25 ] |
Заголовок сообщения: | Re: преобразование строкового представления угла вида 12°12' |
Да, или так. |
Автор: | gudleifr [ Пн май 20, 2013 19:04 ] |
Заголовок сообщения: | Re: преобразование строкового представления угла вида 12°12' |
Alex писал(а): можно заметить, что запись немного напоминает стековые манипуляторы. Думаю, если не заморачиваться построением универсального конвертера "на всякий случай", а решать задачу "по месту", удастся ограничиться "обычными" словами: "градусы", "минуты-секунды" и т.д.
|
Автор: | Alex [ Ср май 22, 2013 08:04 ] |
Заголовок сообщения: | Re: преобразование строкового представления угла вида 12°12' |
Последний вариант можно подправить для читабельности и красоты Код: : градусы-в-секунды ( g->s ) 3600 * + ; : минуты-в-секунды ( m->s ) 60 * + ; : добавить-секунды ( +->s ) + ; ну и тогда после соответствующей подстановки получим форт-программу Цитата: вход: 12°12'12" волшебное-слово выход: 12 градусы-в-секунды 12 минуты-в-секунды 12 добавить-секунды Вот возможен еще один вариант (алгоритм): Цитата: mOleg писал: можно, но нужно учесть, что полная запись 12°12'12" часто не нужна, удобно, скажем 12°12" или 12'12" так же как и 12", 12' VoidVolker писал: Код: ms>s gm>s Не? входная строка 12°12'12" заменяем символы 0..9 на символ d, получаем dd°dd'dd" редуцируем повторные символы d°d'd", делаем замену d° -> g ; d' -> m ; d" -> s добавляем в конце суффикс >s Вот мы и получили имя слова, которое заменит во входной строке символы градусов, минут и секунд на пробелы и произведет расчет. кажется chess как-то назвал подобное - символьными вычислениями над строками. беглый обзор по интернетам показал, что самая подходящая библиотечка это strings от VoidVolker, найти можно на форуме nncron. А на нашем форуме к сожалению не было презентации этой замечательной либы VoidVolker а Вы еще занимаетесь этой либой? встроить бы туда макроподстановку символа на строку, и строку на символ (как некие действия над SPAD-ом). |
Автор: | VoidVolker [ Ср май 22, 2013 08:23 ] |
Заголовок сообщения: | Re: преобразование строкового представления угла вида 12°12' |
Alex писал(а): кажется chess как-то назвал подобное - символьными вычислениями над строками. беглый обзор по интернетам показал, что самая подходящая библиотечка это strings от VoidVolker, найти можно на форуме nncron. А на нашем форуме к сожалению не было презентации этой замечательной либы VoidVolker а Вы еще занимаетесь этой либой? Конечно занимаюсь - просто некогда. Она пока в статусе беты, есть несколько непринципиальных багов и моментов, которые надо переделать. Предназначена как раз для всяких смешанных операций со строками, числами, переменными и прочим. Alex писал(а): встроить бы туда макроподстановку символа на строку, и строку на символ (как некие действия над SPAD-ом). Как бы есть: Код: " Текст из кода: %<любой форт код без двойной кавычки>% Еще какой-то текст." А если заглянуть внутрь, то можно найти код для добавления любой реакции на любую последовательность символов. |
Автор: | chess [ Ср май 22, 2013 21:59 ] |
Заголовок сообщения: | Re: преобразование строкового представления угла вида 12°12' |
Первое, что пришло в голову ( "потоковое решение" ), сразу заработало без отладки(задачка очень проста). Подумав, можно убрать комбинаторику и сократить текст, за счет независимой обработки трех видов подстрок. Код: : NOTFOUND ( a u -- g m s ) u! a! 0. g! m! 0. s! n! 1 k! \ n - рез-т в минутах \ os - смещения символов ° ' " , если символа нет то смещение = 0 os( u 0 DO '°' I a + C@ = IF I is g THEN ''' I a + C@ = IF I is m THEN '"' I a + C@ = IF I is s THEN LOOP g m s ) \ sq - преобразование подстроки в число sq( DO a I + C@ '0' - k * n + is n k 10 * is k -1 +LOOP n 0 is n 1 is k ) 1 u 11 3\21>23<&Z os 3\1Z2Z3Z&& AND IF a u NOTFOUND EXIT THEN os 3600 60 5\1z2z3z&&iy1`1-[sq]4*1`1+2`1-[sq]5*2`1+3`1-[sq]++t_ 1z2z3Z&&iy1`1-[sq]4*1`1+2`1-[sq]5*+t_ 1z2Z3z&&iy1`1-[sq]4*1`1+3`1-[sq]+t_ 1z2Z3Z&&iy1`1-[sq]4*t_ 1Z2z3z&&iy2`1-[sq]5*2`1+3`1-[sq]+t_ 1Z2z3Z&&iy2`1-[sq]5*t_ 1Z2Z3z&&iy3`1-[sq]t ; \ тест STARTLOG 1°1'1" 1°1' 1°1" 1° 1'1" 1' 1" Log Код: Ok ( 3661 3660 3601 3600 61 60 1 ) Реализация предложения от Alex Код: gs: 3600 * ; ms: 60 * ; ds: + + ; ws: + ; \ процедуры преобразования градусов, минут в секунды : NOTFOUND ( a u -- s ) u! a! 0. sm! p! 0 c! 30 ns] sw( ns p + C! p 1+ is p ) \ процедура записи символов чисел и символов процедур в строку sp( BL sw sm '°' = IF 'g' sw 's' sw ELSE sm ''' = IF 'm' sw 's' sw THEN THEN BL sw ) sd( sm '°' = sm ''' = sm '"' = OR OR ) os( u 0 DO I a + C@ is sm sd IF sp c 1+ is c ELSE sm sw THEN LOOP ) \ преобразование исходной лексемы в строку для EVALUATE os c 0= IF a u NOTFOUND EXIT THEN \ собственно интерпретатор лексем c 3 = IF 'd' sw 's' sw ELSE c 2 = IF 'w' sw 's' sw THEN THEN BL sw ns p EVALUATE ; \ test STARTLOG 1°23'45" 23'45" 45"23' 45"1° лог Код: Ok ( 5025 1425 1425 3645 )
|
Страница 5 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |