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

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #45 : Сентябрь 25, 2012, 11:36:31 am »
Да, еще картинка, вдруг кто не видел, и вдруг она поможет написать декодер
(ссылка на картинку: http://upload.wikimedia.org/wikipedia/commons/c/ca/Morse_code_tree3.png ):

Y = λf.(λx.f (x x)) (λx.f (x x))

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #46 : Сентябрь 25, 2012, 11:50:11 am »
А что, накопить точки и тире до паузы и получить символ из хеш-таблицы религия не позволяет?

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #47 : Сентябрь 25, 2012, 11:58:27 am »
А что, накопить точки и тире до паузы и получить символ из хеш-таблицы религия не позволяет?
Ну попробуй сделать. На Обероне :-)

PS. Давеча товарисч один плакался что в C# нет HashSet (под WP7).
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #48 : Сентябрь 25, 2012, 12:51:29 pm »
ну нет в Обероне проблемы накопить двоичные 1 и 0, а точка и тире это и есть 1 и 0, или 0 и 1, как захочешь. устанавливай для каждой 1-цы нужны бит в SET'е, например, даже сдвигать ничего не нужно

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #49 : Сентябрь 25, 2012, 01:04:35 pm »
ну нет в Обероне проблемы накопить двоичные 1 и 0, а точка и тире это и есть 1 и 0, или 0 и 1, как захочешь. устанавливай для каждой 1-цы нужны бит в SET'е, например, даже сдвигать ничего не нужно
Вот про set'ы идея действительно хорошая.

Но я не понял почему сдвигать ничего не нужно. ".-" это не то же самое что "-.".

Кроме того, что делать если у нас в SET (32 бита) не влезло?
Y = λf.(λx.f (x x)) (λx.f (x x))

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #50 : Сентябрь 25, 2012, 01:05:31 pm »
Да, еще картинка, вдруг кто не видел, и вдруг она поможет написать декодер
Только что сегодня вспоминал про эту картинку когда задумался, а как же в правильных языках извернуться , чтобы из тире-точек буковку получить :)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #51 : Сентябрь 25, 2012, 01:11:44 pm »
И всё обошлось одной строкой символов и вычисляемым смещением

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #52 : Сентябрь 25, 2012, 01:47:49 pm »
Но я не понял почему сдвигать ничего не нужно. ".-" это не то же самое что "-.".

Кроме того, что делать если у нас в SET (32 бита) не влезло?
зачем вращать? читаешь сигнал ты всегда с одной стороны, в сет ты накапливаешь точки и тире  всегда с одной стороны и только одного символа. То что они получатся задом-наперед не страшно - там вообще байта достаточно, а для байта таблица конвертации 256, не имеет значения с младшего бита или старшего учитывать, они же все с одной стороны упакованы.

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #53 : Сентябрь 25, 2012, 01:52:02 pm »
Чтобы небыло недопонимания. В SET мы накапливаем не Такты, не Тики и Таки, а а уже распознанные Знаки Символа - точки и тире

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #54 : Сентябрь 25, 2012, 01:53:29 pm »
Но я не понял почему сдвигать ничего не нужно. ".-" это не то же самое что "-.".

Кроме того, что делать если у нас в SET (32 бита) не влезло?
зачем вращать? читаешь сигнал ты всегда с одной стороны, в сет ты накапливаешь точки и тире  всегда с одной стороны и только одного символа. То что они получатся задом-наперед не страшно - там вообще байта достаточно, а для байта таблица конвертации 256, не имеет значения с младшего бита или старшего учитывать, они же все с одной стороны упакованы.
На счет переполнения: к нам вполне может прилететь подряд 100 точек. Да, это не валидный код морзе, но такое может случиться.

На счет накопления: в обероне же нельзя сделать так:
VAR
   acc : SET;
   i   : INTEGER; (* i - позиция символа, она растет *)
BEGIN
   acc := acc + {i};
END;
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #55 : Сентябрь 25, 2012, 01:55:57 pm »
Если хочется вообще весь сигнал загнать в SET'ы, то понятно, что это ARRAY OF SET и процедуры для доступа с произвольному биту/битам, в А2 что-то подобное есть, но перевести на  ТруОберон не проблема.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #56 : Сентябрь 25, 2012, 02:04:20 pm »
Как-то не понятно с SETами,  каким образом 0 от 00 к примеру собираетесь отличить? Или я совсем не в теме:)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #57 : Сентябрь 25, 2012, 02:09:31 pm »
Если хочется вообще весь сигнал загнать в SET'ы, то понятно, что это ARRAY OF SET и процедуры для доступа с произвольному биту/битам, в А2 что-то подобное есть, но перевести на  ТруОберон не проблема.
Для начала мне хочется хотя бы в 32битный SET нормально загнать :-) Ниужели придется делать как то так?
VAR
   acc : SET;
   i   : INTEGER; (* i - позиция символа, она растет *)
BEGIN
   CASE i OF
         0: acc := acc + {0};
      |  1: acc := acc + {1};
      |  2: acc := acc + {2};
      |  3: acc := acc + {3};
      |  4: acc := acc + {4};
      |  5: acc := acc + {5};
      |  6: acc := acc + {6};
      |  7: acc := acc + {7};
      |  8: acc := acc + {8};
      |  9: acc := acc + {9};
      | 10: acc := acc + {10};
      | 11: acc := acc + {11};
      | 12: acc := acc + {12};
      | 13: acc := acc + {13};
      | 14: acc := acc + {14};
      | 15: acc := acc + {15};
      | 16: acc := acc + {16};
      | 17: acc := acc + {17};
      | 18: acc := acc + {18};
      | 19: acc := acc + {19};
      | 20: acc := acc + {20};
      | 21: acc := acc + {21};
      | 22: acc := acc + {22};
      | 23: acc := acc + {23};
      | 24: acc := acc + {24};
      | 25: acc := acc + {25};
      | 26: acc := acc + {26};
      | 27: acc := acc + {27};
      | 28: acc := acc + {28};
      | 29: acc := acc + {29};
      | 30: acc := acc + {30};
      | 31: acc := acc + {31};
   END
END;

Да, а бесконечный SET не поможет. То есть если к нам прилетело много точек, то в этом случае у нас просто кончится память.
Y = λf.(λx.f (x x)) (λx.f (x x))

Kemet

  • Hero Member
  • *****
  • Сообщений: 587
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #58 : Сентябрь 25, 2012, 02:10:32 pm »
На счет переполнения: к нам вполне может прилететь подряд 100 точек. Да, это не валидный код морзе, но такое может случиться.
А кто сказал, что будет легко? получили разрыв между буквами, сбросили все биты, пробежали до конца Сета, сбросили все биты, ждем разделитель между буквами/словами, все равно дефективная передача, не распознали начали снова...
На счет накопления: в обероне же нельзя сделать так:
Ну к примеру CASE используй или LONGINT и множитель соответсвующий

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Задачка: декодер морзе.
« Ответ #59 : Сентябрь 25, 2012, 02:11:32 pm »
Как-то не понятно с SETами,  каким образом 0 от 00 к примеру собираетесь отличить? Или я совсем не в теме:)
Набор точек-тире это SET + INTEGER в котором лежит число точек/тире в этом сете.
Y = λf.(λx.f (x x)) (λx.f (x x))