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/