Braille-ify string

22

Dan tidak, ini bukan duplikat dari teks Terjemahan ASCII ke braille .

Ada 2 8 = 256 pola Braille di Unicode. (Dengan 'Braille' maksud saya yang 8-sel)

T, tunggu. Berapa banyak karakter ASCII yang ada di sana?

2 7 = 128?

Baiklah, mari kita ubah ASCII menjadi Braille, karena sama sekali tidak ada alasan untuk tidak melakukannya!


Mulai dari ASCII, hingga Braille

Kita dapat melihat masing-masing sel mewakili sedikit, yang mana setiap sel 'dilubangi' atau tidak.

Sekarang kita dapat mengalokasikan setiap sel untuk mewakili bit dari karakter ASCII sebagai biner.

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

* ( - )kosong

Sekarang kita dapat mengonversi ASCII ke Braille. Misalnya, A(65 = 01000001) sama dengan .

Contohnya

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. .. ..
Matthew Roh
sumber
Tentunya aini , tidak (yang saya pikir q)?
Neil
@Neil Tantangannya bukan hanya "mengubah kode char + 10240 menjadi karakter." Dan ya, abenar .
Erik the Outgolfer
@EriktheOutgolfer Saya tidak menyarankan itu, tetapi akan salah juga, karena memiliki jumlah sel yang salah.
Neil
@Neil Oh bagus. Saya baru saja menghitung ulang dan mengetahui Anda benar.
Matthew Roh
Apakah terasa aneh bagi orang lain bahwa LSB (kanan bawah) dibiarkan tidak digunakan, daripada MSB (kiri atas)?
Julian Wolf

Jawaban:

14

CJam , 27 26 byte

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

Cobalah online!

Penjelasan

Poin kode Braille disusun dengan rapi sehingga masing-masing titik dihitung dalam biner. Namun, urutan bit dalam poin kode berbeda. Kami ingin pesanan berikut:

04
15
26
37

Sedangkan karakter diletakkan dalam Unicode dalam urutan ini:

03
14
25
67

(Yang agak masuk akal, karena secara historis, Braille hanya menggunakan enam titik pertama.) Perhatikan bahwa kita tidak memerlukan 7titik, karena input dijamin berada dalam kisaran ASCII. Jadi diberi daftar bit [6 5 4 3 2 1 0]karakter input, kami ingin menyusun ulang [3 6 5 4 2 1 0], untuk menarik bit yang mewakili titik kiri bawah ke posisi paling signifikan.

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.
}%
Martin Ender
sumber
1
Trik cerdas dengan 80.
Erik the Outgolfer
11

JavaScript (ES6), 83 byte

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>

Neil
sumber
Oh ya, saya mungkin harus membaginya dengan 2 sebelum mengambil DAN untuk menyimpan byte juga.
Martin Ender
Mungkin penyalahgunaan jQuery dapat digunakan?
Matthew Roh
5

CJam , 27 byte

1 byte dicuri dari Neil.

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

Cobalah online!

Penjelasan

Ini menggunakan ide dasar yang sama dengan jawaban CJam saya yang lain tetapi menggunakan aritmatika bitwise alih-alih konversi basis dan manipulasi daftar untuk menyusun ulang bit.

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.
}%
Martin Ender
sumber
3

PHP, 109 Bytes

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

Versi Online

Jörg Hülsermann
sumber
2

Mathematica 100 Bytes

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

Tidak Disatukan:

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

+60 byte ini terikat dalam nama fungsi yang panjang.

Kelly Lowder
sumber
1

Jelly , 21 byte

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

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
0

Retina , 59 byte

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

Cobalah online! Hex dump:

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-`⠀-⡿
Neil
sumber
0

C #, 63 byte

s=>string.Concat(s.Select(c=>(char)(c*8&64|c/2&56|c&7|10240)));

Cobalah online!

Inspirasi dari @ovs dan @Neil

aloisdg kata Reinstate Monica
sumber
0

Chip ,62 59 byte

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

Cobalah online!

Saya kira saya bisa bermain golf lebih banyak, hanya harus mencari tahu bagaimana ...

Chip membaca dalam setiap byte input sebagai kumpulan bit, disebut oleh delapan huruf pertama dari alfabet (huruf besar adalah input, lebih rendah adalah output):

HGFEDCBA

Kita hanya perlu memetakan bit-bit input ke tiga byte output berikut:

11100010 101000hd 10gfecba

Setengah bagian atas kode melakukan semua urutan, dan menghasilkan dua byte pertama, bagian bawah menghasilkan byte ketiga.

Karena spesifikasinya hanya membutuhkan penanganan 7 bit untuk ASCII, kami tidak memeriksa H. Untuk memasukkan bit kedelapan, ubah baris B/bke B/b/H.

Phlarx
sumber