Forth http://fforum.winglion.ru/ |
|
По мотивам программы в одну строчку http://fforum.winglion.ru/viewtopic.php?f=18&t=2901 |
Страница 1 из 1 |
Автор: | AlexF [ Вс дек 02, 2012 23:22 ] |
Заголовок сообщения: | По мотивам программы в одну строчку |
По мотивам топика на Хабре 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 Так понятнее, проще как отладке так и в совпрождении. Было бы интересно, есть варинты более лаконичной реализации? |
Автор: | chess [ Пн дек 03, 2012 10:37 ] |
Заголовок сообщения: | 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 |
Автор: | AlexF [ Пн дек 03, 2012 23:07 ] |
Заголовок сообщения: | Re: По мотивам программы в одну строчку |
Э... не могли бы описать в комментариях что делается, как-то не сильно понятно И что понимаете под расширенный форт ? |
Автор: | mOleg [ Вт дек 04, 2012 18:38 ] |
Заголовок сообщения: | Re: По мотивам программы в одну строчку |
народ, вы гоните! Код: math/ mersenne.fts
BEGIN RANDOM 1 AND s" \/\\" DROP + C@ EMIT AGAIN |
Автор: | Alex [ Вт дек 04, 2012 20:10 ] |
Заголовок сообщения: | Re: По мотивам программы в одну строчку |
да в исходнике на бейсике бесконечный цикл, прерывается брейком. можно и такой вариант: Код: : arr BEGIN 47 RANDOM 1 AND 45 * + EMIT AGAIN ;
или тоже самое через манипуляторы : arr 47 ['] RANDOM 1 45 4\B1'2x3&4*+cO ; |
Автор: | AlexF [ Чт дек 06, 2012 02:23 ] |
Заголовок сообщения: | 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-х элементов "\", "/", "\", "\" ?
|
Автор: | mOleg [ Чт дек 06, 2012 05:51 ] |
Заголовок сообщения: | Re: По мотивам программы в одну строчку |
AlexF писал(а): Не сразу понял, что код нужно запускать в вашей сборкеБрал отсюда: viewtopic.php?f=25&t=531&start=30в версии 562 Cтранно, в _read.1st чуть ли не в первой строчке присутствует рецепт (чего и как запускать) кстати, mc10-b694 таки новее, впрочем до НГ собираюсь выложить очередную версию. AlexF писал(а): Приятно удивило, что компилируемые слова запустились в интерактивном режиме. Т.е не пришлось оборачивать в отдельное слово, а слово потом вызывать. AlexF писал(а): Остался неясным момент: зачем делать массив из 4-х элементов "\", "/", "\", "\" ? это массив из двух элементов, т.к. s" понимает символы квотирования, которые начинаются как раз со '\' , т.е. '\\' - это просто \, а, скажем, \t - табуляция. |
Автор: | chess [ Пт дек 07, 2012 17:13 ] |
Заголовок сообщения: | 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 \ аналог предыдущей строки с использованием манипулятора |
Автор: | mOleg [ Пт дек 07, 2012 19:26 ] |
Заголовок сообщения: | Re: По мотивам программы в одну строчку |
chess писал(а): : xGO ( xt -- ) DUP BRANCH, EXECUTE ; \ goto по адресу а почему не бейсик сразу? нафига GOTO? что не так с BEGIN .. AGAIN ? |
Автор: | Alex [ Вс дек 09, 2012 16:26 ] |
Заголовок сообщения: | Re: По мотивам программы в одну строчку |
пожалуй короче S" /\" CHOOSE + и не придумаешь, здесь удачно "зацеплены" входные данные и генератор случайных чисел. Входные данные - строка из двух символов (слешей) которыми строится лабиринт и как принято в форте оставляет на стеке адрес строки и число символов, в этом случае число 2, казалось бы лишний параметр, но как удачно в этом случае он работает входным параметром для стандартного библиотечного генератора случайных чисел CHOOSE, который требует на входе число n а на выходе дает случайное число в диапозоне 0..n-1 в нашем случае на выходе 0 или 1, то что нам нужно, ибо это смещения к адресу строки для выборки очередного символа для построения лабиринта. нам не потребовалость приводить случайное число к нужному диапозону через 1 AND, 2 MOD или 45 * да и входные данные представлены в своем естественном и понятном виде. Вот такая тут приятная изюминка) |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |