Forth
http://fforum.winglion.ru/

Оставить среднее
http://fforum.winglion.ru/viewtopic.php?f=19&t=2805
Страница 1 из 6

Автор:  chess [ Чт фев 09, 2012 10:43 ]
Заголовок сообщения:  Оставить среднее

На стеке три числа. Написать слово, оставляющее на стеке среднее из них по величине, или ничего не оставляющее, если среднего нет. Среднее число должно удовлетворять требованию: оно больше одного и меньше другого остальных чисел.
Код:
: middle ( a b c -- middle | _ ) ... ;
Примечание: символ _ означает здесь, что a b c убираются со стека в случае отсутствия среднего.
Например:
2 1 3 middle ( 2 )
5 2 5 middle ( _ )

Автор:  dynamic-wind [ Чт фев 09, 2012 10:56 ]
Заголовок сообщения:  Re: Оставить среднее

Зачем писать слово с бессмысленным интерфейсом?

Автор:  chess [ Чт фев 09, 2012 10:59 ]
Заголовок сообщения:  Re: Оставить среднее

dynamic-wind писал(а):
Зачем писать слово с бессмысленным интерфейсом?

В чем бессмысленность? В том, что есть вариант, когда на стеке ничего не остается?
Ну для форта это не такая уж и бессмысленность.

Автор:  Alex [ Чт фев 09, 2012 11:16 ]
Заголовок сообщения:  Re: Оставить среднее

используя стековые манипуляторы:
Код:
: middle ( a b c -- middle | _ )  3\12>13<&i1;t12<13>&i1;t21>23<&i2;t23>21<&i2;t31>32<&i3;t31<32>&i3;t ;

Автор:  chess [ Чт фев 09, 2012 11:23 ]
Заголовок сообщения:  Re: Оставить среднее

Alex писал(а):
используя стековые манипуляторы:

Ну со стековыми манипуляторами-то :) каждый сможет. Кстати и с ними можно и попроще:
Код:
: middle ( a b c -- m | _ )  3|123mm`1+123MM  5\145Hi1t245Hi2t345Hi3t ;

Автор:  dynamic-wind [ Чт фев 09, 2012 11:42 ]
Заголовок сообщения:  Re: Оставить среднее

chess писал(а):
dynamic-wind писал(а):
Зачем писать слово с бессмысленным интерфейсом?

В чем бессмысленность?

В том, что стек по выходе может быть на разных уровнях, и непонятно, уровней удалило это слово.

Автор:  chess [ Чт фев 09, 2012 12:03 ]
Заголовок сообщения:  Re: Оставить среднее

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

В форте это не проблема. В нем можно организовать контроль заполненности стека( с помощью DEPTH).
Если изначально DEPTH дает n, а после процедуры n-2 или n-3, то понятно, что в первом случае есть среднее, а во втором - нет.
Поэтому информация не теряется, просто она передается по-другому.
Вообще одна и та же процедура может оставлять разное количество параметров на стеке в зависимости от ситуации. Само количество выходных параметров тоже может рассматриваться как параметр.
Это особенность форта. Не надо эту особенность рассматривать как недостаток.

Автор:  dynamic-wind [ Чт фев 09, 2012 12:12 ]
Заголовок сообщения:  Re: Оставить среднее

Полслушайте хотя бы муровцев: http://www.ultratechnology.com/mfp21.htm

Цитата:
Stacks are in on chip stack registers in real stacks. Therefor the old Forth word DEPTH isn't applicable. In fact implemening it in one ANS Forth port direclty to Machine took fit everything but DEPTH in eForth 1.0 in 1K words and DEPTH took much of another 1K.

DEPTH is a sign that a program that has lost control, it has lost count of what is on the stack so it is already out of control.

"Stay out of the DEPTH."


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

Автор:  chess [ Чт фев 09, 2012 12:36 ]
Заголовок сообщения:  Re: Оставить среднее

dynamic-wind писал(а):
Учебная (и даже не учебная) задачка не должна поощрять дурной стиль программирования, я считаю.

Не дурной стиль это по вашему запретить создание процедур, которые могут выдавать разное количество параметров на выходе?
Скажем для данной задачи изменить условие так:
Если есть среднее, то выдать среднее и TRUE, если нет среднего, то выдать FALSE FALSE(на стеке всегда два параметра).
Могу только сказать, что для фортера это все и так понятно и то, что вы называете дурным, таковым не является.

Автор:  Alex [ Чт фев 09, 2012 13:25 ]
Заголовок сообщения:  Re: Оставить среднее

тот же тупой перебор вариантов, с локальными переменными:
Код:
: mid ( a b c -- m | _ ) DUP >R < SWAP R@ > AND IF R> THEN RDROP ;

: middle { a b c -- } ( middle | _ )
  a b c mid        a c b mid       b c a mid
  b a c mid        c a b mid       c b a mid
;

Автор:  gudleifr [ Чт фев 09, 2012 14:17 ]
Заголовок сообщения:  Re: Оставить среднее

Раз уж высасывать примеры из пальца, то почему чисел не 117?

Автор:  chess [ Чт фев 09, 2012 14:27 ]
Заголовок сообщения:  Re: Оставить среднее

gudleifr писал(а):
Раз уж высасывать примеры из пальца, то почему чисел не 117?

Для чисел в количестве больше 3-х(пусть их даже и нечетное число) определить понятие 'среднее' сложнее. :)

Автор:  gudleifr [ Чт фев 09, 2012 14:31 ]
Заголовок сообщения:  Re: Оставить среднее

chess писал(а):
Для чисел в количестве больше 3-х(пусть их даже и нечетное число) определить понятие 'среднее' сложнее.
Самое близкое к среднему арифметическому или, наоборот, число превышающих равно числу превышаемых. :)
Какая разница, если задача абстрактная?

Автор:  chess [ Чт фев 09, 2012 14:48 ]
Заголовок сообщения:  Re: Оставить среднее

gudleifr писал(а):
Самое близкое к среднему арифметическому или, наоборот, число превышающих равно числу превышаемых.
Какая разница, если задача абстрактная?

В этом случае могут появиться несколько 'средних', а по задаче нужно только одно. Если считать, что средних может быть только
одно, то пойдет. Но в этом случае, однако, результата можно не дождаться из-за большого времени счета.

Автор:  mOleg [ Чт фев 09, 2012 15:19 ]
Заголовок сообщения:  Re: Оставить среднее

вообще, речь в данном случае о медианном среднем значении, оно может находиться для любого количества чисел, вот только, если все числа одинаковые, не понятно, зачем его не возвращать-то?

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