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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: По мотивам программы в одну строчку
СообщениеДобавлено: Вс дек 02, 2012 23:22 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
По мотивам топика на Хабре 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


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

Было бы интересно, есть варинты более лаконичной реализации?


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
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

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


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

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Э... не могли бы описать в комментариях что делается, как-то не сильно понятно :(

И что понимаете под расширенный форт ?


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
народ, вы гоните!
Код:
math/ mersenne.fts

BEGIN RANDOM 1 AND s" \/\\" DROP + C@ EMIT AGAIN

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


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
да в исходнике на бейсике бесконечный цикл, прерывается брейком. можно и такой вариант:
Код:
: arr BEGIN 47 RANDOM 1 AND 45 * + EMIT AGAIN ;
или тоже самое через манипуляторы
: arr 47 ['] RANDOM 1 45 4\B1'2x3&4*+cO ;


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

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
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-х элементов "\", "/", "\", "\" ?


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
AlexF писал(а):
Не сразу понял, что код нужно запускать в вашей сборкеБрал отсюда: viewtopic.php?f=25&t=531&start=30в версии 562

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

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

8)

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

это массив из двух элементов, т.к. s" понимает символы квотирования, которые начинаются как раз со '\' , т.е. '\\' - это просто \, а, скажем, \t - табуляция.

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


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

Зарегистрирован: Чт июл 20, 2006 11:31
Сообщения: 2168
Откуда: Екб
Благодарил (а): 0 раз.
Поблагодарили: 41 раз.
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  \ аналог предыдущей строки с использованием манипулятора

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


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

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
chess писал(а):
: xGO ( xt -- ) DUP BRANCH, EXECUTE ; \ goto по адресу

а почему не бейсик сразу?
нафига GOTO?
что не так с BEGIN .. AGAIN ?

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


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

Зарегистрирован: Ср июл 05, 2006 14:44
Сообщения: 236
Благодарил (а): 0 раз.
Поблагодарили: 7 раз.
пожалуй короче S" /\" CHOOSE + и не придумаешь, здесь удачно "зацеплены"
входные данные и генератор случайных чисел. Входные данные - строка из двух
символов (слешей) которыми строится лабиринт и как принято в форте оставляет
на стеке адрес строки и число символов, в этом случае число 2, казалось бы
лишний параметр, но как удачно в этом случае он работает входным параметром
для стандартного библиотечного генератора случайных чисел CHOOSE, который
требует на входе число n а на выходе дает случайное число в диапозоне 0..n-1
в нашем случае на выходе 0 или 1, то что нам нужно, ибо это смещения к адресу
строки для выборки очередного символа для построения лабиринта.
нам не потребовалость приводить случайное число к нужному диапозону
через 1 AND, 2 MOD или 45 * да и входные данные представлены в своем естественном
и понятном виде. Вот такая тут приятная изюминка)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

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


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

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


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

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