Автор |
Сообщение |
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
более быстое решение (опять fork) source file: ramsize1.fts \ 17.06.2012 m0leg
math/ mersenne.fts os/ heap.fts util/ timer.fts branch/ for-next.fts
CONTAINER сокрыто
TIMER@ D>S 137 MOD ABS BEGIN RANDOM DROP *WHILE 1 - REPEAT DROP 0x1000 CHOOSE 1 MAX CONSTANT объем
объем BLOCK VALUE память 0 VALUE адрес
: текущий ( --> addr ) адрес память + ;
RECENT ALSO сокрыто
: влево ( --> ) адрес 1 - [ объем 1 - ] LITERAL UMIN TO адрес ; : вправо ( --> ) адрес 1 + объем UMOD TO адрес ; : прочесть ( --> flag ) текущий B@ 0 <> ; : изменить ( --> ) прочесть -1 XOR текущий B! ;
\ инициализация массива объем BEGIN *WHILE RANDOM 1 AND IF изменить THEN вправо 1 - REPEAT DROP \ случайный адрес объем CHOOSE TO адрес
: проверить s" сколькобит" SFIND IF EXECUTE THEN DUP ." посчитано: \t" . ." \n\rисходный объем: " объем DUP . = IF ." \n\r решение верно." ELSE ." \n\r решение не верно." THEN ;
PREVIOUS
\ сместиться влево на указанное число бит : Левее ( # --> ) FOR влево TILL ;
\ сместиться вправо на указанное число бит : Правее ( # --> ) FOR вправо TILL ;
\ : проверка ( bit # --> bit # flag ) изменить DUP Левее OVER прочесть <> IF FALSE ;THEN DUP Правее TRUE ;
\ проверить следующий бит : следущий? ( bit # --> bit flag ) OVER прочесть = IF проверка ELSE TRUE THEN ;
\ определить объем памяти : сколькобит ( --> # ) прочесть 1 BEGIN вправо следущий? WHILE 1 + REPEAT NIP ;
проверить
более быстое решение (опять [url=http://fforum.winglion.ru/viewtopic.php?p=34750#p34750]fork[/url])
[pre]source file: ramsize1.fts [b][color=#C0C0C0]\ 17.06.2012 m0leg[/color]
[color=#00F000]math/ mersenne.fts[/color] [color=#00F000]os/ heap.fts[/color] [color=#00F000]util/ timer.fts[/color] [color=#00F000]branch/ for-next.fts[/color]
[color=#FF8000]CONTAINER сокрыто[/color]
TIMER@ D>S [color=#00F000]137[/color] MOD ABS [color=#00A0A0]BEGIN[/color] RANDOM DROP [color=#00A0A0]*WHILE[/color] [color=#00F000]1[/color] - [color=#00A0A0]REPEAT[/color] DROP [color=#00F000]0x1000[/color] CHOOSE [color=#00F000]1[/color] MAX [color=#FF8000]CONSTANT объем[/color]
объем BLOCK [color=#FF8000]VALUE память[/color] [color=#00F000]0[/color] [color=#FF8000]VALUE адрес[/color]
[color=#FF8000]: текущий[/color] [color=#0080C0]( --> addr )[/color] адрес память + [color=#FF8000];[/color]
[color=#FF00FF]RECENT[/color] [color=#FF00FF]ALSO[/color] сокрыто
[color=#FF8000]: влево[/color] [color=#0080C0]( --> )[/color] адрес [color=#00F000]1[/color] - [color=#C00000][[/color] объем [color=#00F000]1[/color] - [color=#C00000]][/color] LITERAL UMIN TO адрес [color=#FF8000];[/color] [color=#FF8000]: вправо[/color] [color=#0080C0]( --> )[/color] адрес [color=#00F000]1[/color] + объем UMOD TO адрес [color=#FF8000];[/color] [color=#FF8000]: прочесть[/color] [color=#0080C0]( --> flag )[/color] текущий B@ [color=#00F000]0[/color] <> [color=#FF8000];[/color] [color=#FF8000]: изменить[/color] [color=#0080C0]( --> )[/color] прочесть [color=#00F000]-1[/color] XOR текущий B! [color=#FF8000];[/color]
[color=#C0C0C0]\ инициализация массива[/color] объем [color=#00A0A0]BEGIN[/color] [color=#00A0A0]*WHILE[/color] RANDOM [color=#00F000]1[/color] AND [color=#00A0A0]IF[/color] изменить [color=#00A0A0]THEN[/color] вправо [color=#00F000]1[/color] - [color=#00A0A0]REPEAT[/color] DROP [color=#C0C0C0]\ случайный адрес[/color] объем CHOOSE TO адрес
[color=#FF8000]: проверить[/color] [color=#00F000]s" сколькобит"[/color] SFIND [color=#00A0A0]IF[/color] [color=#C00000]EXECUTE[/color] [color=#00A0A0]THEN[/color] DUP [color=#00F000]." посчитано: \t"[/color] . [color=#00F000]." \n\rисходный объем: "[/color] объем DUP . = [color=#00A0A0]IF[/color] [color=#00F000]." \n\r решение верно."[/color] [color=#00A0A0]ELSE[/color] [color=#00F000]." \n\r решение не верно."[/color] [color=#00A0A0]THEN[/color] [color=#FF8000];[/color]
[color=#FF00FF]PREVIOUS[/color]
[color=#C0C0C0]\ сместиться влево на указанное число бит[/color] [color=#FF8000]: Левее[/color] [color=#0080C0]( # --> )[/color] FOR влево TILL [color=#FF8000];[/color]
[color=#C0C0C0]\ сместиться вправо на указанное число бит[/color] [color=#FF8000]: Правее[/color] [color=#0080C0]( # --> )[/color] FOR вправо TILL [color=#FF8000];[/color]
[color=#C0C0C0]\[/color] [color=#FF8000]: проверка[/color] [color=#0080C0]( bit # --> bit # flag )[/color] изменить DUP Левее OVER прочесть <> [color=#00A0A0]IF[/color] [color=#00F000]FALSE[/color] [color=#FF8000];THEN[/color] DUP Правее [color=#00F000]TRUE[/color] [color=#FF8000];[/color]
[color=#C0C0C0]\ проверить следующий бит[/color] [color=#FF8000]: следущий?[/color] [color=#0080C0]( bit # --> bit flag )[/color] OVER прочесть = [color=#00A0A0]IF[/color] проверка [color=#00A0A0]ELSE[/color] [color=#00F000]TRUE[/color] [color=#00A0A0]THEN[/color] [color=#FF8000];[/color]
[color=#C0C0C0]\ определить объем памяти[/color] [color=#FF8000]: сколькобит[/color] [color=#0080C0]( --> # )[/color] прочесть [color=#00F000]1[/color] [color=#00A0A0]BEGIN[/color] вправо следущий? [color=#00A0A0]WHILE[/color] [color=#00F000]1[/color] + [color=#00A0A0]REPEAT[/color] NIP [color=#FF8000];[/color]
проверить [/b][/pre]
|
|
|
|
Добавлено: Сб июн 16, 2012 21:10 |
|
|
|
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
Самое простое и медленное решение (использован fork) Кто придумает быстрее? source file: ramsize.fts \ 15.06.2012
math/ mersenne.fts os/ heap.fts util/ timer.fts branch/ for-next.fts
CONTAINER сокрыто
TIMER@ D>S 137 MOD ABS BEGIN RANDOM DROP *WHILE 1 - REPEAT DROP 0x1000 CHOOSE 1 MAX CONSTANT объем
объем BLOCK VALUE память 0 VALUE адрес
: текущий ( --> addr ) адрес память + ;
RECENT ALSO сокрыто
: влево ( --> ) адрес 1 - [ объем 1 - ] LITERAL UMIN TO адрес ; : вправо ( --> ) адрес 1 + объем UMOD TO адрес ; : прочесть ( --> flag ) текущий B@ 0 <> ; : изменить ( --> ) прочесть -1 XOR текущий B! ;
\ инициализация массива объем BEGIN *WHILE RANDOM 1 AND IF изменить THEN вправо 1 - REPEAT DROP \ случайный адрес объем CHOOSE TO адрес
: проверить s" сколькобит" SFIND IF EXECUTE THEN DUP ." посчитано: \t" . ." \n\rисходный объем: " объем DUP . = IF ." \n\r решение верно." ELSE ." \n\r решение не верно." THEN ;
PREVIOUS
\ сместиться влево на указанное число бит : Левее ( # --> ) FOR влево TILL ;
\ сместиться вправо на указанное число бит : Правее ( # --> ) FOR вправо TILL ;
\ проверить следующий бит : следущий? ( # --> bit ) DUP Правее изменить Левее прочесть ;
\ определить объем памяти : сколькобит ( --> # ) 1 >L \ счетчик размера прочесть IFNOT изменить THEN BEGIN L@ следущий? WHILE 1 L+ REPEAT L> ;
проверить
Самое простое и медленное решение (использован [url=http://fforum.winglion.ru/viewtopic.php?p=34750#p34750]fork[/url]) Кто придумает быстрее?
[pre]source file: ramsize.fts [b][color=#C0C0C0]\ 15.06.2012[/color]
[color=#00F000]math/ mersenne.fts[/color] [color=#00F000]os/ heap.fts[/color] [color=#00F000]util/ timer.fts[/color] [color=#00F000]branch/ for-next.fts[/color]
[color=#FF8000]CONTAINER сокрыто[/color]
TIMER@ D>S [color=#00F000]137[/color] MOD ABS [color=#00A0A0]BEGIN[/color] RANDOM DROP [color=#00A0A0]*WHILE[/color] [color=#00F000]1[/color] - [color=#00A0A0]REPEAT[/color] DROP [color=#00F000]0x1000[/color] CHOOSE [color=#00F000]1[/color] MAX [color=#FF8000]CONSTANT объем[/color]
объем BLOCK [color=#FF8000]VALUE память[/color] [color=#00F000]0[/color] [color=#FF8000]VALUE адрес[/color]
[color=#FF8000]: текущий[/color] [color=#0080C0]( --> addr )[/color] адрес память + [color=#FF8000];[/color]
[color=#FF00FF]RECENT[/color] [color=#FF00FF]ALSO[/color] сокрыто
[color=#FF8000]: влево[/color] [color=#0080C0]( --> )[/color] адрес [color=#00F000]1[/color] - [color=#C00000][[/color] объем [color=#00F000]1[/color] - [color=#C00000]][/color] LITERAL UMIN TO адрес [color=#FF8000];[/color] [color=#FF8000]: вправо[/color] [color=#0080C0]( --> )[/color] адрес [color=#00F000]1[/color] + объем UMOD TO адрес [color=#FF8000];[/color] [color=#FF8000]: прочесть[/color] [color=#0080C0]( --> flag )[/color] текущий B@ [color=#00F000]0[/color] <> [color=#FF8000];[/color] [color=#FF8000]: изменить[/color] [color=#0080C0]( --> )[/color] прочесть [color=#00F000]-1[/color] XOR текущий B! [color=#FF8000];[/color]
[color=#C0C0C0]\ инициализация массива[/color] объем [color=#00A0A0]BEGIN[/color] [color=#00A0A0]*WHILE[/color] RANDOM [color=#00F000]1[/color] AND [color=#00A0A0]IF[/color] изменить [color=#00A0A0]THEN[/color] вправо [color=#00F000]1[/color] - [color=#00A0A0]REPEAT[/color] DROP [color=#C0C0C0]\ случайный адрес[/color] объем CHOOSE TO адрес
[color=#FF8000]: проверить[/color] [color=#00F000]s" сколькобит"[/color] SFIND [color=#00A0A0]IF[/color] [color=#C00000]EXECUTE[/color] [color=#00A0A0]THEN[/color] DUP [color=#00F000]." посчитано: \t"[/color] . [color=#00F000]." \n\rисходный объем: "[/color] объем DUP . = [color=#00A0A0]IF[/color] [color=#00F000]." \n\r решение верно."[/color] [color=#00A0A0]ELSE[/color] [color=#00F000]." \n\r решение не верно."[/color] [color=#00A0A0]THEN[/color] [color=#FF8000];[/color]
[color=#FF00FF]PREVIOUS[/color]
[color=#C0C0C0]\ сместиться влево на указанное число бит[/color] [color=#FF8000]: Левее[/color] [color=#0080C0]( # --> )[/color] FOR влево TILL [color=#FF8000];[/color]
[color=#C0C0C0]\ сместиться вправо на указанное число бит[/color] [color=#FF8000]: Правее[/color] [color=#0080C0]( # --> )[/color] FOR вправо TILL [color=#FF8000];[/color]
[color=#C0C0C0]\ проверить следующий бит[/color] [color=#FF8000]: следущий?[/color] [color=#0080C0]( # --> bit )[/color] DUP Правее изменить Левее прочесть [color=#FF8000];[/color]
[color=#C0C0C0]\ определить объем памяти[/color] [color=#FF8000]: сколькобит[/color] [color=#0080C0]( --> # )[/color] [color=#00F000]1[/color] >L [color=#C0C0C0]\ счетчик размера[/color] прочесть [color=#00A0A0]IFNOT[/color] изменить [color=#00A0A0]THEN[/color] [color=#00A0A0]BEGIN[/color] L@ следущий? [color=#00A0A0]WHILE[/color] [color=#00F000]1[/color] L+ [color=#00A0A0]REPEAT[/color] L> [color=#FF8000];[/color]
проверить [/b][/pre]
|
|
|
|
Добавлено: Сб июн 16, 2012 19:16 |
|
|
|
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
Код: : сколькобит ( -- u )
0 записать-0 begin 1+ dup вперед-NN записать-1 dup назад-NN прочесть until ;
если на микросхеме есть маркировка, то можно погуглить даташит
[code]
: сколькобит ( -- u )
0 записать-0 begin 1+ dup вперед-NN записать-1 dup назад-NN прочесть until ;
[/code]
если на микросхеме есть маркировка, то можно погуглить даташит 8)
|
|
|
|
Добавлено: Сб июн 16, 2012 08:26 |
|
|
|
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
решение WingLion не верно, прошу исправить (должно хотя бы компилироваться и соответсвтовать условию задачи, а, желательно, и работать). WingLion писал(а): вилами по воде не проверено(!) нет смысла выкладывать заведомо нерабочие решения, т.к. сюда смотрят новички!!! Двум персонажам вынес предупреждение по пункту 6 правил данного раздела, мусорные сообщения вынес в отдельный топик.
решение WingLion не верно, прошу исправить (должно хотя бы компилироваться и соответсвтовать условию задачи, а, желательно, и работать). [quote="WingLion"]вилами по воде не проверено(!)[/quote] нет смысла выкладывать заведомо нерабочие решения, т.к. сюда смотрят новички!!! Двум персонажам вынес предупреждение по пункту 6 правил данного раздела, мусорные сообщения вынес в [url=http://fforum.winglion.ru/viewtopic.php?f=7&t=2857&view]отдельный топик[/url].
|
|
|
|
Добавлено: Пт июн 15, 2012 14:58 |
|
|
|
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
Код: : вперед вправо ; : назад влево ;
: записать-0 прочесть IF изменить THEN ; : записать-1 записать-0 изменить ;
: вперед-NN 0 DO вперед LOOP ; : назад-NN 0 DO назад LOOP ;
0 VALUE NN
: тест-NN ( NN --> ) 1 TO NN записать-0 BEGIN NN вперед-NN записать-1 NN назад-NN прочесть IF EXIT THEN NN вперед-NN записать-0 NN назад-NN NN 1 + TO NN AGAIN ;
: сколькобит тест-NN NN ; вилами по воде не проверено(!)
[code]: вперед вправо ; : назад влево ;
: записать-0 прочесть IF изменить THEN ; : записать-1 записать-0 изменить ;
: вперед-NN 0 DO вперед LOOP ; : назад-NN 0 DO назад LOOP ;
0 VALUE NN
: тест-NN ( NN --> ) 1 TO NN записать-0 BEGIN NN вперед-NN записать-1 NN назад-NN прочесть IF EXIT THEN NN вперед-NN записать-0 NN назад-NN NN 1 + TO NN AGAIN ;
: сколькобит тест-NN NN ;[/code]
[b]вилами по воде[/b] не проверено(!)
|
|
|
|
Добавлено: Чт июн 14, 2012 20:35 |
|
|
|
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
WingLion писал(а): 2. Читаем 2^N бит, запоминаем, и, вот, скажем размер 1 бит WingLion писал(а): 3. читаем следующие 2^N бит, тоже запоминаем, сравниваем с первыми 2^N бит. WingLion писал(а): а там случайно, скажем значение "101010101010101010", или другое регулярное WingLion писал(а): 4. Если не совпадают, увеличиваем N на 1 и возвращаемся к п.3Если первые 2^N бит совпадают со вторыми 2^N, N становится кандидатом на количество адресов памяти. скажем, размер памяти - простое число
[quote="WingLion"]2. Читаем 2^N бит, запоминаем,[/quote] и, вот, скажем размер 1 бит 8) [quote="WingLion"]3. читаем следующие 2^N бит, тоже запоминаем, сравниваем с первыми 2^N бит.[quote="WingLion"] а там случайно, скажем значение "101010101010101010", или другое регулярное 8) [quote="WingLion"]4. Если не совпадают, увеличиваем N на 1 и возвращаемся к п.3Если первые 2^N бит совпадают со вторыми 2^N, N становится кандидатом на количество адресов памяти.[/quote][/quote][/quote] скажем, размер памяти - простое число 8)
|
|
|
|
Добавлено: Чт июн 14, 2012 19:51 |
|
|
|
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
А считать всю память реально?
1. N=0
2. Читаем 2^N бит, запоминаем, 3. читаем следующие 2^N бит, тоже запоминаем, сравниваем с первыми 2^N бит. 4. Если не совпадают, увеличиваем N на 1 и возвращаемся к п.3 Если первые 2^N бит совпадают со вторыми 2^N, N становится кандидатом на количество адресов памяти. 5. Читаем все остальное до предполагаемого предела - 1Гбита, проверяя, что все остальные данные повторяются. Если появляются неповторяющиеся данные - увеличивать N на единицу и снова на п.3. Если есть подозрения, что память больше 1Гбит, повторять до нового предполагаемого предела.
Если информацию в памяти сохранять не надо, Проверить можно и так: 1. Пишем с начала последовательные двоичные числа разрядности скажем 256, начиная с нуля затем пробегаем 2^N бит вперед, пишем дальше следующее число, возвращаемся назад na 2^N бит и проверяем, что там оказалось. Если нуль, увеличиваем N на 1 и пишем дальше числа, возвращаясь назад каждый раз, когда адрес достигает степени двойки, пока первый ноль не окажется затерт.
p.s. первый вариант алгоритма когда-то использовал для проверки объема прошитых ПЗУ-шек, вставляемых в программатор.
А считать всю память реально?
1. N=0
2. Читаем 2^N бит, запоминаем, 3. читаем следующие 2^N бит, тоже запоминаем, сравниваем с первыми 2^N бит. 4. Если не совпадают, увеличиваем N на 1 и возвращаемся к п.3 Если первые 2^N бит совпадают со вторыми 2^N, N становится кандидатом на количество адресов памяти. 5. Читаем все остальное до предполагаемого предела - 1Гбита, проверяя, что все остальные данные повторяются. Если появляются неповторяющиеся данные - увеличивать N на единицу и снова на п.3. Если есть подозрения, что память больше 1Гбит, повторять до нового предполагаемого предела.
Если информацию в памяти сохранять не надо, Проверить можно и так: 1. Пишем с начала последовательные двоичные числа разрядности скажем 256, начиная с нуля затем пробегаем 2^N бит вперед, пишем дальше следующее число, возвращаемся назад na 2^N бит и проверяем, что там оказалось. Если нуль, увеличиваем N на 1 и пишем дальше числа, возвращаясь назад каждый раз, когда адрес достигает степени двойки, пока первый ноль не окажется затерт.
p.s. первый вариант алгоритма когда-то использовал для проверки объема прошитых ПЗУ-шек, вставляемых в программатор.
|
|
|
|
Добавлено: Чт июн 14, 2012 19:43 |
|
|
|
|
|
Заголовок сообщения: |
Re: *Помогите найти объем памяти |
|
|
если диапазон до 1 гигабита, обнуляем более 1 гигабита и затем устанавливаем единственную единичную ячейку - бит и затем движемся по кругу :ищем её, длина пути поиска и будет объём памяти "не простую а с данными слу чаными"
если диапазон до 1 гигабита, обнуляем более 1 гигабита и затем устанавливаем единственную единичную ячейку - бит и затем движемся по кругу :ищем её, длина пути поиска и будет объём памяти :?: "не простую а с данными слу[u]чаны[/u]ми"
|
|
|
|
Добавлено: Чт июн 14, 2012 19:36 |
|
|
|
|
|
Заголовок сообщения: |
*Помогите найти объем памяти |
|
|
Подарили мне микросхему памяти, да не простую а с данными случаными, только забыли сообщить, каков у нее объем, а узнать, сколько же места в ней хочется. Чтение из нее последовательное, можно за раз только один бить прочесть, и перебирать адреса в ней можно только по одному биту (либо бит влево, либо бит вправо), соответсвенно читать и писать можно, но только в текущее положение. Помогите достоверно определить, сколько же памяти мне подарили. : сколькобит ( --> # ) ; так как микросхему подарили только мне, то проверить алгоритм можно только с помощью следующего кода-симулятора: TIMER@ D>S 137 MOD ABS BEGIN RANDOM DROP *WHILE 1 - REPEAT DROP 0x1000 CHOOSE 1 MAX CONSTANT объем
объем BLOCK VALUE память 0 VALUE адрес
: текущий ( --> addr ) адрес память + ;
: влево ( --> ) адрес 1 - [ объем 1 - ] LITERAL UMIN TO адрес ; : вправо ( --> ) адрес 1 + объем UMOD TO адрес ; : прочесть ( --> flag ) текущий B@ 0 <> ; : изменить ( --> ) прочесть -1 XOR текущий B! ; \ инициализация массива объем BEGIN *WHILE RANDOM 1 AND IF изменить THEN вправо 1 - REPEAT DROP \ случайный адрес объем CHOOSE TO адрес вместо xxx подставить случайные числа, массив проинициализировать случайным содержимым. Размер любой в диапазоне от одной ячейки до 1 Гигабита. Обратите внимание на то, что адресация закольцована, т.е. перейдя последний бит попадаем в первый, и наоборот. *поправил код симулятора памяти
Подарили мне микросхему памяти, да не простую а с данными случаными, только забыли сообщить, каков у нее объем, а узнать, сколько же места в ней хочется. Чтение из нее последовательное, можно за раз только один бить прочесть, и перебирать адреса в ней можно только по одному биту (либо бит влево, либо бит вправо), соответсвенно читать и писать можно, но только в текущее положение. Помогите достоверно определить, сколько же памяти мне подарили.
[pre]: сколькобит ( --> # ) ;[/pre]
так как микросхему подарили только мне, то проверить алгоритм можно только с помощью следующего кода-симулятора: [pre]TIMER@ D>S 137 MOD ABS BEGIN RANDOM DROP *WHILE 1 - REPEAT DROP 0x1000 CHOOSE 1 MAX CONSTANT объем
объем BLOCK VALUE память 0 VALUE адрес
: текущий ( --> addr ) адрес память + ;
: влево ( --> ) адрес 1 - [ объем 1 - ] LITERAL UMIN TO адрес ; : вправо ( --> ) адрес 1 + объем UMOD TO адрес ; : прочесть ( --> flag ) текущий B@ 0 <> ; : изменить ( --> ) прочесть -1 XOR текущий B! ; \ инициализация массива объем BEGIN *WHILE RANDOM 1 AND IF изменить THEN вправо 1 - REPEAT DROP \ случайный адрес объем CHOOSE TO адрес[/pre] вместо xxx подставить случайные числа, массив проинициализировать случайным содержимым. Размер любой в диапазоне от одной ячейки до 1 Гигабита. Обратите внимание на то, что адресация закольцована, т.е. перейдя последний бит попадаем в первый, и наоборот.
[size=85][color=#FF4000]*поправил код симулятора памяти[/color][/size]
|
|
|
|
Добавлено: Чт июн 14, 2012 18:48 |
|
|
|
|