Decode Faux Braille

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

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

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

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

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

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

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

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

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

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

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

Versión ASCII de lo anterior

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

Sobre los personajes Braille

Un personaje Braille contiene un rectángulo de puntos de 4 por 2, que puede verse como una matriz booleana.

La concatenación de todas esas matrices es una matriz booleana de 4 por 2 * n, donde n es la longitud de la cadena de entrada.

Debes buscar líneas verticales sin puntos en ellas, y usarlas como separadores para dividir la matriz grande en matrices más pequeñas para cada carácter.

Luego, busque patrones para convertirlos en letras del alfabeto inglés o espacios. Tenga en cuenta que después de quitar los separadores (líneas vacías verticales), un espacio es una matriz de 4 por 0.

A continuación se muestra una descripción del alfabeto en 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
----+-----+----+-----+----+----+-----+-----+---+----+------+----+-------+------+-----+-----+------+-----+-----+-----+-----+-----+-------+-----+-----+----
.#. | ##. | .# | ##. | ## | ## | .## | #.# | # | .# | #.#. | #. | #...# | #..# | .#. | ##. | .##. | ##. | .## | ### | #.# | #.# | #...# | #.# | #.# | ###
#.# | ### | #. | #.# | ## | #. | #.. | #.# | # | .# | ##.. | #. | ##.## | ##.# | #.# | #.# | #..# | #.# | #.. | .#. | #.# | #.# | #.#.# | .#. | #.# | ..#
### | #.# | #. | #.# | #. | ## | #.# | ### | # | .# | #.#. | #. | #.#.# | #.## | #.# | ##. | #.## | ##. | .## | .#. | #.# | #.# | #.#.# | .#. | .#. | .#.
#.# | ### | .# | ### | ## | #. | .## | #.# | # | #. | #..# | ## | #...# | #..# | .#. | #.. | .### | #.# | ##. | .#. | ### | .#. | .#.#. | #.# | .#. | ###

Especificación

  • La entrada es una secuencia de puntos de código Unicode en el rango U + 2800..U + 28FF representada como el tipo de cadena habitual en su idioma (por ejemplo, matriz de caracteres, puntero de caracteres) en cualquier codificación popular admitida (UTF-8, UCS-2 , etc.)

  • Los espacios finales en la salida están bien.


EDITAR: disculpas a aquellos cuyos navegadores confunden los puntos, se supone que debe verse así (imagen): falso braille

ngn
fuente
55
su tarea es decodificar texto como este / las letras tienen cuatro puntos de alto y de ancho variable / una línea vertical vacía separa los caracteres / un espacio es de ancho cero / por lo que parece que las palabras están separadas por dos líneas / la entrada es una cadena que contiene falso braille de / solo letras y espacios en mayúscula en inglés / abcdefghijklmnopqrstuvwxyz / la salida puede ser mayúscula o minúscula / victorias más cortas / sin lagunas / relacionadas
ngn

Respuestas:

14

Python 3 , 181 179 171 167 161 159 bytes

Entrada por bytes UTF-16 little-endian sin BOM. Primero descomponga en columnas usando cambios de bits, divididos por una columna vacía, luego divídalos en una tabla de búsqueda.

-2 bytes gracias a ngn .
-5 bytes gracias al Sr. 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('@'))

Pruébalo en línea!

Colera Su
fuente
Python no se quejará si elimina el espacio entre 39y if; que es aún más corto si se reemplaza if-else con el truco and-or
NGN
175 bytes reemplazando i and int(i,27)%15472%39or 0con int(i or'0')%15472%39--- ¡ Pruébelo en línea!
Sr. Xcoder
Y 174 bytes asignándolos ''.joina una variable --- ¡ Pruébelo en línea!
Sr. Xcoder
11

JavaScript (ES6), 148 146 143 bytes

Guardado 1 byte gracias a @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

Casos de prueba

Arnauld
fuente
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 Gracias :) Se fusionó con otra optimización pendiente.
Arnauld el
¿Puedo preguntar cómo se te ocurrió el brillante x%854%89%35? ¿Probaste muchos módulos aleatorios diferentes?
ngn
@ngn He intentado m0 <1000 , m1 <m0 , m2 <m1 (en realidad con algunas otras optimizaciones, pero esa es la idea). Y para el factor por el cual x se multiplica: [4,6,8,9,10,11,12] y [15 ... 31] . Actualmente estoy intentando otros enfoques.
Arnauld
4

Python 3 , 305 302 301 286 251 198 182 bytes

def f(s,A=''):
 for c in s:l=bin(ord(c))[-8:];A+='7'+l[5:]+l[1]+'7'+l[2:5]+l[0]
 print(''.join('K.L.SXC PRU.NYEOGZVJIW..HFBTAQDM'[int('7'+c,22)%141%109%35]for c in A.split('70000')))

Pruébalo en línea!

TFeld
fuente
302 (-3 bytes)
Sr. Xcoder
@ Mr.Xcoder Gracias :)
TFeld