Faux Braille dekodieren

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

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

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

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

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

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

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

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

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

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

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

ASCII-Version der oben genannten

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

Über Braillezeichen

Ein Braille-Zeichen packt ein 4 x 2-Rechteck aus Punkten, das als boolesche Matrix betrachtet werden kann.

Die Verkettung all dieser Matrizen ist eine 4 mal 2 * n-Boolesche Matrix, wobei n die Länge der Eingabezeichenfolge ist.

Sie sollten nach vertikalen Linien ohne Punkte suchen und diese als Trennzeichen verwenden, um die große Matrix für jedes Zeichen in kleinere Matrizen aufzuteilen.

Suchen Sie dann nach Mustern, um sie in Buchstaben des englischen Alphabets oder in Leerzeichen umzuwandeln. Beachten Sie, dass nach dem Entfernen der Trennzeichen (vertikale Leerzeilen) ein Leerzeichen eine 4 x 0-Matrix ist.

Nachfolgend finden Sie eine Beschreibung des Alphabets in 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
----+-----+----+-----+----+----+-----+-----+---+----+------+----+-------+------+-----+-----+------+-----+-----+-----+-----+-----+-------+-----+-----+----
.#. | ##. | .# | ##. | ## | ## | .## | #.# | # | .# | #.#. | #. | #...# | #..# | .#. | ##. | .##. | ##. | .## | ### | #.# | #.# | #...# | #.# | #.# | ###
#.# | ### | #. | #.# | ## | #. | #.. | #.# | # | .# | ##.. | #. | ##.## | ##.# | #.# | #.# | #..# | #.# | #.. | .#. | #.# | #.# | #.#.# | .#. | #.# | ..#
### | #.# | #. | #.# | #. | ## | #.# | ### | # | .# | #.#. | #. | #.#.# | #.## | #.# | ##. | #.## | ##. | .## | .#. | #.# | #.# | #.#.# | .#. | .#. | .#.
#.# | ### | .# | ### | ## | #. | .## | #.# | # | #. | #..# | ## | #...# | #..# | .#. | #.. | .### | #.# | ##. | .#. | ### | .#. | .#.#. | #.# | .#. | ###

Spezifikation

  • Die Eingabe ist eine Folge von Unicode-Codepunkten im Bereich U + 2800..U + 28FF, die in Ihrer Sprache (z. B. char-Array, char-Zeiger) als üblicher Zeichenfolgentyp in einer beliebigen unterstützten Codierung (UTF-8, UCS-2) dargestellt werden , etc).

  • Nachgestellte Leerzeichen in der Ausgabe sind in Ordnung.


EDIT: Entschuldigung an diejenigen, deren Browser die Punkte falsch darstellen, es soll so aussehen (Bild): Faux-Braille

ngn
quelle
5
deine aufgabe ist es, text wie diesen zu dekodieren / buchstaben sind vier punkte hoch und von variabler breite / eine leere vertikale zeile trennt zeichen / ein raum ist null breit / es sieht so aus, als ob wörter durch zwei zeilen getrennt sind / eingabe ist eine zeichenkette mit falscher blindenschrift von / nur englischen Großbuchstaben und Leerzeichen / abcdefghijklmnopqrstuvwxyz / Ausgabe kann in Groß- oder Kleinbuchstaben erfolgen / kürzeste Gewinne / keine Lücken / verwandt
ngn
2
Braillemuster
Arnauld

Antworten:

14

Python 3 , 181 179 171 167 161 159 Bytes

Eingabe durch UTF-16-Little-Endian-Bytes ohne Stückliste. Zerlegen Sie sie zunächst mithilfe von Bitverschiebungen in Spalten, teilen Sie sie durch leere Spalten auf und hacken Sie sie dann in eine Nachschlagetabelle.

-2 Bytes dank ngn .
-5 Bytes dank Mr. 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('@'))

Probieren Sie es online!

Colera Su
quelle
Python wird sich nicht beschweren, wenn Sie das Leerzeichen zwischen 39und entfernen if. Es ist sogar noch kürzer, wenn Sie if-else durch and-or trick ersetzen
ngn
175 Bytes durch Ersetzen i and int(i,27)%15472%39or 0durch int(i or'0')%15472%39--- Probieren Sie es online!
Mr. Xcoder
Und 174 Bytes durch Zuweisen ''.joinzu einer Variablen --- Probieren Sie es online!
Mr. Xcoder
11

JavaScript (ES6), 148 146 143 Bytes

1 Byte dank @ngn gespeichert

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

Testfälle

Arnauld
quelle
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 Danke :) Zusammengeführt mit einer anderen ausstehenden Optimierung.
Arnauld
Darf ich fragen, wie sind Sie auf den Brillanten gekommen x%854%89%35? Haben Sie viele verschiedene Zufallsmodule ausprobiert?
26.
@ngn Ich habe versucht, m0 <1000 , m1 <m0 , m2 <m1 (eigentlich mit einigen anderen Optimierungen, aber das ist die Idee). Und für den Faktor, mit dem x multipliziert wird: [4,6,8,9,10,11,12] und [15 ... 31] . Derzeit versuchen einige andere Ansätze.
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')))

Probieren Sie es online!

TFeld
quelle
302 (-3 Bytes)
Mr. Xcoder
@ Mr.Xcoder Danke :)
TFeld