Décoder le faux braille

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

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

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

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

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

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

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

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

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

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

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

Version ASCII de ce qui précède

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

À propos des caractères braille

Un caractère braille contient un rectangle de 4 x 2 points, qui peut être considéré comme une matrice booléenne.

La concaténation de toutes ces matrices est une matrice booléenne de 4 x 2 * n, où n est la longueur de la chaîne d'entrée.

Vous devez rechercher des lignes verticales sans points et les utiliser comme séparateurs pour diviser la grande matrice en matrices plus petites pour chaque caractère.

Ensuite, recherchez des modèles pour les convertir en lettres de l'alphabet anglais ou en espaces. Notez qu'après avoir supprimé les séparateurs (lignes verticales vides), un espace est une matrice 4 x 0.

Voici une description de l'alphabet 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
----+-----+----+-----+----+----+-----+-----+---+----+------+----+-------+------+-----+-----+------+-----+-----+-----+-----+-----+-------+-----+-----+----
.#. | ##. | .# | ##. | ## | ## | .## | #.# | # | .# | #.#. | #. | #...# | #..# | .#. | ##. | .##. | ##. | .## | ### | #.# | #.# | #...# | #.# | #.# | ###
#.# | ### | #. | #.# | ## | #. | #.. | #.# | # | .# | ##.. | #. | ##.## | ##.# | #.# | #.# | #..# | #.# | #.. | .#. | #.# | #.# | #.#.# | .#. | #.# | ..#
### | #.# | #. | #.# | #. | ## | #.# | ### | # | .# | #.#. | #. | #.#.# | #.## | #.# | ##. | #.## | ##. | .## | .#. | #.# | #.# | #.#.# | .#. | .#. | .#.
#.# | ### | .# | ### | ## | #. | .## | #.# | # | #. | #..# | ## | #...# | #..# | .#. | #.. | .### | #.# | ##. | .#. | ### | .#. | .#.#. | #.# | .#. | ###

spécification

  • L'entrée est une séquence de points de code Unicode dans la plage U + 2800..U + 28FF représentée comme le type de chaîne habituel dans votre langue (par exemple tableau de caractères, pointeur de caractères) dans n'importe quel codage populaire pris en charge (UTF-8, UCS-2 , etc).

  • Les espaces de fin dans la sortie sont corrects.


EDIT: excuses à ceux dont les navigateurs ne rendent pas les points, c'est censé ressembler à ceci (image): faux braille

ngn
la source
5
votre tâche consiste à décoder du texte comme celui-ci / les lettres ont quatre points de haut et de largeur variable / une ligne verticale vide sépare les caractères / un espace est de largeur nulle / il semble donc que les mots soient séparés par deux lignes / l'entrée est une chaîne contenant du faux braille de / uniquement les lettres majuscules et les espaces en anglais / abcdefghijklmnopqrstuvwxyz / la sortie peut être en majuscules ou en minuscules / les gains les plus courts / pas de failles / liés
ngn
2
Modèles braille
Arnauld

Réponses:

14

Python 3 , 181 179 171 171 167 161 159 octets

Entrée par octets UTF-16 little-endian sans BOM. Décomposer d'abord en colonnes en utilisant des décalages de bits, divisés par colonne vide, puis les hacher dans une table de recherche.

-2 octets grâce à ngn .
-5 octets grâce à M. 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('@'))

Essayez-le en ligne!

Colera Su
la source
python ne se plaindra pas si vous supprimez l'espace entre 39et if; c'est encore plus court si vous remplacez if-else par l'astuce and-or
ngn
175 octets en remplaçant i and int(i,27)%15472%39or 0par int(i or'0')%15472%39--- Essayez-le en ligne!
M. Xcoder
Et 174 octets en attribuant ''.joinà une variable --- Essayez-le en ligne!
M. Xcoder,
11

JavaScript (ES6), 148 146 143 octets

1 octet enregistré grâce à @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

Cas de test

Arnauld
la source
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 Merci :) Fusionné avec une autre optimisation en attente.
Arnauld
Puis-je demander, comment avez-vous trouvé le brillant x%854%89%35? Avez-vous essayé de nombreux modules aléatoires différents?
ngn
@ngn J'ai essayé m0 <1000 , m1 <m0 , m2 <m1 (en fait avec d'autres optimisations, mais c'est l'idée). Et pour le facteur par lequel x est multiplié: [4,6,8,9,10,11,12] et [15 ... 31] . J'essaie actuellement d'autres approches.
Arnauld
4

Python 3 , 305 302 301 286 251 198 182 octets

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')))

Essayez-le en ligne!

TFeld
la source
302 (-3 octets)
M. Xcoder
@ Mr.Xcoder Merci :)
TFeld