Это возможно сделать, но это становится проблематичным, поскольку в конечном итоге вы генерируете большое количество возможных вариантов.
Сначала начните с отображения Морзе:
private Dictionary<string, string> map = new Dictionary<string, string>()
{
{ ".-", "a" },
{ "-...", "b" },
{ "-.-.", "c" },
{ "-..", "d" },
{ ".", "e" },
{ "..-.", "f" },
{ "--.", "g" },
{ "....", "h" },
{ "..", "i" },
{ ".---", "j" },
{ "-.-", "k" },
{ ".-..", "l" },
{ "--", "m" },
{ "-.", "n" },
{ "---", "o" },
{ ".--.", "p" },
{ "--.-", "q" },
{ ".-.", "r" },
{ "...", "s" },
{ "-", "t" },
{ "..-", "u" },
{ "...-", "v" },
{ ".--", "x" },
{ "-..-", "y" },
{ "-.--", "z" },
{ "--..", " " },
};
Тогда эта функция может производить возможные декодирования:
public IEnumerable<string> DecodeMorse(string morse)
{
var letters =
map
.Where(kvp => morse.StartsWith(kvp.Key))
.Select(kvp => new
{
letter = kvp.Value,
remainder = morse.Substring(kvp.Key.Length)
})
.ToArray();
if (letters.Any())
{
var query =
from l in letters
from x in DecodeMorse(l.remainder)
select l.letter + x;
return query.ToArray();
}
else
{
return new [] { "" };
}
}
Теперь, учитывая более короткую версию вашего ввода Морзе, "-.-..--....", я получил 741 возможную строку. Вот урезанная версия:
cabe
cadee
cadi
…
tranie
trans
trateeee
…
trxii
trxse
Он включает «транс», так что, похоже, он работает.
Выполнение полной строки дает 5 914 901 возможных вариантов с "переводом" в качестве одной из возможностей.
Между прочим, было 4519 возможных строк, которые просто начинались с «транс». Удивительно, как люди смогли сделать это на лету!
person
Enigmativity
schedule
15.03.2014