Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: По мотивам программы в одну строчку |
|
|
пожалуй короче S" /\" CHOOSE + и не придумаешь, здесь удачно "зацеплены" входные данные и генератор случайных чисел. Входные данные - строка из двух символов (слешей) которыми строится лабиринт и как принято в форте оставляет на стеке адрес строки и число символов, в этом случае число 2, казалось бы лишний параметр, но как удачно в этом случае он работает входным параметром для стандартного библиотечного генератора случайных чисел CHOOSE, который требует на входе число n а на выходе дает случайное число в диапозоне 0..n-1 в нашем случае на выходе 0 или 1, то что нам нужно, ибо это смещения к адресу строки для выборки очередного символа для построения лабиринта. нам не потребовалость приводить случайное число к нужному диапозону через 1 AND, 2 MOD или 45 * да и входные данные представлены в своем естественном и понятном виде. Вот такая тут приятная изюминка)
пожалуй короче [b]S" /\" CHOOSE +[/b] и не придумаешь, здесь удачно "зацеплены" входные данные и генератор случайных чисел. Входные данные - строка из двух символов (слешей) которыми строится лабиринт и как принято в форте оставляет на стеке адрес строки и число символов, в этом случае число 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 ?
[quote="chess"]: xGO ( xt -- ) DUP BRANCH, EXECUTE ; \ goto по адресу[/quote] а почему не бейсик сразу? нафига 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 \ аналог предыдущей строки с использованием манипулятора
[quote="mOleg"]народ, вы гоните![/quote] Это точно. В основном повторял результаты AlexF.
Наиболее близкий вариант к бейсиковому, но на форте, будет примерно таким:
[code]REQUIRE CHOOSE LIB\EXT\RND.F : xGO ( xt -- ) DUP BRANCH, EXECUTE ; \ goto по адресу
HERE ] S" /\" CHOOSE + 1 TYPE [ xGO \ собственно нужная строка - не сильно длиннее чем на Бейсике
HERE ] S" /\" 0\p+`1T [ xGO \ аналог предыдущей строки с использованием манипулятора[/code]
|
|
|
|
Добавлено: Пт дек 07, 2012 17:13 |
|
|
|
|
|
Заголовок сообщения: |
Re: По мотивам программы в одну строчку |
|
|
AlexF писал(а): Не сразу понял, что код нужно запускать в вашей сборкеБрал отсюда: viewtopic.php?f=25&t=531&start=30в версии 562 Cтранно, в _read.1st чуть ли не в первой строчке присутствует рецепт (чего и как запускать) кстати, mc10-b694 таки новее, впрочем до НГ собираюсь выложить очередную версию. AlexF писал(а): Приятно удивило, что компилируемые слова запустились в интерактивном режиме. Т.е не пришлось оборачивать в отдельное слово, а слово потом вызывать. AlexF писал(а): Остался неясным момент: зачем делать массив из 4-х элементов "\", "/", "\", "\" ? это массив из двух элементов, т.к. s" понимает символы квотирования, которые начинаются как раз со '\' , т.е. '\\' - это просто \, а, скажем, \t - табуляция.
[quote="AlexF"]Не сразу понял, что код нужно запускать в вашей сборкеБрал отсюда: viewtopic.php?f=25&t=531&start=30в версии 562[/quote] Cтранно, в _read.1st чуть ли не в первой строчке присутствует рецепт (чего и как запускать) ;) кстати, mc10-b694 таки новее, впрочем до НГ собираюсь выложить очередную версию.
[quote="AlexF"]Приятно удивило, что компилируемые слова запустились в интерактивном режиме. Т.е не пришлось оборачивать в отдельное слово, а слово потом вызывать.[/quote] 8)
[quote="AlexF"]Остался неясным момент: зачем делать массив из 4-х элементов "\", "/", "\", "\" ?[/quote] это массив из двух элементов, т.к. 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-х элементов "\", "/", "\", "\" ?
to mOleg
Не сразу понял, что код нужно запускать в вашей сборке Брал отсюда: http://fforum.winglion.ru/viewtopic.php?f=25&t=531&start=30 в версии 562
Приятно удивило, что компилируемые слова запустились в интерактивном режиме. Т.е не пришлось оборачивать в отдельное слово, а слово потом вызывать.
В решении понравились моменты:
1) Определение четное / нечетное число. Элегантно [code]1 AND[/code] против моего [code]2 mod[/code]
2) Печать символа в зависимости от того, четное или нет число. Использование массива с индексацией [code]s" \/\\"[/code] лакончино, быстро: [code]( 1|0 ) s" \/\\" DROP + C@ EMIT [/code] Остался неясным момент: зачем делать массив из 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 ;
да в исходнике на бейсике бесконечный цикл, прерывается брейком. можно и такой вариант: [code] : arr BEGIN 47 RANDOM 1 AND 45 * + EMIT AGAIN ; или тоже самое через манипуляторы : arr 47 ['] RANDOM 1 45 4\B1'2x3&4*+cO ; [/code]
|
|
|
|
Добавлено: Вт дек 04, 2012 20:10 |
|
|
|
|
|
Заголовок сообщения: |
Re: По мотивам программы в одну строчку |
|
|
народ, вы гоните! Код: math/ mersenne.fts
BEGIN RANDOM 1 AND s" \/\\" DROP + C@ EMIT AGAIN
народ, вы гоните! [code] math/ mersenne.fts
BEGIN RANDOM 1 AND s" \/\\" DROP + C@ EMIT AGAIN [/code]
|
|
|
|
Добавлено: Вт дек 04, 2012 18:38 |
|
|
|
|
|
Заголовок сообщения: |
Re: По мотивам программы в одну строчку |
|
|
Э... не могли бы описать в комментариях что делается, как-то не сильно понятно И что понимаете под расширенный форт ?
Э... не могли бы описать в комментариях что делается, как-то не сильно понятно :(
И что понимаете под [i]расширенный форт[/i] ?
|
|
|
|
Добавлено: Пн дек 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
[quote="AlexF"]По мотивам топика на Хабре http://habrahabr.ru/post/161035/ на форте, интересно было как оно получится. Не в одну строчку, но все же:[/quote] На чуть расширенном форте: [code]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 [/code]
|
|
|
|
Добавлено: Пн дек 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 Так понятнее, проще как отладке так и в совпрождении. Было бы интересно, есть варинты более лаконичной реализации?
По мотивам топика на Хабре http://habrahabr.ru/post/161035/ на форте, интересно было как оно получится. Не в одну строчку, но все же: [code] : 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 [/code]
Для понимания сложно и не соотвествует методологии -- составлять из элементарных слов. Если же придерживаться методологии, получится многословнее [code] 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 [/code]
Так понятнее, проще как отладке так и в совпрождении.
Было бы интересно, есть варинты более лаконичной реализации?
|
|
|
|
Добавлено: Вс дек 02, 2012 23:22 |
|
|
|
|