Расшифровать искусственный шрифт Брайля


21
⢣⠃⢎⠆⣇⡇⡯⡂⠈⡏⢰⢵⢐⡭⢸⠪⡀⢸⢐⡭⠀⢹⠁⢎⠆⢸⣱⢸⡃⢎⠰⡱⢸⣱⢸⡃⠈⡏⢸⡃⡱⡁⢹⠁⢸⡀⡇⡗⢅⢸⡃⠈⡏⢸⢼⢸⢐⡭⠀

⣇⢸⡃⢹⠁⢹⠁⣟⢸⢕⢐⡭⠀⡮⡆⡯⡂⣟⠀⡯⠰⡱⢸⣸⢸⢕⠀⣏⡆⢎⠆⢹⠁⣪⠅⢸⢼⢸⠰⣩⢸⢼⠀⡮⡆⡗⢼⢸⣱⠀⢎⠆⡯⠀⢇⠇⡮⡆⡯⡂⡇⡮⡆⣟⡆⣇⢸⡃⠸⡰⡸⢸⢸⣱⠈⡏⢸⢼⠀

⢎⠆⡗⢼⢸⡃⢸⡃⡗⠔⡇⡯⠂⢹⠁⢣⠃⠸⡸⢸⡃⡯⡂⢹⠁⡇⢎⢰⢵⢸⡀⢸⡀⡇⡗⢼⢸⡃⢐⡭⢸⡃⡯⠂⡮⡆⡯⡂⡮⡆⢹⠁⣟⢐⡭⠀⢎⢸⢼⢰⢵⢸⢕⢰⢵⠰⡁⢹⠁⣟⢸⢕⢐⡭⠀

⡮⡆⢐⡭⢸⠕⢰⢵⠰⡁⣟⠀⡇⣪⠅⢈⣝⢸⡃⡯⡂⢎⠆⠸⡰⡸⢸⢸⣱⠈⡏⢸⢼⠀

⣪⠅⢎⠆⢸⠈⡏⠀⣇⠰⡱⠰⡱⢸⠪⡀⣪⠅⢸⡀⡇⡗⢅⢸⡃⠸⡰⡸⠰⡱⢸⢕⢸⣱⢐⡭⠀⡮⡆⡯⡂⣟⠀⣪⠅⣟⢸⠕⢰⢵⢸⢕⢰⢵⠈⡏⢸⡃⣏⡆⢸⣳⠘⡜⠀⢹⠁⢇⢆⠇⢎⠆⢸⡀⡇⡗⢼⢸⡃⣪⠅

⡇⡗⢼⢸⠕⢸⣸⠈⡏⠀⡇⣪⠅⢰⢵⠀⣪⠅⢹⠁⡯⡂⡇⡗⢼⠰⣩⠀⢎⠰⡱⢸⠢⡇⢹⠁⡮⡆⡇⡗⢼⢸⢸⠢⡇⢎⡅⢸⠅⡮⡆⣇⡇⡱⡁⢸⣳⢸⢕⢰⢵⢸⢸⡀⣇⢸⡃⠰⡱⢸⠅

⢎⠆⡗⢼⢸⡀⢣⠃⢸⡃⡗⢼⠰⣩⢸⡀⡇⣪⠅⡧⡇⢸⣸⢸⠕⢸⠕⢸⡃⡯⡂⢎⢰⢵⢐⡭⢸⡃⢸⡀⣟⠈⡏⠈⡏⢸⡃⡯⡂⣪⠅⢰⢵⢸⠢⡇⣏⡆⢐⡭⢸⠕⢰⢵⠰⡁⣟⢐⡭⠀

⡮⡆⣟⡆⢎⢸⣱⢸⡃⡯⠰⣩⢸⢼⢸⢀⠇⡗⢅⢸⡀⡗⠔⡇⡗⢼⠰⡱⢸⠕⠰⣩⡆⡯⡂⣪⠅⢹⠁⣇⡇⢇⠇⢇⢆⠇⡱⡁⢣⠃⣩⡃

⢎⠆⣇⡇⢹⠁⡯⠂⣇⡇⢹⠁⢸⠢⢺⢰⢵⠘⡜⠀⣟⡆⣟⠀⣇⡇⡯⠂⡯⠂⣟⢸⢕⠀⢎⠆⡯⡂⢸⡀⢎⠆⢇⢆⠇⣟⢸⢕⠰⡁⡮⡆⣪⠅⣟⠀

⣪⠅⡧⡇⢎⠆⡯⡂⢹⠁⣟⢐⡭⠈⡏⠀⢇⢆⠇⡇⡗⢼⢐⡭⠀

⡗⢼⠰⡱⠀⣇⠰⡱⠰⡱⢸⠕⢸⢼⠰⡱⢸⡀⣟⢐⡭⠀

Версия ASCII выше

⡯⡂⣟⢸⡀⡮⡆⢹⠁⣟⢸⣱⠀

О персонажах Брайля

Символ Брайля упаковывает прямоугольник точек размером 4 на 2, который можно рассматривать как булеву матрицу.

Конкатенация всех таких матриц представляет собой булеву матрицу 4 на 2 * n, где n - длина входной строки.

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

Затем найдите шаблоны, чтобы преобразовать их в буквы английского алфавита или пробелы. Обратите внимание, что после удаления разделителей (вертикальных пустых строк) пробел представляет собой матрицу 4 на 0.

Ниже приведено описание алфавита в ASCII:

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
----+-----+----+-----+----+----+-----+-----+---+----+------+----+-------+------+-----+-----+------+-----+-----+-----+-----+-----+-------+-----+-----+----
.#. | ##. | .# | ##. | ## | ## | .## | #.# | # | .# | #.#. | #. | #...# | #..# | .#. | ##. | .##. | ##. | .## | ### | #.# | #.# | #...# | #.# | #.# | ###
#.# | ### | #. | #.# | ## | #. | #.. | #.# | # | .# | ##.. | #. | ##.## | ##.# | #.# | #.# | #..# | #.# | #.. | .#. | #.# | #.# | #.#.# | .#. | #.# | ..#
### | #.# | #. | #.# | #. | ## | #.# | ### | # | .# | #.#. | #. | #.#.# | #.## | #.# | ##. | #.## | ##. | .## | .#. | #.# | #.# | #.#.# | .#. | .#. | .#.
#.# | ### | .# | ### | ## | #. | .## | #.# | # | #. | #..# | ## | #...# | #..# | .#. | #.. | .### | #.# | ##. | .#. | ### | .#. | .#.#. | #.# | .#. | ###

Спецификация

  • Входные данные представляют собой последовательность кодовых точек Unicode в диапазоне U + 2800..U + 28FF, представленных как обычный тип строки на вашем языке (например, массив символов, указатель символов) в любой поддерживаемой поддерживаемой кодировке (UTF-8, UCS-2). , и т.д).

  • Конечные пробелы в выводе в порядке.


РЕДАКТИРОВАТЬ: извинения тем, чьи браузеры ошибаются точки, он должен выглядеть следующим образом (изображение): лже-брайль


5
ваша задача - декодировать текст следующим образом / буквы имеют высоту четыре точки и переменной ширины / одна пустая вертикальная строка отделяет символы / пробел равен нулевой ширине / поэтому похоже, что слова разделены двумя строками / ввод представляет собой строку, содержащую ложный шрифт Брайля из / только английские заглавные буквы и пробелы / abcdefghijklmnopqrstuvwxyz / выходные данные могут быть прописными или строчными /
самые

Ответы:


14

Python 3 , 181 179 171 167 161 159 байт

Ввод UTF-16 байтов с прямым порядком байтов без спецификации. Сначала разбейте на столбцы, используя битовые сдвиги, разделите на пустой столбец, затем хэшируйте их в таблицу поиска.

-2 байта благодаря ngn .
-5 байт благодаря мистеру Xcoder .

lambda h,j=''.join:j(' ZAQV;JWP;MBOS;YRKCGXDF;ILHUENT'[int('0'+i,27)%544%135%32]for i in j(chr(64|i&7|i>>3&8)+chr(64|i>>3&7|i>>4&8)for i in h[::2]).split('@'))

Попробуйте онлайн!


Python не будет жаловаться, если вы удалите пробел между 39и if; это даже короче, если заменить if-else на трюк and-or
ngn

175 байт, заменив i and int(i,27)%15472%39or 0на int(i or'0')%15472%39--- Попробуйте онлайн!
г-н Xcoder

И 174 байта путем присвоения ''.joinпеременной --- Попробуйте онлайн!
г-н Xcoder

11

JavaScript (ES6), 148 146 143 байта

Сохранено 1 байт благодаря @ngn

s=>[...s].map(c=>g((k=c.charCodeAt()/8)&8|k*8&7)&g(k&7|k/2&8),o=x='',g=n=>x=n?x*27+n:(o+=' DZQGYWXNHJ.CSTIO.AFB.LPVE..KUMR'[x%854%89%35],n))&&o

Контрольные примеры


g((k=c.charCodeAt())&7|k/8&8)&g(k/8&7|k/16&8)->g((k=c.charCodeAt()/8)&8|k*8&7)&g(k&7|k/2&8)
нгн

@ngn Спасибо :) Объединено с другой ожидающей оптимизацией.
Арно

Могу я спросить, как вы пришли с бриллиантом x%854%89%35? Вы пробовали много разных случайных модулей?
нгн

@ngn Я пробовал m0 <1000 , m1 <m0 , m2 <m1 (на самом деле с некоторыми другими оптимизациями, но это идея). И фактор , с помощью которого х умножается: [4,6,8,9,10,11,12] и [15 ... 31] . В настоящее время пробует некоторые другие подходы.
Арно

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.