Braille-ify una stringa


22

E no, questo non è un duplicato del testo Traduci ASCII in braille .

Ci sono 2 8 = 256 modelli Braille in Unicode. (Per "Braille" intendo quelli a 8 celle)

W, aspetta. Quanti caratteri ASCII c'erano?

2 7 = 128?

Bene, allora trasformiamo ASCII in Braille, perché non c'è assolutamente alcun motivo per non farlo!


La strada dall'ASCII al Braille

Possiamo vedere ogni cella rappresentare un po ', che ogni cella è' punzonata 'o no.

Ora possiamo allocare ogni cella per rappresentare i bit del carattere ASCII come binario.

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

* ( - )è vuoto

Ora possiamo convertire ASCII in Braille. Ad esempio, A(65 = 01000001) è uguale a .

Esempi

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. .. ..

Di certo aè , non (che credo sia q)?
Neil,

@Neil La sfida non è solo "convertire i codici char + 10240 in char". E sì, lo aè .
Erik the Outgolfer,

@EriktheOutgolfer Non ho suggerito che lo fosse, ma sarebbe stato sbagliato in entrambi i casi, poiché ha il numero sbagliato di celle perforate.
Neil,

@Neil Oh bello. Ho appena ricalcolato e ho scoperto che hai ragione.
Matthew Roh,

È strano per chiunque altro che l'LSB (in basso a destra) sia rimasto inutilizzato, piuttosto che l'MSB (in alto a sinistra)?
Julian Wolf,

Risposte:


14

CJam , 27 26 byte

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

Provalo online!

Spiegazione

I punti del codice Braille sono ordinati in modo ordinato in modo che i singoli punti contino in binario. Tuttavia, l'ordinamento dei bit nei punti di codice è diverso. Vogliamo il seguente ordine:

04
15
26
37

Considerando che i personaggi sono disposti in Unicode in questo ordine:

03
14
25
67

(Il che in qualche modo ha senso, perché storicamente, il Braille utilizzava solo i primi sei punti.) Nota che non abbiamo bisogno del 7punto, poiché l'ingresso è garantito che sia compreso nell'intervallo ASCII. Quindi, dato un elenco di bit [6 5 4 3 2 1 0]di un carattere di input, vogliamo riordinarli [3 6 5 4 2 1 0], per tirare il bit che rappresenta il punto in basso a sinistra nella posizione più 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.
}%

1
Trucco intelligente con il 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>


Oh sì, probabilmente dovrei dividere per 2 prima di prendere questo AND per salvare anche un byte.
Martin Ender,

Forse l'abuso di jQuery può essere usato?
Matthew Roh,


5

CJam , 27 byte

1 byte rubato da Neil.

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

Provalo online!

Spiegazione

Questo utilizza la stessa idea di base della mia altra risposta CJam ma utilizza l'aritmetica bit per bit anziché la conversione di base e la manipolazione dell'elenco per riordinare i 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.
}%


2

Mathematica 100 byte

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 byte di questo legato in nomi di funzioni lunghe.


1

Gelatina , 21 byte

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

Provalo online!

Come funziona

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

Retina , 59 byte

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

Provalo online! Discarica esadecimale:

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

Patata fritta ,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

Provalo online!

Sospetto di poter giocare a golf di più, devo solo capire come ...

Il chip legge in ogni byte di input come una raccolta di bit, a cui fanno riferimento le prime otto lettere dell'alfabeto (viene immessa la lettera maiuscola, viene emessa la lettera inferiore):

HGFEDCBA

Dobbiamo semplicemente mappare quei bit dell'input sui seguenti tre byte di output:

11100010 101000hd 10gfecba

La metà superiore del codice sta eseguendo tutto il sequenziamento e genera i primi due byte, la metà inferiore genera il terzo byte.

Poiché la specifica richiede solo la gestione di 7 bit per ASCII, non esaminiamo H. Per includere l'ottavo bit, cambiare la riga B/bin B/b/H.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.