Получить письмо (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, "");
}
}