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

...
Google Search
Forth-FAQ Spy Grafic

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




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - По мотивам программы в одну строчку
Автор Сообщение
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
пожалуй короче S" /\" CHOOSE + и не придумаешь, здесь удачно "зацеплены"
входные данные и генератор случайных чисел. Входные данные - строка из двух
символов (слешей) которыми строится лабиринт и как принято в форте оставляет
на стеке адрес строки и число символов, в этом случае число 2, казалось бы
лишний параметр, но как удачно в этом случае он работает входным параметром
для стандартного библиотечного генератора случайных чисел CHOOSE, который
требует на входе число n а на выходе дает случайное число в диапозоне 0..n-1
в нашем случае на выходе 0 или 1, то что нам нужно, ибо это смещения к адресу
строки для выборки очередного символа для построения лабиринта.
нам не потребовалость приводить случайное число к нужному диапозону
через 1 AND, 2 MOD или 45 * да и входные данные представлены в своем естественном
и понятном виде. Вот такая тут приятная изюминка)
Сообщение Добавлено: Вс дек 09, 2012 16:26
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
chess писал(а):
: xGO ( xt -- ) DUP BRANCH, EXECUTE ; \ goto по адресу

а почему не бейсик сразу?
нафига GOTO?
что не так с BEGIN .. AGAIN ?
Сообщение Добавлено: Пт дек 07, 2012 19:26
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
mOleg писал(а):
народ, вы гоните!

Это точно. В основном повторял результаты AlexF.

Наиболее близкий вариант к бейсиковому, но на форте, будет примерно таким:

Код:
REQUIRE CHOOSE LIB\EXT\RND.F
: xGO ( xt -- ) DUP BRANCH, EXECUTE ; \ goto по адресу

HERE ] S" /\" CHOOSE + 1 TYPE [ xGO    \ собственно нужная строка - не сильно длиннее чем на Бейсике


HERE ] S" /\" 0\p+`1T [ xGO  \ аналог предыдущей строки с использованием манипулятора
Сообщение Добавлено: Пт дек 07, 2012 17:13
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
AlexF писал(а):
Не сразу понял, что код нужно запускать в вашей сборкеБрал отсюда: viewtopic.php?f=25&t=531&start=30в версии 562

Cтранно, в _read.1st чуть ли не в первой строчке присутствует рецепт (чего и как запускать) ;)
кстати, mc10-b694 таки новее, впрочем до НГ собираюсь выложить очередную версию.

AlexF писал(а):
Приятно удивило, что компилируемые слова запустились в интерактивном режиме. Т.е не пришлось оборачивать в отдельное слово, а слово потом вызывать.

8)

AlexF писал(а):
Остался неясным момент: зачем делать массив из 4-х элементов "\", "/", "\", "\" ?

это массив из двух элементов, т.к. s" понимает символы квотирования, которые начинаются как раз со '\' , т.е. '\\' - это просто \, а, скажем, \t - табуляция.
Сообщение Добавлено: Чт дек 06, 2012 05:51
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
to mOleg

Не сразу понял, что код нужно запускать в вашей сборке
Брал отсюда: viewtopic.php?f=25&t=531&start=30
в версии 562

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

В решении понравились моменты:

1) Определение четное / нечетное число. Элегантно
Код:
1 AND
против моего
Код:
2 mod


2) Печать символа в зависимости от того, четное или нет число. Использование массива с индексацией
Код:
s" \/\\"
лакончино, быстро:
Код:
( 1|0 ) s" \/\\" DROP + C@ EMIT
Остался неясным момент: зачем делать массив из 4-х элементов "\", "/", "\", "\" ?
Сообщение Добавлено: Чт дек 06, 2012 02:23
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
да в исходнике на бейсике бесконечный цикл, прерывается брейком. можно и такой вариант:
Код:
: arr BEGIN 47 RANDOM 1 AND 45 * + EMIT AGAIN ;
или тоже самое через манипуляторы
: arr 47 ['] RANDOM 1 45 4\B1'2x3&4*+cO ;
Сообщение Добавлено: Вт дек 04, 2012 20:10
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
народ, вы гоните!
Код:
math/ mersenne.fts

BEGIN RANDOM 1 AND s" \/\\" DROP + C@ EMIT AGAIN
Сообщение Добавлено: Вт дек 04, 2012 18:38
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
Э... не могли бы описать в комментариях что делается, как-то не сильно понятно :(

И что понимаете под расширенный форт ?
Сообщение Добавлено: Пн дек 03, 2012 23:07
  Заголовок сообщения:  Re: По мотивам программы в одну строчку  Ответить с цитатой
AlexF писал(а):
По мотивам топика на Хабре http://habrahabr.ru/post/161035/ на форте, интересно было как оно получится. Не в одну строчку, но все же:

На чуть расширенном форте:
Код:
REQUIRE CHOOSE LIB\EXT\RND.F
\ если с рамкой:
\       0  1        2   3   4   5  6
.arr: ( dx dy -- ) '-' '|' '/' '\' CHOOSE' 
7/0`2+yD2cL\1yD3c0yD`26Xi4e5tcL3c\L0`2+yD2cL\ ;

40 20 .arr

\ если ближе к оригиналу - без рамки, то:
\       0  1        2   3  4
.ar0: ( dx dy -- ) '/' '\' CHOOSE'  5/0yD1yD`24Xi2e3tcL\L\ ;

10 20 .ar0
Сообщение Добавлено: Пн дек 03, 2012 10:37
  Заголовок сообщения:  По мотивам программы в одну строчку  Ответить с цитатой
По мотивам топика на Хабре http://habrahabr.ru/post/161035/ на форте, интересно было как оно получится. Не в одну строчку, но все же:
Код:
: ar2
57
   40 80 * 0 do
     69069 * 31415 + 278720333 mod
     dup 56888 < if ." /" else ." \" then
     i 80 mod 0= if cr then
   loop drop cr
;
ar2


Для понимания сложно и не соотвествует методологии -- составлять из элементарных слов. Если же придерживаться методологии, получится многословнее
Код:
VARIABLE RND 
57 RND !
: RANDOM  ( -- u )  RND @ 69069 * 31415 + 278720333 MOD DUP RND ! ;
: rx ( u1 -- 1|0 ) RANDOM ABS 2 MOD ;

: .cell
     rx if ." /" else ." \" then ;
: .line
    ." |" 78 0 do .cell loop ." |" cr ;
: .arr
    ." -------------------------------------------------------------" cr
    20 0 do .line loop
    ." -------------------------------------------------------------" cr
;
.arr


Так понятнее, проще как отладке так и в совпрождении.

Было бы интересно, есть варинты более лаконичной реализации?
Сообщение Добавлено: Вс дек 02, 2012 23:22

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


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