Forth
http://fforum.winglion.ru/

*найти все возможные комбинации букв внутри строки
http://fforum.winglion.ru/viewtopic.php?f=19&t=1127
Страница 2 из 2

Автор:  mOleg [ Чт янв 24, 2008 23:55 ]
Заголовок сообщения: 

garbler писал(а):
mOleg писал(а):garbler
спасибо за участие, но ваш код не полностью соответствует ТЗ 8( надо бы отсеивать уже встреченные комбинации.
а они и отсеиваются, тут как раз всё корректно, на каждом шаге рекурсии
символ каждого вида юзается только один раз. поскольку перестановки получаются
из набора символов всегда все и нет ограничения на порядок их следования
(перестановок), то достаточно просто хранить в хвосте нужные символы,
не обращая внимания на их порядок.

было бы идеально, если бы вы хоть чуть-чуть прокоментировали свой код 8)
(это у меня такое желание несбыточное есть 8)

Автор:  mOleg [ Пт янв 25, 2008 03:49 ]
Заголовок сообщения: 

white_TigR писал(а):
Код:CREATE SYMS 256 ALLOT
CREATE CODE  10 ALLOT
CREATE COUNT 10 ALLOT

прошу прощения, для какой системы данное решение?
если для СПФ, то не хватает какой-то либы 8(

Автор:  mOleg [ Пт янв 25, 2008 04:23 ]
Заголовок сообщения: 

garbler писал(а):
mOleg писал(а):
ничего, если я немного прокоментирую ваш код?
с удовольствием, буду только рад

garbler писал(а):
DUP 0 = IF 2DROP 0 EXIT THEN


на самом деле по мелочи, просто бросилось в глаза, лучше так:
DUP IFNOT NIP NIP EXIT THEN

либо, если ifnot в системе отсутствует:
DUP IF ELSE NIP NIP EXIT THEN

потому что флаги в форте дважды проявлять не стоит 8)

вопрос не принципиальный на самом деле, не счиатйте за замечание, а скорее за примечание ;)

Автор:  garbler [ Пт янв 25, 2008 11:18 ]
Заголовок сообщения: 

вопрос писал(а):
но алгоритм всё равно рекурсивный (конец строки - на самом деле начало)
Другое дело - я бы потребовал доказательство, не отсеиваются ли при этом "законные" строки, т.к. не всё меняется со всем


с доказательством сложнее, всегда завидовал людям, знающим математику.
проверить можно так: для всех вариантов всех строк, скажем, длиной
до 5-6 символов сгенерировать все перестановки (подменой cnotfind) в setb
и сгенерировать перестановки без дублей исходным алгоритмом в seta

далее:
1) должно выполняться условие первого рода - cat seta | sort | uniq == cat seta | sort
2) должно выполняться условие второго рода - cat seta | sort == cat setb | sort | uniq

вот такой вот регрессионный тест....

Автор:  garbler [ Пт янв 25, 2008 11:25 ]
Заголовок сообщения: 

mOleg писал(а):
white_TigR писал(а):
Код:CREATE SYMS 256 ALLOT
CREATE CODE  10 ALLOT
CREATE COUNT 10 ALLOT

прошу прощения, для какой системы данное решение?
если для СПФ, то не хватает какой-то либы 8(


это не для spf, но под ним запускается после пары корректировок

в начало записать это:
Код:
: CLS ; IMMEDIATE
: GOTOXY POSTPONE 2DROP ; IMMEDIATE
: PRINT BEGIN DUP C@ WHILE DUP C@ EMIT 1+ REPEAT DROP ;
: Recurs POSTPONE RECURSE ; IMMEDIATE


а в конец вот это:
Код:
S" aabcaaa" DROP variants . CR


а что это за система - надо тигру спрашивать :-)

Автор:  garbler [ Пт янв 25, 2008 11:41 ]
Заголовок сообщения: 

mOleg писал(а):
garbler писал(а):
DUP 0 = IF 2DROP 0 EXIT THEN


на самом деле по мелочи, просто бросилось в глаза, лучше так:
DUP IFNOT NIP NIP EXIT THEN

либо, если ifnot в системе отсутствует:
DUP IF ELSE NIP NIP EXIT THEN

потому что флаги в форте дважды проявлять не стоит 8)

вопрос не принципиальный на самом деле, не считайте за замечание, а скорее за примечание ;)


ммм.... это не совсем флаг был, скорее длинна строки, поэтому я так "шаблонно"
и написал. да, думаю, замена адекватная, как вариант ещё так можно:

Код:
?DUP IF .... ELSE 0 AND THEN ( или 0 NIP или DROP 0 )


просто я обычно коротким условием обрываю код сразу, чтобы не мешался,
не люблю глубокую вложенность структур управления, так что, вот он и второй
"шаблон".....

если говорить о флагах, то тогда лучше ещё и cnotfind переписать
с применением TRUE и FALSE

Код:
: (cnotfind) ( c s2 s1 --> t/f )
    TRUE -ROT ?DO OVER I C@ = IF FALSE AND LEAVE THEN LOOP NIP
;


p.s. 2all: кстати, очень рекомендую книгу
А.Шень "Программирование. Теоремы и задачи"
изумительная вещь!

p.p.s. код со всеми правками здесь

Автор:  VoidVolker [ Пт янв 25, 2008 11:42 ]
Заголовок сообщения: 

mOleg писал(а):
прошу прощения, для какой системы данное решение? если для СПФ, то не хватает какой-то либы 8(

garbler писал(а):
а что это за система - надо тигру спрашивать

Это же Кварк.

Автор:  white_TigR [ Сб янв 26, 2008 00:47 ]
Заголовок сообщения: 

угу. Кварк :))) Просто он как то ближе мне...

Автор:  mOleg [ Сб янв 26, 2008 13:17 ]
Заголовок сообщения: 

garbler писал(а):
просто я обычно коротким условием обрываю код сразу, чтобы не мешался,
не люблю глубокую вложенность структур управления, так что, вот он и второй
"шаблон".....

абсолютно правильное решение! 8) я тоже так всегда делаю.

white_TigR писал(а):
угу. Кварк ) Просто он как то ближе мне...

читаем правила 8)

Автор:  white_TigR [ Вс янв 27, 2008 01:27 ]
Заголовок сообщения: 

mOleg писал(а):
читаем правила


Цитата:
7) обязательно указание на форт-систему, для которой написан код; версию системы. В случае уникальности форт-системы обязательна прямая ссылка, по которой она может быть найдена.


Quark http://www.msyst.ru/quarkexe.zip

Автор:  Hishnik [ Вс янв 27, 2008 01:31 ]
Заголовок сообщения: 

Кварк - уникален... :))

Страница 2 из 2 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/