Розшифруйте шрифт Брайля


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, представлених як звичайний тип рядка у вашій мові (наприклад, масив char, char pointer) у будь-якому підтримуваному популярному кодуванні (UTF-8, UCS-2 тощо).

  • Пробіли на виході - це добре.


EDIT: вибачте тих, чиї браузери неправильно видають крапки, це має виглядати приблизно так (зображення): штучний шрифт


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

Відповіді:


14

Пітон 3 , 181 179 171 167 161 159 байт

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

-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 на і-або трюк
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

@ngn Спасибі :) Об'єдналися з черговою оптимізацією в очікуванні.
Арнольд

Чи можу я запитати, як ви придумали геніального x%854%89%35? Ви пробували багато різних випадкових модулів?
ngn

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.