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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 85 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Вс фев 12, 2012 00:34 
Не в сети

Зарегистрирован: Вт май 09, 2006 12:31
Сообщения: 3438
Благодарил (а): 5 раз.
Поблагодарили: 16 раз.
gudleifr писал(а):
Меньше чем три сравнения не получится, но арифметический IF я опять чуть не начал писать...

Да, три сравнения (мне привиделось, что мы ищем максимум)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Вс фев 12, 2012 01:01 
5 элементов:
Код:
: sort 2dup < if swap then ;
: mid sort >r sort >r sort >r sort r> r> r> sort >r sort >r sort r> r> sort >r sort r> sort ;
: equ? drop swap >r r@ = if rdrop 2drop 0 else r@ = if rdrop drop 0 else drop r> -1 then then ;
: middle-norm mid equ? ;
: middle-chess middle-norm drop ;


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 231
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
вот варианты переписанные с использованием локальных переменных
Код:
\ : middle-chess ( a b c -- m | _ )  3|123mm`1+123MM  5\145Hi1t245Hi2t345Hi3t ;
: middle-chess { a b c \ m M -- }   ( m | _ )
  a b c MIN MIN 1+ -> m   
  a b c MAX MAX -> M
  a m M WITHIN IF a EXIT THEN
  b m M WITHIN IF b EXIT THEN
  c m M WITHIN IF c EXIT THEN
;
\ : middle-alex  ( a b c -- m | _ )  3\12=13=23=||i;e12<13<&i23m;e12>13>&i23M;t1tt ;
: middle-alex { a b c -- } ( m | _ )
  a b = a c = b c = OR OR
  IF
    EXIT
  ELSE
    a b < a c < AND
      IF
        b c MIN EXIT
      ELSE   
        a b > a c > AND
           IF
             b c MAX EXIT
           THEN
          a
      THEN
  THEN
;


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Вс фев 12, 2012 13:18 
Из всего этого обсуждения можно сделать вывод: нужны не манипуляторы и/или локальные переменные, а, тупо, слова для формирования вспомогательных стеков (лент машины Тьюринга), например, в PAD. Это, действительно, даст выигрыш.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6341
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
Если еще вспомнить, что стек - не элемент поклонения, а рабочий инструмент, а данные все-таки чаще бывают в памяти...

Код:
CREATE DATA[] 3 CELLS ALLOT

: middle
  DATA[] !
  DATA[] 1 -TH !
  DATA[] 2 -TH !
 
  DATA[] @ DATA[] 1 -TH @ >
  DATA[] @ DATA[] 2 -TH @ < AND IF DATA[] @ THEN

  DATA[] @ DATA[] 1 -TH @ <
  DATA[] @ DATA[] 2 -TH @ > AND IF DATA[] @ THEN

  DATA[] 1 -TH @ DATA[] @ >
  DATA[] 1 -TH @ DATA[] 2 -TH @ < AND IF DATA[] 1 -TH @ THEN

  DATA[] 1 -TH @ DATA[] @ <
  DATA[] 1 -TH @ DATA[] 2 -TH @ > AND IF DATA[] 1 -TH @ THEN

  DATA[] 2 -TH @ DATA[] @ >
  DATA[] 2 -TH @ DATA[] 1 -TH @ < AND IF DATA[] 2 -TH @ THEN

  DATA[] 2 -TH @ DATA[] @ <
  DATA[] 2 -TH @ DATA[] 1 -TH @ > AND IF DATA[] 2 -TH @ THEN
;

2 3 4 middle .


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Вс фев 12, 2012 13:42 
Хищник писал(а):
данные все-таки чаще бывают в памяти...
В этом случае говорить о фиксированном числе элементов уже как-то совсем несерьезно.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6341
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
gudleifr писал(а):
В этом случае говорить о фиксированном числе элементов уже как-то совсем несерьезно.

Ну как задача поставлена, так я и решил :) А на большее число элементов я бы попросил четкую формулировку, что именно искать и как сравнивать.
1 2 2 2 3 - что оставить? 2 или ничего?
1 1 2 3 3 - а тут что?
Вобщем, когда будет понятно, как именно "трое играющих берут четыре фишки", тогда можно будет шевелиться. А это решение я привел только затем, чтобы можно было заметить, что там набран блок в две строки, а дальше он повторен копипастом еще 5 раз с заменой индексов и знаков сравнения.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Вс фев 12, 2012 13:53 
Хищник писал(а):
1 2 2 2 3 - что оставить? 2 или ничего? 1 1 2 3 3 - а тут что?
В первом случае - ничего, во втором - 2. См. выше мое решение для 5-ти элементов.
Если уж на то пошло, то последняя формулировка "среднего" по chess - уравнивание "меньшей" и "большей" полусумм - противоречит даже тому, что мы обсуждали для 3-х элементов.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6341
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
Код:
VARIABLE LESSER
VARIABLE GREATER
VARIABLE EQUAL
3 CONSTANT DATASIZE
CREATE DATA[] 2 , 3 , 4 ,
                         
: middle[]
  DATASIZE 0 DO
    0 LESSER !
    0 GREATER !
    0 EQUAL !
    DATASIZE 0 DO
      I J = NOT IF
        DATA[] J -TH @ DATA[] I -TH @ < IF 1 LESSER +! THEN
        DATA[] J -TH @ DATA[] I -TH @ > IF 1 GREATER +! THEN
        DATA[] J -TH @ DATA[] I -TH @ = IF 1 EQUAL +! THEN
      THEN
    LOOP
    LESSER @ GREATER @ = EQUAL @ 0 = AND IF DATA[] I -TH @ THEN
  LOOP
;

middle[] . 


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Вс фев 12, 2012 15:16 
Хищник писал(а):
...
И куда теперь прикажете вставить манипуляторы?


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6341
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
gudleifr писал(а):
И куда теперь прикажете вставить манипуляторы?

Эээ... в робота? :)


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

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
Эээ... в робота?


аха, пусть из клавиатуры информацию выбивает...
Ведь, как известно, вся информация находится в клавиатуре. Надо только уметь ее из клавиатуры выбивать...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Оставить среднее
СообщениеДобавлено: Вс фев 12, 2012 15:50 
Шутники...
Хищник писал(а):
Код:
VARIABLE LESSER
VARIABLE GREATER
VARIABLE EQUAL
3 CONSTANT DATASIZE
CREATE DATA[] 2 , 3 , 4 ,
...
Маленькое замечание:
LESSER + GREATER + EQUAL = DATASIZE - 1,
и второе: после нахождения одного решения перебор можно прекращать,
и третье: сортировка все равно быстрее.


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

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 6341
Благодарил (а): 14 раз.
Поблагодарили: 99 раз.
gudleifr писал(а):
Маленькое замечание:
LESSER + GREATER + EQUAL = DATASIZE - 1,
и второе: после нахождения одного решения перебор можно прекращать,
и третье: сортировка все равно быстрее.

Сколько сразу полезных замечаний, как только текст стал выглядеть вменяемо! :))


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 231
Благодарил (а): 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 ;

CREATE DATA[] 3 CELLS ALLOT

: middle                                   
  DATA[] !                                       
  DATA[] 1 -TH !                                             
  DATA[] 2 -TH !______________________________________________3\                                 
                                                       
  DATA[] @ DATA[] 1 -TH @ >___________________________________12>
  DATA[] @ DATA[] 2 -TH @ < AND IF DATA[] @ THEN______________13<&i1;t

  DATA[] @ DATA[] 1 -TH @ <___________________________________12<
  DATA[] @ DATA[] 2 -TH @ > AND IF DATA[] @ THEN______________13>&i1;t
                                                             
  DATA[] 1 -TH @ DATA[] @ >___________________________________21>
  DATA[] 1 -TH @ DATA[] 2 -TH @ < AND IF DATA[] 1 -TH @ THEN__23<&i2;t

  DATA[] 1 -TH @ DATA[] @ <___________________________________21<
  DATA[] 1 -TH @ DATA[] 2 -TH @ > AND IF DATA[] 1 -TH @ THEN__23>&i2;t

  DATA[] 2 -TH @ DATA[] @ >___________________________________31>
  DATA[] 2 -TH @ DATA[] 1 -TH @ < AND IF DATA[] 2 -TH @ THEN__32<&i3;t

  DATA[] 2 -TH @ DATA[] @ <___________________________________31<
  DATA[] 2 -TH @ DATA[] 1 -TH @ > AND IF DATA[] 2 -TH @ THEN__32>&i3;t
;

2 3 4 middle .

Мы с Вами сказали компьютеру одно и тоже. А человек может выбрать любую запись.


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

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


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

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


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

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