Braille-ify una cuerda

22

Y no, este no es un engaño de Traducir texto ASCII a braille .

Hay 2 8 = 256 patrones Braille en Unicode. (Por 'Braille' me refiero a las de 8 celdas)

W, espera. ¿Cuántos caracteres ASCII había?

2 7 = 128?

Bueno, entonces, ¡convirtamos ASCII en Braille, porque no hay absolutamente ninguna razón para no hacerlo!


El camino de ASCII a Braille

Podemos ver que cada celda representa un bit, que cada celda está 'perforada' o no.

Ahora podemos asignar cada celda para representar los bits del carácter ASCII como binarios.

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

* ( - )está en blanco

Ahora podemos convertir ASCII a Braille. Por ejemplo, A(65 = 01000001) es igual a .

Ejemplos

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
fuente
Seguramente aes , no (que creo que es q)?
Neil
@Neil El desafío no es solo "convertir códigos de caracteres + 10240 a caracteres". Y si, lo aes .
Erik the Outgolfer
@EriktheOutgolfer No sugerí que lo fuera, pero habría estado equivocado de cualquier manera, ya que tiene el número incorrecto de celdas perforadas.
Neil
@Neil Oh bien. Acabo de recalcular y descubrí que tienes razón.
Matthew Roh el
¿Le parece extraño a alguien más que el LSB (abajo a la derecha) no se use, en lugar del MSB (arriba a la izquierda)?
Julian Wolf

Respuestas:

14

CJam , 27 26 bytes

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

Pruébalo en línea!

Explicación

Los puntos del código Braille están ordenados para que los puntos individuales cuenten en binario. Sin embargo, el orden de los bits en los puntos de código es diferente. Queremos el siguiente orden:

04
15
26
37

Mientras que los caracteres se presentan en Unicode en este orden:

03
14
25
67

(Lo cual tiene sentido, porque históricamente, Braille solo usó los primeros seis puntos). Tenga en cuenta que no necesitamos el 7punto, ya que la entrada está garantizada en el rango ASCII. Entonces, dada una lista de bits [6 5 4 3 2 1 0]de un carácter de entrada, queremos reordenarlos [3 6 5 4 2 1 0], para extraer el bit que representa el punto inferior izquierdo a la posición más significativa.

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
fuente
1
Truco inteligente con el 80.
Erik the Outgolfer
11

JavaScript (ES6), 83 bytes

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
fuente
Ah, sí, probablemente debería dividir entre 2 antes de tomar eso Y para guardar un byte también.
Martin Ender
¿Quizás se pueda usar el abuso de jQuery?
Matthew Roh el
5

CJam , 27 bytes

1 byte robado de Neil.

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

Pruébalo en línea!

Explicación

Esto usa la misma idea básica que mi otra respuesta de CJam pero usa aritmética bit a bit en lugar de la conversión de base y la manipulación de listas para reordenar los bits.

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
fuente
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ón en línea

Jörg Hülsermann
fuente
2

Mathematica 100 Bytes

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

Sin golf:

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

+60 bytes de esto atados en nombres de funciones largos.

Kelly Lowder
fuente
1

Jalea , 21 bytes

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

Pruébalo en línea!

Cómo funciona

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
fuente
0

Retina , 59 bytes

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

Pruébalo en línea! Volcado hexadecimal:

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
fuente
0

C #, 63 bytes

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

Pruébalo en línea!

Inspiración de @ovs y @Neil

aloisdg dice Reinstate Monica
fuente
0

Viruta ,62 59 bytes

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

Pruébalo en línea!

Sospecho que puedo jugar más al golf, solo tengo que descubrir cómo ...

El chip lee en cada byte de entrada como una colección de bits, a los que se refieren las primeras ocho letras del alfabeto (mayúscula es entrada, menor es salida):

HGFEDCBA

Simplemente necesitamos asignar esos bits de la entrada a los siguientes tres bytes de salida:

11100010 101000hd 10gfecba

La mitad superior del código está haciendo toda la secuencia, y genera los primeros dos bytes, la mitad inferior genera el tercer byte.

Como la especificación solo requiere el manejo de 7 bits para ASCII, no lo examinamos H. Para incluir el octavo bit, cambie la línea B/ba B/b/H.

Phlarx
fuente