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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 85 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 10:43 
Не в сети
Аватара пользователя

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

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


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

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
Зачем писать слово с бессмысленным интерфейсом?


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
dynamic-wind писал(а):
Зачем писать слово с бессмысленным интерфейсом?

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 11:16 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
используя стековые манипуляторы:
Код:
: 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 ;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 11:23 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
Alex писал(а):
используя стековые манипуляторы:

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 11:42 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
chess писал(а):
dynamic-wind писал(а):
Зачем писать слово с бессмысленным интерфейсом?

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 12:03 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
dynamic-wind писал(а):
В том, что стек по выходе может быть на разных уровнях, и непонятно, уровней удалило это слово.

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

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


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

Зарегистрирован: Чт июн 25, 2009 11:12
Сообщения: 412
Благодарил (а): 41 раз.
Поблагодарили: 8 раз.
Полслушайте хотя бы муровцев: 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."


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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 12:36 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
dynamic-wind писал(а):
Учебная (и даже не учебная) задачка не должна поощрять дурной стиль программирования, я считаю.

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 13:25 
Не в сети

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
тот же тупой перебор вариантов, с локальными переменными:
Код:
: 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
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 14:17 
Раз уж высасывать примеры из пальца, то почему чисел не 117?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 14:27 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
Раз уж высасывать примеры из пальца, то почему чисел не 117?

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 14:31 
chess писал(а):
Для чисел в количестве больше 3-х(пусть их даже и нечетное число) определить понятие 'среднее' сложнее.
Самое близкое к среднему арифметическому или, наоборот, число превышающих равно числу превышаемых. :)
Какая разница, если задача абстрактная?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Чт фев 09, 2012 14:48 
Не в сети
Аватара пользователя

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
gudleifr писал(а):
Самое близкое к среднему арифметическому или, наоборот, число превышающих равно числу превышаемых.
Какая разница, если задача абстрактная?

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

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


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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 85 ]  На страницу 1, 2, 3, 4, 5, 6  След.

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


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

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


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

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