Dekoduj Faux Braille'a

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

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

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

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

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

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

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

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

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

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

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

Wersja ASCII powyższego

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

O postaciach brajlowskich

Znak brajlowski zawiera prostokąt o wymiarach 4 na 2 kropki, który można postrzegać jako macierz boolowską.

Łączeniem wszystkich takich macierzy jest macierz boolowska 4 na 2 * n, gdzie n jest długością ciągu wejściowego.

Powinieneś szukać pionowych linii bez żadnych kropek i użyć ich jako separatorów, aby podzielić dużą macierz na mniejsze matryce dla każdego znaku.

Następnie poszukaj wzorów, aby przekonwertować je na litery alfabetu angielskiego lub spacje. Zauważ, że po usunięciu separatorów (pionowych pustych linii) spacja jest macierzą 4 na 0.

Poniżej znajduje się opis alfabetu w 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
----+-----+----+-----+----+----+-----+-----+---+----+------+----+-------+------+-----+-----+------+-----+-----+-----+-----+-----+-------+-----+-----+----
.#. | ##. | .# | ##. | ## | ## | .## | #.# | # | .# | #.#. | #. | #...# | #..# | .#. | ##. | .##. | ##. | .## | ### | #.# | #.# | #...# | #.# | #.# | ###
#.# | ### | #. | #.# | ## | #. | #.. | #.# | # | .# | ##.. | #. | ##.## | ##.# | #.# | #.# | #..# | #.# | #.. | .#. | #.# | #.# | #.#.# | .#. | #.# | ..#
### | #.# | #. | #.# | #. | ## | #.# | ### | # | .# | #.#. | #. | #.#.# | #.## | #.# | ##. | #.## | ##. | .## | .#. | #.# | #.# | #.#.# | .#. | .#. | .#.
#.# | ### | .# | ### | ## | #. | .## | #.# | # | #. | #..# | ## | #...# | #..# | .#. | #.. | .### | #.# | ##. | .#. | ### | .#. | .#.#. | #.# | .#. | ###

Specyfikacja

  • Dane wejściowe to sekwencja punktów kodu Unicode z zakresu U + 2800..U + 28FF reprezentowana jako typowy ciąg znaków w twoim języku (np. Tablica znaków, wskaźnik znaków) w dowolnym popularnym obsługiwanym kodowaniu (UTF-8, UCS-2 itp.).

  • Końcowe spacje na wydruku są w porządku.


EDYCJA: przeprosiny dla tych, których przeglądarki źle oddają kropki, powinno to wyglądać tak (obrazek): faux Braille'a

ngn
źródło
5
Twoim zadaniem jest dekodowanie tekstu w ten sposób / litery mają cztery kropki wysokości i zmiennej szerokości / jedna pusta linia pionowa oddziela znaki / spacja ma zerową szerokość / więc wygląda na to, że słowa są oddzielone dwoma liniami / wejście jest ciągiem zawierającym fałszywy brajl z / tylko angielskie wielkie litery i spacje / abcdefghijklmnopqrstuvwxyz / wyjście może być pisane wielkimi lub małymi literami / najkrótsze wygrane / brak luk / pokrewne
ngn
2
Wzory brajla
Arnauld,

Odpowiedzi:

14

Python 3 , 181 179 171 167 161 159 bajtów

Wejście bajtów little-endian UTF-16 bez BOM. Najpierw rozkład na kolumny za pomocą przesunięć bitowych, podzielenie według pustej kolumny, a następnie mieszanie ich w tabeli odnośników.

-2 bajty dzięki ngn .
-5 bajtów dzięki 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('@'))

Wypróbuj online!

Colera Su
źródło
python nie będzie narzekał, jeśli usuniesz spację między 39i if; jest jeszcze krótszy, jeśli
zastąpisz
175 bajtów, zastępując i and int(i,27)%15472%39or 0z int(i or'0')%15472%39--- Spróbuj go w Internecie!
Pan Xcoder,
I 174 bajty przez przypisanie ''.joindo zmiennej --- Wypróbuj online!
Pan Xcoder,
11

JavaScript (ES6), 148 146 143 bajtów

Zapisano 1 bajt dzięki @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

Przypadki testowe

Arnauld
źródł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 Thanks :) Scalono z kolejną optymalizacją w toku.
Arnauld,
Czy mogę zapytać, jak wymyśliłeś genialny x%854%89%35? Czy próbowałeś wielu różnych modułów losowych?
ngn
@ngn Próbowałem m0 <1000 , m1 <m0 , m2 <m1 (właściwie z kilkoma innymi optymalizacjami, ale taki jest pomysł). A dla współczynnika, przez który mnożona jest x : [4,6,8,9,10,11,12] i [15 ... 31] . Obecnie próbuję innych podejść.
Arnauld,
4

Python 3 , 305 302 301 286 251 198 182 bajtów

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

Wypróbuj online!

TFeld
źródło
302 (-3 bajty)
Pan Xcoder,
@ Mr.Xcoder Thanks :)
TFeld