Получить письмо (AZ) из его графического представления

Как я могу получить символ (AZ) из строки, которая содержит его графическое представление? например, если я использую буквы 3х5, графическое представление для буквы "А" будет:

 #
# #
###
# #
# #

Это для 'E':

###
# 
###
#
###

Я могу продолжить, делая это, но это не выглядит должным образом!

switch (input)
//Case 1 belongs to character A
case " # \n# #\n###\n# #\n# #\n":
{
return 'A';
}
case "###\n# \n###\n#  \n###\n":
{
return 'E';
}
//till question mark
default: return '?';

Есть ли алгоритм или некоторые художественные приемы ASCII, чтобы сделать это с помощью Java?

3 ответа

Даже если вам не нужно двунаправленное отображение, я бы использовал Map хранить буквы в удобочитаемом виде:

public class Letters {

    public String getLetter(String graphicalLetter) {
        return letters.get(graphicalLetter);
    }

    private static final Map<String, String> letters = new HashMap<String, String>();

    static {
        // @formatter:off
        letters.put(
" # \n" +
"# #\n" +
"###\n" +
"# #\n" +
"# #\n"
, "A");

        letters.put(
...
, "E");
        // @formatter:on
    }
}

Таким образом, графическое представление все в одном месте и не загромождает любые другие части кода, все еще будучи читаемым для человеческого глаза.

Вы можете создать алгоритм, который, например, смотрит на количество # сначала в общем, а затем по количеству хэшей в первом столбце или строке, и находит букву таким образом, но это, вероятно, будет слишком сложным и трудным для чтения / понимания.


Для удобства чтения вы можете даже удалить \n из записей на карте и автоматически удаляя их в getLetter метод.

Вы можете разбить каждое ваше искусство ascii на линии.

B, E, D, F, H, K, L, M, N, P, Q, R, T, U, V, W, X, Y, Z

Должны ли все присутствовать персонажи в 1-й позиции первой строки

E, F, H, K, M, N, T, U, V, W, X, Y, Z

Будет присутствовать персонаж в последней позиции первой строки

E, H, K, M, N, W, X, Z

Будет иметь персонажа в нижней правой позиции

Из них только E and Z иметь персонажа в средней позиции первой строки

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

Мое мнение будет лучше, если вы попытаетесь читать искусство ASCII в разных "шрифтах" или стилях.

Вместо использования switch внутри метода для решения проблемы, вы можете создать Map использовать в качестве справочной таблицы, чьи ключи имеют то, что в настоящее время каждый case и чьи значения являются соответствующими буквами.

Map<String, String> lookup = new HashMap<>(26);
lookup.put(" ASCII art here ", " letter ");
// ...

Затем карту поиска можно использовать с простым `get(asciiArt) для возврата запрошенной буквы.

Карта может быть конечным членом класса, и вы можете заполнить его в конструкторе класса.

public class AsciiConverter {

    private final Map<String, String> letters;

    public AsciiConverter() {
        letters = new HashMap<>(26); // however many letters you need, maybe more than 26 if you're using another alphabet or special chars
        // populate
       letters.put(" # \n# #\n###\n# #\n# #\n", "A");
       // same thing for all the other letters
    }

    public String toLetter(String ascii) {
         return letters.getOrDefault(ascii, "");
    }
}
Другие вопросы по тегам