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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - преобразование строкового представления угла вида 12°12'12"
Автор Сообщение
  Заголовок сообщения:  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 )
Сообщение Добавлено: Ср май 22, 2013 21:59
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
Alex писал(а):
кажется chess как-то назвал подобное - символьными вычислениями над строками.
беглый обзор по интернетам показал, что самая подходящая библиотечка это
strings от VoidVolker, найти можно на форуме nncron. А на нашем форуме
к сожалению не было презентации этой замечательной либы :(
VoidVolker а Вы еще занимаетесь этой либой?

Конечно занимаюсь - просто некогда. Она пока в статусе беты, есть несколько непринципиальных багов и моментов, которые надо переделать. Предназначена как раз для всяких смешанных операций со строками, числами, переменными и прочим.
Alex писал(а):
встроить бы туда макроподстановку символа на строку, и строку на символ (как некие действия над SPAD-ом).

Как бы есть:
Код:
" Текст из кода: %<любой форт код без двойной кавычки>% Еще какой-то текст."

А если заглянуть внутрь, то можно найти код для добавления любой реакции на любую последовательность символов.
Сообщение Добавлено: Ср май 22, 2013 08:23
  Заголовок сообщения:  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-ом).
Сообщение Добавлено: Ср май 22, 2013 08:04
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
Alex писал(а):
можно заметить, что запись немного напоминает стековые манипуляторы.
Думаю, если не заморачиваться построением универсального конвертера "на всякий случай", а решать задачу "по месту", удастся ограничиться "обычными" словами: "градусы", "минуты-секунды" и т.д.
Сообщение Добавлено: Пн май 20, 2013 19:04
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
Да, или так.
Сообщение Добавлено: Пн май 20, 2013 18:25
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
Да Вы правы, можно проще, в исходном строковом представлении угла
сделать замену символов на подстроки:

на стек 0 ( или дописать 0 с пробелом перед началом строки)
° -> <пробел>3600<пробел>*<пробел>+<пробел>
' -> <пробел>60<пробел>*<пробел>+<пробел>
" -> <пробел>+<пробел>

а затем просто EVALUATE полученную строку
Сообщение Добавлено: Пн май 20, 2013 17:13
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
VoidVolker писал(а):
Не? А еще можно без всех этих кружочков, апострофов и кавычек просто написать три числа.

конечно проще, а еще проще вообще только бинарные числа писать, скажем, надо 10 набрать, набираем 1010, подумаешь, в уме числа в двоичную систему из любой другой переводить! зато просто 8)
Углы читают люди, более того, люди не имеющие понятия на каком языке написана программа, более того, программа не одна, а с десяток. И данных не одна две строчки, а мегабайты.
VoidVolker писал(а):
зачем так все усложнять-то?


VoidVolker писал(а):
0x как-то привычнее, а hex - переключение системы счисления.

я иллюстрирую смысл, можно и так: 0x 2E3BA9 (главное пробел не забыть 8)
Сообщение Добавлено: Пн май 20, 2013 14:32
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
mOleg писал(а):
можно, но нужно учесть, что полная запись 12°12'12" часто не нужна, удобно, скажем 12°12" или 12'12" так же как и 12", 12'

Код:
ms>s gm>s

Не? А еще можно без всех этих кружочков, апострофов и кавычек просто написать три числа. Вообще, ничего против топика не имею, отвечал на сообщение Alex'а. Я вот к чему: зачем так все усложнять-то?
mOleg писал(а):
Мне нравится вариант, когда перед числом находится префикс: Hex 3AE9 Oct 654

ИМХО, 0x как-то привычнее, а hex - переключение системы счисления.
Сообщение Добавлено: Пн май 20, 2013 14:25
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
Alex писал(а):
Если внимательно посмотреть на строковое представление угла 12°12'12"то можно заметить, что запись немного напоминает стековые манипуляторы.

вообще, было бы интересно увидеть реализацию манипулятора 8)

Alex писал(а):
подключить его можно как и у Олега через словарь, или например запускать егопредварительно проверив входную строку на корректность регулярным выражением

это вторично вобщем-то.
Мне нравится вариант, когда перед числом находится префикс:
Hex 3AE9
Oct 654
или в нашем случае:
Alp 12°12'12"

VoidVolker писал(а):
А если просто посмотреть, то можно увидеть три числа, два из них надо умножить на константы и прибавить третье:

можно, но нужно учесть, что полная запись 12°12'12" часто не нужна, удобно, скажем 12°12" или 12'12" так же как и 12", 12'
Сообщение Добавлено: Пн май 20, 2013 14:15
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
Эмм... А если просто посмотреть, то можно увидеть три числа, два из них надо умножить на константы и прибавить третье:
Код:
: gms>s   \ ( a u - n )
  2DUP OVER + SWAP DO
    I C@ 0x30 0x40 WITHIN 0= IF 0x20 I C! THEN
  LOOP
  EVALUATE ROT 3600 * ROT 60 * + +
;
Сообщение Добавлено: Пн май 20, 2013 13:16
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
Если внимательно посмотреть на строковое представление угла 12°12'12"
то можно заметить, что запись немного напоминает стековые манипуляторы.
А в них символ 0..9 означает положить на стек значение соответствующей ячейки.
По аналогии можно построить следующий алгоритм преобразования строкового
представления угла в секунды. Есть заранее отведенные и заполненные 7 массивов
из 10 ячеек двойной длины. массив единиц секунд заполнен значеничями 0,1,2,,9
следующий массив десятков секунд заполнен 0,10,20,,50(здесь используется
только 6 элементов массива). Массив единиц минут заполнен значениями 0,60,120,,540
массив десятков минут надо заполнить 6 елементов 0,600,1200,,3000.
массив единиц градусов - 0,3600,7200,,32400, массив десятков градусов - 0,36000,72000,,324000
ну и последний массив сотен градусов нужно заполнить 4 элемента 0,360000,720000,1080000
пусть массив единиц секунд будет массив номер 1, а массив сотен градусов - массив номер 7.
сканировать строковое представление угла будем от последнего символа строки к первому.
казалось бы мусорные символы ° ' " у нас будут выполнять полезную функцию -
принудительную установку номера текущего массива. символ " устанавливает текущий
массив в 1 (массив единиц секунд), символ ' устанавливает текущий массив в 3 (массив
единиц градусов), символ ° устанавливает текущий массив в 5 (единицы градусов)
символы 0..9 означают что надо выбрать из текущего массива элемент с индексом 0..9,
просуммировать и увеличить номер текущего массива на еденицу. Всего надо сложить
до 7 чисел. Вот такой получился манипуляторный преобразователь строкового представления угла.
подключить его можно как и у Олега через словарь, или например запускать его
предварительно проверив входную строку на корректность регулярным выражением.
Сообщение Добавлено: Пн май 20, 2013 12:26
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
mOleg писал(а):
заявленных регулярных выражений в коде не наблюдается
А он был заявлен? Было заявлено решение, основанное на конечном автомате. Написать код постройки конечного автомата на основе регулярного выражения? Я же не прошу Вас привести код, пишущий Ваши Case-ы...
Вы действительно не понимаете, что нарисовать конечный автомат по регулярному выражению, это элементарное действие?

Или, все-таки, вечер пятницы?
Сообщение Добавлено: Пт май 17, 2013 21:56
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
gudleifr писал(а):
Не понял смысла наезда.

не вижу желания с вашей стороны нормально общаться, увы.
На просьбы предоставить нормальный код отделываетесь отговорками, по ссылке не видно использования регулярных выражений (за что я собственно и зацепился), на просьбу опубликовать ваш код на этом форуме видны только отговорки (оно и понятно, заявленных регулярных выражений в коде не наблюдается).
Сообщение Добавлено: Пт май 17, 2013 21:36
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
mOleg писал(а):
вобщем, я так понимаю, слив засчитан.
Не понял смысла наезда. Вы что-то не поняли? Не нашли исходников? Просто, на что-то обиделись?
Сообщение Добавлено: Пт май 17, 2013 21:28
  Заголовок сообщения:  Re: преобразование строкового представления угла вида 12°12'  Ответить с цитатой
gudleifr писал(а):
По продолжающимся просьбам добавил реализацию на Win32Forh.


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

вобщем, я так понимаю, слив засчитан.
Сообщение Добавлено: Пт май 17, 2013 21:23

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


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