Шрифт Брайля

22

И нет, это не просто перевод текста ASCII на шрифт Брайля .

В Unicode есть 2 8 = 256 образцов Брайля . (Под шрифтом Брайля я подразумеваю 8-элементные)

Ж, подожди. Сколько было символов ASCII?

2 7 = 128?

Что ж, давайте превратим ASCII в шрифт Брайля, потому что нет абсолютно никаких причин не делать этого!


Путь от ASCII до Брайля

Мы можем видеть, что каждая ячейка представляет бит, который каждая ячейка «перфорирована» или нет.

Теперь мы можем выделить каждую ячейку для представления битов символа ASCII в двоичном виде.

(1  )(16 )
(2  )(32 )
(4  )(64 )
(8  )( - )

* ( - )пусто

Теперь мы можем конвертировать ASCII в шрифт Брайля. Например, A(65 = 01000001) равно .

Примеры

Input -> Output
Braille! -> ⠢⠺⠱⡱⡴⡴⠵⠑
(Upscaled)
.. .o o. o. .. .. o. o.
o. oo .o .o .o .o .o .o
.o .o .o .o oo oo oo ..
.. .. .. o. o. o. .. ..
Мэтью Ро
источник
Конечно , aэто не (я думаю , что это q)?
Нил
@Neil Задача не просто «преобразовать коды символов + 10240 в символы». И да, aесть .
Эрик Outgolfer
@EriktheOutgolfer Я не предполагал, что это так, но в любом случае это было бы неправильно, так как у него неправильное количество перфорированных ячеек.
Нил
@ Нил О, хорошо. Я только что пересчитал и узнал, что ты прав.
Мэтью Ро
Неужели кому-то еще кажется странным, что LSB (внизу справа) не используется, а не MSB (вверху слева)?
Джулиан Вольф

Ответы:

14

CJam , 27 26 байтов

80qf{i2b7Te[4/~\)\@+++2bc}

Попробуйте онлайн!

объяснение

Кодовые точки Брайля аккуратно упорядочены, так что отдельные точки подсчитываются в двоичном виде. Однако порядок битов в кодовых точках отличается. Мы хотим следующий заказ:

04
15
26
37

Принимая во внимание, что символы расположены в Unicode в следующем порядке:

03
14
25
67

(Что в некотором роде имеет смысл, потому что исторически Брайль использовал только первые шесть точек.) Обратите внимание, что нам не нужна 7точка, поскольку входные данные гарантированно находятся в диапазоне ASCII. Поэтому, учитывая список битов [6 5 4 3 2 1 0]входного символа, мы хотим изменить их порядок [3 6 5 4 2 1 0], чтобы бит, представляющий нижнюю левую точку, занял самую значимую позицию.

80     e# Push 80... we'll need this later.
q      e# Read all input.
f{     e# Map this block onto each character, putting a copy of the 80
       e# below each character.
  i    e#   Convert the character to its code point.
  2b   e#   Get its binary representation.
  7Te[ e#   Pad it to 7 bits with zeros. We've now got some bit list
       e#   [6 5 4 3 2 1 0].
  4/   e#   Split into chunks of 4: [[6 5 4 3] [2 1 0]]
  ~    e#   Dump them onto the stack: [6 5 4 3] [2 1 0]
  \    e#   Swap them: [2 1 0] [6 5 4 3]
  )    e#   Pull off the last element: [2 1 0] [6 5 4] 3
  \    e#   Swap: [2 1 0] 3 [6 5 4]
  @    e#   Rotate: 3 [6 5 4] [2 1 0]
  ++   e#   Concatenate twice: [3 6 5 4 2 1 0]
       e#   That's the reordering done.
  +    e#   Prepend the 80. That puts it in the 2^7 position of the
       e#   binary digit list, which gives it a value of 10240, which
       e#   is where the Braille characters start.
  2b   e#   Convert the bits back to an integer.
  c    e#   Convert the code point to the corresponding integer.
}%
Мартин Эндер
источник
1
Умный трюк с 80.
Эрик Outgolfer
11

JavaScript (ES6), 83 байта

f=
s=>s.replace(/./g,c=>String.fromCharCode((c=c.charCodeAt())&7|c*8&64|c/2&56|10240))
<input oninput=o.textContent=f(this.value)><pre id=o>

Нил
источник
О да, мне, вероятно, следует разделить на 2, прежде чем взять это И, чтобы сохранить байт.
Мартин Эндер,
Может быть, злоупотребление jQuery можно использовать?
Мэтью Ро
5

CJam , 27 байт

1 байт украден у Нейла.

q{i__8&8*@7&@2/56&++'⠀+}%

Попробуйте онлайн!

объяснение

Здесь используется та же основная идея, что и в моем другом ответе CJam, но используется побитовая арифметика вместо преобразования базы и манипулирования списком для переупорядочения битов.

q        e# Read all input.
{        e# Map this block over each character...
  i__    e#   Convert the character to its code point and make two copies.
  8&     e#   AND 8. Gives the 4th bit, which we need to move to the 7th place.
  8*     e#   Multiply by 8 to move it up three places.
  @7&    e#   Pull up another copy and take it AND 7. This extracts the three
         e#   least significant bits which shouldn't be moved at all.
  @2/    e#   Pull up the last copy and divide by 2 to shift all bits down
         e#   by one place.
  56&    e#   AND 56. Extracts the three most-significant bits.
  ++     e#   Add all three components back together.
  '⠀+    e#   Add to the empty Braille character which is the offset for all
         e#   the code points and which converts the value to a character.
}%
Мартин Эндер
источник
3

PHP, 109 байт

foreach(str_split($argn)as$c)echo json_decode('"\u'.dechex(10240+(($d=ord($c))&7)+($d/2&56)+(($d&8)*8)).'"');

Онлайн версия

Йорг Хюльсерманн
источник
2

Mathematica 100 байт

FromCharacterCode[10240+#~Drop~{4}~Prepend~#[[4]]~FromDigits~2&/@ToCharacterCode@#~IntegerDigits~2]&

Ungolfed:

ToCharacterCode["Braille!0"]
PadLeft@IntegerDigits[%,2]
Prepend[Drop[#,{4}],#[[4]]]&/@%
FromDigits[#,2]&/@%
FromCharacterCode[%+10240]

+60 байт это связано с длинными именами функций.

Келли Лоудер
источник
1

Желе , 21 байт

O&€“¬®p‘æ.1,8,.+“'ṁ’Ọ

Попробуйте онлайн!

Как это работает

O&€“¬®p‘æ.1,8,.+“'ṁ’Ọ  Main link. Argument: s (string)

O                      Ordinal; map all characters to their Unicode code points.
   “¬®p‘               Yield the code points of the enclosed characters in Jelly's
                       code page, i.e., [1, 8, 112].
 &€                    Take the bitwise AND of each code point to the left and the
                       three code points to the right.
          1,8,.        Yield [1, 8, 0.5].
        æ.             Take the dot product of the array to the right and each flat
                       array in the array to the left.
                “'ṁ’   Yield 10240 = 250 × 39 + 239, where 39 and 239 are the
                       indices of ' and ṁ in Jelly's code page.
               +       Add 10240 to all integers to the left.
                    Ọ  Unordinal; convert all code points to their respective 
                       Unicode charcters.
Деннис
источник
0

Сетчатка , 59 байт

T`�-- -'0-7@-GP-W\`-gp-w--(-/8-?H-OX-_h-ox-`⠀-⡿

Попробуйте онлайн! Шестнадцатеричный дамп:

0000  54 60 00 2a 07 10 2a 17  20 2a 17 30 2a 17 40 2a  T`�-- -'0-7@-
0010  47 50 2a 57 5c 60 2a 67  70 2a 77 08 2a 0f 18 2a  GP-W\`-gp-w--
0020  1f 28 2a 2f 38 2a 3f 48  2a 4f 58 2a 5f 68 2a 6f  (-/8-?H-OX-_h-o
0030  78 2a 7f 60 e2 a0 80 2a  e2 a1 bf                 x-`⠀-⡿
Нил
источник
0

Чип ,62 59 байт

h*
 Z~.
z.g+b
>xv<
||sf
Zx^<
Z< |
A/a/D
B/b
C/c
E/d
F/e
G/f

Попробуйте онлайн!

Я подозреваю, что я могу играть в гольф больше, просто должен выяснить, как ...

Чип читает каждый входной байт как набор битов, обозначаемых первыми восемью буквами алфавита (верхний регистр - ввод, нижний - вывод):

HGFEDCBA

Нам просто нужно отобразить эти биты ввода в следующие три байта вывода:

11100010 101000hd 10gfecba

Верхняя половина кода выполняет все последовательности и генерирует первые два байта, нижняя половина генерирует третий байт.

Поскольку спецификация требует обработки только 7 битов для ASCII, мы не рассматриваем H. Чтобы включить восьмой бит, измените строку B/bна B/b/H.

Phlarx
источник