Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Сб апр 20, 2024 03:35

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: * поиск похожих имен слов
СообщениеДобавлено: Ср окт 24, 2007 20:30 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
в верхнем контекстном словаре (CONTEXT) словаре найти все имена слов, отличающиеся в одной букве (то есть похожие слова).
слова могут отличаться по длинне (на один символ) либо по содержимому (в одной символьной позиции). Строки состоят из однобайтовых ascii символов. Длина строк сверху ограничена 64 символами.
<pre>
\ для заданного слова asc # найти все слова в верхнем контекстном словаре, отличающиеся от заданного слова в одной
\ символьной позиции. Результат вывести на экран.
: similar ( asc # --> )

;
</pre>

пример:
S" DROP" similar

должен "узнать" и RDROP и 2DROP и DROP2 и более короткие трехсимвольные варианты (если таковые имеются)

то есть:
S" 2DROP" обязан "опознать" DROP как похожее слово


Последний раз редактировалось mOleg Пт окт 26, 2007 03:01, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт окт 25, 2007 10:45 
Не в сети
Аватара пользователя

Зарегистрирован: Вт сен 11, 2007 11:07
Сообщения: 187
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
я так понимаю, что-то вроде такого: http://en.wikipedia.org/wiki/Levenshtein_distance
похожими будут слова с "дистанцией" 1 и меньше?
______________________________________________________________________________________
приведенный псевдокод не является вашим, и не относится к решению на языке форт, поэтому удален.
mOleg.
______________________________________________________________________________________
а я не утверждал, что он мой, поэтому обвинение в плагиате мимо кассы.
со всем остальным согласен...
garbler.
______________________________________________________________________________________
обвинения в плагиате не предъявлялось 8)


Последний раз редактировалось garbler Пт окт 26, 2007 11:08, всего редактировалось 1 раз.

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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
С одним недостающим знаком показалось непрактичным, сделал вывод слов, содержащих искомое слово.
Код:
REQUIRE {  lib\ext\locals.f
REQUIRE LIKE ~pinka\lib\like.f

: similar { aa uu \ [ 66 ] tb }
  CONTEXT @ @
  BEGIN
    DUP KEY? 0= AND
  WHILE
    DUP DUP >R COUNT [CHAR] * tb C! aa tb 1+ uu CMOVE [CHAR] * tb 1+ uu + C!
    tb uu 2+ LIKE IF R> ID. SPACE ELSE RDROP THEN
    CDR
  REPEAT DROP
;

\ EOF

: DROP2 NIP ;

STARTLOG
S" DROP" similar
ENDLOG

лог
Код:
DROP2 RDROP DROP-EXC-HANDLER FDROP C-RDROP 2DROP DROP

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


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

Зарегистрирован: Вт мар 20, 2007 23:39
Сообщения: 1261
Благодарил (а): 3 раз.
Поблагодарили: 19 раз.
chess писал(а):
сделал вывод слов, содержащих искомое слово.

Есть плагин для ннКрона со консольным словом WORDS-LIKE делающем то же самое, сам часто пользуюсь:
http://www.nncron.ru/download/plugins/tools.spf
Код:
\ File:         tools.spf
\ Author:       Nicholas Nemtsev
\ Date:         14.07.2002
\ Description:  Console tools
\ Usage: WORDS-LIKE piece-of-word
\        TASKS
\ Modified: 14.07.03
\   new words: TABS TASK-DELETE TDEL TADD

C" CRON-TOOLS" FIND NIP [IF] CRON-TOOLS [THEN]

MARKER CRON-TOOLS

: WORDS-LIKE ( -- )
  BL WORD COUNT 2>R
  CONTEXT @ @
  BEGIN
    ?DUP
  WHILE
    DUP COUNT 2R@ SEARCH NIP NIP
    IF
       DUP ID. SPACE
    THEN
    CDR
  REPEAT
  2R> 2DROP
  CR
;

_________________
Cтоимость сопровождения программного обеспечения пропорциональна квадрату творческих способностей программиста.
Роберт Д. Блисc


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт окт 26, 2007 01:27 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
лог

Код:DROP2 RDROP DROP-EXC-HANDLER FDROP C-RDROP 2DROP DROP

chess писал(а):
С одним недостающим знаком показалось непрактичным, сделал вывод слов, содержащих искомое слово.

решение не верное. различие возможно лишь в одном знакоместе! речь не шла о поиске подстроки, так как это совсем другое решение!

VoidVolker писал(а):
Есть плагин для ннКрона со консольным словом WORDS-LIKE делающем то же самое, сам часто пользуюсь:

http://www.nncron.ru/download/plugins/tools.spf

то же самое. поиск подстроки это совсем другое задание, и о нем не шло речи.

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт окт 26, 2007 01:30 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
garbler писал(а):
я так понимаю, что-то вроде такого: http://en.wikipedia.org/wiki/Levenshtein_distance
похожими будут слова с "дистанцией" 1 и меньше?

типа того. ТЗ приведено в первом посте, начинающим данную треду.
отличие в том, что учитывается длина похожих строк.
скорее речь идет о чуточку модифицированном "Расстоянии Хемминга".
http://ru.wikipedia.org/wiki/Расстояние_Хэмминга

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Вопрос к ТЗ по этой задаче:
Если под символом "?" понимать любой ASCII-символ, в том числе и сам символ "?", то
для слова DUP должны быть найдены следующие слова (и только они):
Код:
?DUP D?UP DU?P DUP? ?UP(здесь "?"-не включает D)  D?P(без U) DU?(без P) UP DP DU

Если это не так, то нужно дополнить или сократить приведенную последовательность слов до корректной для этой задачи.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт окт 26, 2007 18:17 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Не дождавшись ответа от ТЗ-дателя...
Код:
REQUIRE LIKE ~pinka\lib\like.f

0 VALUE a 0 VALUE u 0 VALUE sm 0 VALUE CA-WORD  CREATE am 65 ALLOT

: WORD. CA-WORD COUNT 2SWAP LIKE IF a u CA-WORD COUNT LIKE FALSE = IF CA-WORD ID. CR THEN THEN ;
: cut    u 0  DO 0 TO sm u 0 DO I J = IF 1 TO sm ELSE a I + C@ am I + sm - C! THEN LOOP am u 1- WORD. LOOP ;
: paste  u 0  DO 0 TO sm u 1+ 0 DO I J = IF [CHAR] ?  ELSE a I + C@ THEN am I + C! LOOP am u  WORD. LOOP ;
: insert u 1+ 0 DO 0 TO sm u 1+ 0 DO I J = IF [CHAR] ? 1 TO sm ELSE a I + sm - C@  THEN am I + C! LOOP am u 1+ WORD. LOOP ;

: similar TO u TO a CONTEXT @ @ BEGIN DUP WHILE DUP TO CA-WORD cut paste insert CDR REPEAT DROP ;

\ EOF
STARTLOG
S" DUP" similar
ENDLOG

ЛОГ

?DUP
DP
DUMP
FDUP
2DUP

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 27, 2007 01:31 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
Вопрос к ТЗ по этой задаче:
Если под символом "?" понимать любой ASCII-символ, в том числе и сам символ "?", то
для слова DUP должны быть найдены следующие слова (и только они):
Код:?DUP D?UP DU?P DUP? ?UP(здесь "?"-не включает D)  D?P(без U) DU?(без P) UP DP DU
Если это не так, то нужно дополнить или сократить приведенную последовательность слов до корректной для этой задачи.

не совсем верно. Все символы должны оставаться на своих местах. Различие может быть только в один символ!
то есть DUP: ?DUP 2DUP DUP2 DOP DU UP и другие варианты без смещения

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 27, 2007 01:42 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
Не дождавшись ответа от ТЗ-дателя...

8) получилось немного круче, чем надо.
жаль, что совсем без коментариев код 8(

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб окт 27, 2007 02:42 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
а вот и мой пример.
Написано для SPF4.18, обновлений с cvs не нужно.
Как всегда использование внешних либ по минимуму, если возможно ;)

Код:
\ 24-10-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ задачка с конкурса форума http://fforum.winglion.ru/index.php
\ http://fforum.winglion.ru/viewtopic.php?t=994

\ В верхнем контекстном словаре (CONTEXT) словаре найти все имена
\ слов, отличающиеся в одной букве (то есть похожие слова). Cлова
\ могут отличаться по длинне (на один символ) либо по содержимому
\ (в одной символьной позиции).

\ удалить с вершины стека указанное число параметров
\ если нужен контроль переопустошения стека раскоментировать содержимое скобок
: nDrop ( [ .. ] n --> ) 1 + CELLS SP@ + ( S0 @ MIN) SP! ;

\ добавить указанное число, к находящемуся на вершине стека возвратов
: R+ ( r: a d: b --> r: a+b ) 2R> -ROT + >R >R ;

\ сравнить два символа, находящихся по указанным адресам
\ вернуть указатели, смещенные на один символ вправо, и флаг
: (comp) ( 'asc1 'asc2 --> 'asc1++ 'asc2++ flag )
         2DUP 1 1 D+
         2SWAP C@ SWAP C@ = ;

\ сравнить две строки одинаковой длины,
\ выдать true, если различие не более, чем в один символ
: ?like ( asc1 asc2 # --> flag )
        >R BEGIN R@ WHILE
                 -1 R+
                 (comp) WHILE
             REPEAT
               BEGIN R@ WHILE   \ чтобы не возиться со счетчиком несовпадений
                     -1 R+
                     (comp) WHILE
                 REPEAT
                   RDROP 2DROP FALSE EXIT
               THEN
           THEN
        RDROP 2DROP TRUE ;

\ содержит ли длинная строка короткую как подстроку?
: ?substr ( asc1 asc2 #2 #1 --> flag )
          2DUP < IF -ROT ELSE -ROT 2SWAP THEN
          SEARCH NIP NIP ;

\ сравнить две строки на похожесть
: ?resemble ( asc1 # asc2 # --> flag )
            ROT 2DUP - DUP
            IF -1 2 WITHIN
               IF ?substr
                ELSE 4 nDrop FALSE
               THEN
             ELSE 2DROP ?like
            THEN ;

\ для заданного слова asc # найти все слова в верхнем контекстном
\ словаре, отличающиеся от заданного слова в одной символьной
\ позиции. Результат вывести на экран.
: similar ( asc # --> )
          CONTEXT @ @ >R
          BEGIN R@ WHILE
                2DUP R@ COUNT ?resemble
                IF R@ ID. SPACE THEN
            R> CDR >R
          REPEAT RDROP 2DROP ;

\ ----------------------------------------------------------------------
S" LOOP" similar \ пример использования

: alll ( --> )
       CONTEXT @ @ >R
       BEGIN R@ WHILE
             CR R@ COUNT similar
         R> CDR >R
       REPEAT RDROP ;

\ для получения всех подобий в словаре FORTH наберите к командной строке
\ spf4.exe smp.f alll BYE >smp.log



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн окт 29, 2007 22:21 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
тестируем скорость работы.
написать заклинание spd.bat : spf4.exe %1 testspd.f test BYE >spd.log

следующий код копировать в testspd.f :
Код:

REQUIRE ?DEFINED       devel\~moleg\lib\util\ifdef.f
?DEFINED similar CR .( use: spd.bat sample.f |enter ) BYE

REQUIRE ResetProfiles  devel\~pinka\lib\Tools\profiler.f


: SIMILAR similar ;

: alll ( --> )
       CONTEXT @ @ >R
       BEGIN R@ WHILE
             CR R@ COUNT SIMILAR
         R> CDR >R
       REPEAT RDROP
       ;

: test  ResetProfiles alll alll alll CR CR .AllStatistic ;


дальше просто: spd.bat sample.f

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


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

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


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

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


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

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