Автор Тема: Задачка: декодер морзе.  (Прочитано 43255 раз)

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #60 : Сентябрь 25, 2012, 02:13:23 pm »
Как-то не понятно с SETами,  каким образом 0 от 00 к примеру собираетесь отличить? Или я совсем не в теме:)
У нас же счетчик битов есть, если загнали 2 тире, то ясно, что 00 это два тире

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #61 : Сентябрь 25, 2012, 02:17:41 pm »
Я где-то встречал "Разработки на Глаголе", там очень подробно с примерами показано было как имитировать с помощью СЕТов логические операции, устанавливать/сбрасывать  произвольные биты, учитывая, что Глагол это плохо переведенный Оберон, но там все одинаково

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #62 : Сентябрь 25, 2012, 02:21:25 pm »
Я где-то встречал "Разработки на Глаголе", там очень подробно с примерами показано было как имитировать с помощью СЕТов логические операции, устанавливать/сбрасывать  произвольные биты, учитывая, что Глагол это плохо переведенный Оберон, но там все одинаково
Ну, в принципе можно и на INTEGER'ах сделать. Умножение на 2 и целочисленное деление на 2 никто не отменял.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #63 : Сентябрь 25, 2012, 02:24:20 pm »
вот код из А2 для BitSets, где data = POINTER TO ARRAY OF SET
  PROCEDURE SetBit* (pos: LONGINT; value: BOOLEAN);
  BEGIN
    ASSERT (pos >= 0); ASSERT (pos < size);
    IF value THEN
      INCL (data[pos DIV Elements], pos MOD Elements);
    ELSE
      EXCL (data[pos DIV Elements], pos MOD Elements);
    END;
  END SetBit;

  PROCEDURE GetBit* (pos: LONGINT): BOOLEAN;
  BEGIN
    ASSERT (pos >= 0); ASSERT (pos < size);
    RETURN pos MOD Elements IN data[pos DIV Elements];
  END GetBit;

  PROCEDURE SetBits* (startPos, bits, value: LONGINT);
  VAR adr: SYSTEM.ADDRESS;
  BEGIN
    ASSERT (startPos >= 0); ASSERT (startPos+bits <= size);
    IF (bits = 8) & (startPos MOD 8 = 0) THEN
      adr := SYSTEM.ADR(data[0])+startPos DIV 8;
      SYSTEM.PUT(adr, CHR(value));
    ELSE
      WHILE bits > 0 DO
        SetBit (startPos, ODD (value)); value := value DIV 2;
        INC(startPos); DEC(bits)
      END;
      WHILE bits < 0 DO
        SetBit (startPos, ODD (value)); value := value DIV 2;
        DEC(startPos); INC(bits)
      END;
    END;
  END SetBits;

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #64 : Сентябрь 25, 2012, 02:25:55 pm »
Я где-то встречал "Разработки на Глаголе", там очень подробно с примерами показано было как имитировать с помощью СЕТов логические операции, устанавливать/сбрасывать  произвольные биты, учитывая, что Глагол это плохо переведенный Оберон, но там все одинаково
Ну, в принципе можно и на INTEGER'ах сделать. Умножение на 2 и целочисленное деление на 2 никто не отменял.

Другое дело что финальный CASE будет смотреться убого. Вместо понятной таблицы (или набора таблиц) со строками вида:
".-" -> 'A'
"---" -> 'S'
Ну или пусть даже даже
  {1} : c := 'A'
 |{0,1,2} : c := 'S'
Будет ужоз вида:
  1H : c:= 'A'
| 7H : c:= 'S'
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #65 : Сентябрь 25, 2012, 02:26:52 pm »
Т.е. в Активном Обероне так можно можно, без всяких заморочек

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #66 : Сентябрь 25, 2012, 02:27:04 pm »
Поясню всё же свои недавние посты  о трансляции кода в букву.

Преобразовывать имеет смысл, если длина кода не выходит за некие рамки. Если ограничится только цифро-буквенными, как в таблице из http://oberspace.dyndns.org/index.php/topic,338.msg9056.html#msg9056, то длина будет не больше 5.

Теперь можно посмотреть на дерево из http://oberspace.dyndns.org/index.php/topic,338.msg9137.html#msg9137

Принятый код из 0(точек)  и 1(тире)  преобразуем в целое  - получим смещение (на соответствующем длине кода горизонтальном уровне)  в дереве.  Вся идея в том, что все буковки из этого дерева выстроить в линию, сначала все с уровня 1, затем все с уровня 2 и т.д до уровня 5. Там, где символ не определён или всякие умляуты поставить некий символ-заменитель, означающий запрещённый код (можно, к примеру маленькую 'x').
Тогда символ соответствующий принятому коду будет на позиции в получившейся строке равной сумме вычисленного целого  и   "смещения до уровня", равного 2 в степени "длина принятого кода" минус 2

А сама строка буде такая:
ETIANMSURWDKGOHVFxLxPJBXCYZQxx54x3xxx2xx+xxxx16=/xxxxx7xxx8x90

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #67 : Сентябрь 25, 2012, 02:28:33 pm »
В Обероне INCL тоже работает

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #68 : Сентябрь 25, 2012, 02:30:48 pm »
Другое дело что финальный CASE будет смотреться убого. Вместо понятной таблицы (или набора таблиц) со строками вида:
".-" -> 'A'
"---" -> 'S'
Ну или пусть даже даже
  {1} : c := 'A'
 |{0,1,2} : c := 'S'
Будет ужоз вида:
  1H : c:= 'A'
| 7H : c:= 'S'
А зачем, когда можно просто строку на 256 символов с пробелами в пустых местах и по индексу переводи
« Последнее редактирование: Сентябрь 25, 2012, 02:32:54 pm от Kemet »

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #69 : Сентябрь 25, 2012, 02:38:13 pm »
В Обероне INCL тоже работает
Но не так.
Цитировать
INCL(v, x)       v: SET; x: INTEGER       v:=v + {x}
Also for INCL and EXCL, x must be a constant.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #70 : Сентябрь 25, 2012, 03:00:27 pm »
Хех, ну тогда остается CASE )))
и
SetVal := SetVal + SYSTEM.VAL( SET, longintval )

или +-*/ над множествами тоже не работают?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #71 : Сентябрь 25, 2012, 03:09:29 pm »
Хех, ну тогда остается CASE )))
и
SetVal := SetVal + SYSTEM.VAL( SET, longintval )

или +-*/ над множествами тоже не работают?
+-*/ там перегружены же для другого:
symbol result
+ union
- difference
* intersection
/ symmetric set difference
Y = λf.(λx.f (x x)) (λx.f (x x))

Илья Ермаков

  • Sr. Member
  • ****
  • Сообщений: 493
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #72 : Сентябрь 25, 2012, 03:14:41 pm »
А зачем этому автомату память? Разве собственно самого состояния не достаточно?
Допустим, хранить средний уровень сигнала за какой-то интервал назад...

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #73 : Сентябрь 25, 2012, 03:15:28 pm »
Да, в Тру-Обероне сложнее...
лучше, видимо, множитель использовать и потом + для Сетов, хотя придется систем тянуть
можно, конечно, и просто множители для интов.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #74 : Сентябрь 25, 2012, 03:20:35 pm »
Хех, ну тогда остается CASE )))
и
SetVal := SetVal + SYSTEM.VAL( SET, longintval )

или +-*/ над множествами тоже не работают?
+-*/ там перегружены же для другого:
symbol result
+ union
- difference
* intersection
/ symmetric set difference
Ну правильно, + и даст нам объединение двух Сетов, т.е. логическое Или, главное в longintval нужный множитель закатать