@Wolnerlol

Как сделать азбуку Морзе в обратную сторону?

Пробую сделать азбуку Морзе еще и в обратную сторону, то есть буквы нормально переводит а вот тире и точки не очень, была мысль записать так: { '---', "o"}, { '...', "s"}, но при этом пришлось закомментировать тире и точку чтоб попробовать передать "... --- ..."
spoiler
#include <iostream>
#include <string>
#include <map>
#include <cctype>
#include <locale>

using namespace std;

map <char, string> morze = {
    	{ 'a', ".-"},
    	{ 'b', "-..."},
    	{ 'c', "-.-."},
    	{ 'd', "-.."},
    	{ 'e', "."},
    	{ 'f', "..-."},
    	{ 'g', "--."},
    	{ 'h', "...."},
    	{ 'i', ".."},
    	{ 'j', ".---"},
    	{ 'k', "-.-"},
    	{ 'l', ".-.."},
    	{ 'm', "--"},
    	{ 'n', "-."},
    	{ 'o', "---"},
    	{ 'p', ".--."},
    	{ 'q', "--.-"},
    	{ 'r', ".-."},
    	{ 's', "..."},
    	{ 't', "-"},
    	{ 'u', "..-"},
    	{ 'v', "...-"},
    	{ 'w', ".--"},
    	{ 'x', "-..-"},
    	{ 'y', "-.--"},
    	{ 'z', "--.."},
    	{ '1', ".----"},
    	{ '2', "..---"},
    	{ '3', "...--"},
    	{ '4', "....-"},
    	{ '5', "....."},
    	{ '6', "-...."},
    	{ '7', "--..."},
    	{ '8', "---.."},
    	{ '9', "----."},
    	{ '0', "-----"},
    	//{ '.', "......"},
    	{ ',', ".-.-.-"},
    	{ ':', "---..."},
    	{ ';', "-.-.-."},
    	{ '(', "-.--.-"},
    	{ ')', "-.--.-"},
    	{ '"', ".-..-."},
    	//{ '-', "-....-"},
    	{ '/', "-..-."},
    	{ '?', "..--.."},
    	{ '!', "--..--"},
    	{ ' ', "-...-"},
    	{ '@', ".--.-."},

    	{ '---', "o"},
    	{ '...', "s"},

};

int main() {

    
	string text;

	while(cin >> text) {
	    for(int i = 0; i < text.length(); i++) {
	    	text[i] = tolower(text[i]);
	    	cout << morze.find( text[i] )->second <<"  ";
	    }
	}

	return 0;
}
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Если нет пауз между буквами, то задача однозначно не решается:
Например, "vz" и "3d" одинаково кодируются "...---.." ("...-- -.." и "...- --..").
В худшем случае, неправильная интерпретация первых символов может сделать расшифровку в самом конце невозможной.

Поэтому надо или писать полный перебор, или, что будет гораздо эффеективнее, динамическое программирование.
Поскольку это все явно гораздо выше уровня вопроса, то предполагаю, что в вашей задаче пробелы, все-таки, есть.

Тогда надо разбить строку на отдельные "слова" - группы тире и точек, разделенные пробелами и каждую группу перевести в букву по таблице. Таблицу в идеале надо хранить в trie ("бор" по русски), но эта структура не реализована в стандартной библиотеке C++, поэтому можно воспользоваться просто std::map<std::string, char>

Edit: Разумеется, таблица для обратного перевода должна быть отдельной переменной. Не получится смешать в одну кучу переводы и туда и обратно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы