Traducir texto ASCII a braille

19

Escriba un programa que traduzca el texto ASCII a la salida en braille . Requisitos:

  • La entrada puede provenir de stdin, línea de comando o alguna otra fuente de entrada externa.
  • La salida debe ser reconocible como braille, la forma de salida depende de usted. Un ejemplo sería opara un punto elevado y .para un punto no elevado. La representación de patrones textuales como 1-3-4no es aceptable. No se requiere envoltura de línea larga.
  • Solo se requieren los 26 caracteres del alfabeto y el espacio para una solución mínima. Todos los caracteres de entrada no admitidos por su solución deben ignorarse.

La puntuación es por número de caracteres en el código fuente. Las penalizaciones y bonificaciones son:

  • +50 de penalización por usar caracteres braille Unicode como salida.
  • -50 de bonificación por apoyar capitales, números y puntuación.
  • -200 de bonificación por soportar ligaduras y contracciones de una letra del Braille inglés (Grado-2) . (Hará de este un desafío separado ya que es un problema bastante diferente).

Ejemplo de invocación y salida (solución mínima):

$ braille Hello world
o .  o .  o .  o .  o .  . .  . o  o .  o .  o .  o o
o o  . o  o .  o .  . o  . .  o o  . o  o o  o .  . o
. .  . .  o .  o .  o .  . .  . o  o .  o .  o .  . .
Greg Hewgill
fuente
definir "intento valiente". Además, ¿se requiere el ajuste de línea?
John Dvorak
@ JanDvorak: Gracias, pregunta actualizada.
Greg Hewgill
1
@GregHewgill ¿Puede aumentar el bono por incluir mayúsculas, números y puntuación? Actualmente eso es 26 + 10 + 12 = 48 caracteres adicionales, no es una gran bonificación (a menos que comprima los datos en braille)
qwr
1
Puede contar bytes en lugar de caracteres y eliminar la penalización, el costo es casi el mismo (la primera solución de @ DigitalTrauma es 85 bytes). Editar: Me acabo de dar cuenta de que penalizaría idiomas como APL. Tu decides.
nyuszika7h
1
Hombre ... la penalización por caracteres unicode no es lo suficientemente grande como para hacer esto interesante. Quería ver cómo la gente iba a codificar el conjunto braille.
Almo

Respuestas:

6

Python, 162

l=map((" a c,bif/e d:hjg'k m;lsp o n!rtq%12s. w -u x v   z y"%'').find,raw_input().lower())
for i in 1,4,16:print'  '.join('.o.o    ..oo'[(n&i*3)/i::4]for n in l)

Actualmente admite letras minúsculas y algunos signos de puntuación, pero aún es un trabajo en progreso.

Ejemplo:

$ python braille.py
Hello, world!
o .  o .  o .  o .  o .  . .  . .  . o  o .  o .  o .  o o  . .
o o  . o  o .  o .  . o  o .  . .  o o  . o  o o  o .  . o  o o
. .  . .  o .  o .  o .  . .  . .  . o  o .  o .  o .  . .  o .
grc
fuente
6

Python - 90 75 + 50 = 125

Usa letras minúsculas.

for l in input():
 a=ord(l)-96
 if a<0:a=0
 print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[a],end="")

One-liner (gracias a ɐɔıʇǝɥʇuʎs)

for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")
qwr
fuente
1
¿Por qué no hacerlo de una sola línea? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 caracteres.
Julıʇǝɥʇuʎs
@ ɐɔıʇǝɥʇuʎs wow, me olvidé del maxtruco. Gracias
qwr
Puede guardar un personaje simplemente poniendo espacios en blanco para todos los caracteres que no sean letras:for l in input():print((" "*97+"⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵")[ord(l)],end="")
xnor
3

C, 269

#define C char
#define O*p++=(*t&1)*65+46;*t>>=1;
main(int c,C**v){C b[99]={1,5,3,11,9,7,15,13,6,14},o[99],*q=o,*p=v[1],*t;while(c=*p++)*q++=c=='w'?46:c>='a'&&c<='z'?c-='a'+(c>'w'),b[c%10]|(c>9)*16|(c>19)*32:0;for(c=3;c;c--){p=b;for(t=o;t<q;t++){O;O*p++=32;}puts(b);}}

Esta implementación requiere que su argumento, si contiene espacios, debe ser citado:

# braille "hello world"
Greg Hewgill
fuente
3

BBC Basic 103 caracteres ASCII o 92 fichas

A$="HXIKJY[ZQShxikjy{zqsl|Wmon"FORK=1TO26A=ASC(MID$(A$,K))VDU23,K+96,A AND9;0,A/2AND9;0,A/4AND9;:NEXT

Posiblemente no exactamente lo que pretendía el OP, esto redefine la fuente para los caracteres en minúscula. VDU 23,n,a,b,c,d,e,f,g,hasigna un mapa de bits de 8x8 al carácter n, que consta de ocho bytes. Seguir un parámetro con un punto y coma en lugar de una coma hace que se trate como un número little-endian de dos bytes.

Los patrones de braille para las cartas aa través zse almacenan en un $, de acuerdo con el siguiente patrón de bits. Esto se extrae con máscaras con 9 = binario 1001y cambios de derechos (la división por 2 y 4 se usa como estándar BBC basic no tiene operador de cambio).

 8 1
16 2
32 4

Código sin golf

A$="HXIKJY[ZQShxikjy{zqsl|Wmon"
FORK=1TO26
  A=ASC(MID$(A$,K))
  VDU23,K+96,A AND9;0,A/2AND9;0,A/4AND9;
NEXT

Ejemplo de uso

Esto se realiza en el modo de pantalla 6 para mayor claridad (escriba MODE6 tan pronto como abra el emulador de línea de comandos).

En realidad, después de ejecutar el código, cualquier letra minúscula (incluida la entrada del teclado) aparece en Braille.

ingrese la descripción de la imagen aquí

Emulador en http://bbcbasic.co.uk/bbcwin/bbcwin.html .

Vea también esta respuesta similar mía: /codegolf//a/28869/15599

Level River St
fuente
2

Bash + coreutils

Solución mínima: solo en minúsculas, 83 (33 caracteres unicode + 50 penalizaciones):

tr a-z ⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺

Capitales, números y puntuación, 120 (120 caracteres unicode + 50 penalizaciones - 50 bonus):

a=⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠭⠽⠵⠺
sed 's/\([0-9]\)/⠼&/g;s/\([A-Z]\)/⠠&/g'|tr ",;':\-⎖.!“?”()/a-zA-Z1-90" ⠂⠆⠄⠒⠤⠨⠲⠖⠦⠦⠴⠶⠶⠌$a$a$a

Salida de ejemplo:

$ echo {A..Z} {a..z} {0..9} ".,;:" | ./braille.sh 
⠠⠁ ⠠⠃ ⠠⠉ ⠠⠙ ⠠⠑ ⠠⠋ ⠠⠛ ⠠⠓ ⠠⠊ ⠠⠚ ⠠⠅ ⠠⠇ ⠠⠍ ⠠⠝ ⠠⠕ ⠠⠏ ⠠⠟ ⠠⠗ ⠠⠎ ⠠⠞ ⠠⠥ ⠠⠧ ⠠⠭ ⠠⠽ ⠠⠵ ⠠⠺ ⠁ ⠃ ⠉ ⠙ ⠑ ⠋ ⠛ ⠓ ⠊ ⠚ ⠅ ⠇ ⠍ ⠝ ⠕ ⠏ ⠟ ⠗ ⠎ ⠞ ⠥ ⠧ ⠭ ⠽ ⠵ ⠺ ⠼⠚ ⠼⠁ ⠼⠃ ⠼⠉ ⠼⠙ ⠼⠑ ⠼⠋ ⠼⠛ ⠼⠓ ⠼⠊ ⠲⠂⠆⠒
$ 
Trauma digital
fuente
1

PHP, 331

<?php $d=split("/",gzinflate(base64_decode("NYzBDQBACIM26o3G/r+LRf2QYAOZe4SCLKgU7A9lEWVOzrQVrAiwghWhLKLMyZlawTTGMIYxPg==")));$d[-65]="......";$i=str_split(preg_replace("/[^a-z ]/","",trim(fgets(STDIN))));$o=["","",""];$S="substr";foreach($i as $c){$v=ord($c)-97;for($x=0;$x<3;$x++)$o[$x].=$S($d[$v],$x*2,2)." ";}echo join($o,"\n");

No hay bonos por ahora.

Bocadillo
fuente
2
Creo que está bien usar una etiqueta de apertura corta en code-golf , por lo que puede usar en <?lugar de <?php[SPACE]guardar 4 caracteres.
nyuszika7h
1

JavaScript - 286

w=prompt().split('');for(i=0;i<w.length;i++){z=w[i];o="o",p=".";b=[1,5,3,11,9,7,15,13,6,14];e=[c="",1,3];g=z.charCodeAt(0)-97;if(g>22)g--;f=e[g/10|0];d=b[g%10];if(g==22){d=14;f=2;}c+=d&1?o:p;c+=d&2?o:p;c+="\n";c+=d&4?o:p;c+=d&8?o:p;c+="\n";c+=f&1?o:p;c+=f&2?"o\n":".\n";console.log(c);}

Primer intento. Sin bonificaciones

Mate
fuente
2
Puedes reducirlo a 279 con w=prompt().split("");for(i=0;i<w.length;i++)z=w[i],o="o",p=".",b=[1,5,3,11,9,7,15,13,6,14],e=[c="",1,3],g=z.charCodeAt(0)-97,22<g&&g--,f=e[g/10|0],d=b[g%10],22==g&&(d=14,f=2),c+=d&1?o:p,c+=d&2?o:p,c+="\n",c+=d&4?o:p,c+=d&8?o:p,c+="\n",c+=f&1?o:p,c+=f&2?"o\n":".\n",console.log(c)
WallyWest
1
Tendré que recordar ese enfoque, una bonita y larga declaración para loop :)
Matt
1

CJam - 51

q{i32%"@`hptdx|lX\bjrvfz~nZ^ck]swg"=i2b1>2/}%zSf*N*

Pruébalo en http://cjam.aditsu.net/

Entrada de ejemplo:

braille is strange

Salida de ejemplo:

10 10 10 01 10 10 10 00 01 01 00 01 01 10 10 11 11 10 
10 11 00 10 10 10 01 00 10 10 00 10 11 11 00 01 11 01 
00 10 00 00 10 10 00 00 00 10 00 10 10 10 00 10 00 00 

Solo admite letras minúsculas y espacio. Otros caracteres se asignan a caracteres admitidos (en particular letras mayúsculas a minúsculas).

Explicación:

Los caracteres Braille se codifican usando 1 para un punto elevado y 0 para un punto no elevado, de izquierda a derecha y de arriba a abajo. Esto da 6 dígitos de base 2; se antepone un 1 para evitar quitar los ceros iniciales, luego el número se convierte en base 10 y luego en el carácter ASCII correspondiente.
Ejemplo: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

El programa convierte de nuevo cada carácter al triplete de pares de bits (como [[0 1][1 1][1 0]]) obteniendo una matriz de pares de bits. La matriz se transpone y se agregan separadores (espacios dentro de las filas, nuevas líneas entre las filas).

qlee la entrada en una cadena = matriz de caracteres
{…}%aplica el bloque a cada carácter
i32%obtiene el código ASCII mod 32 (espacio-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"es una cadena que contiene los caracteres braille codificado como se explicó anteriormente,
=obtiene el carácter braille codificado correspondiente de la cadena,
i2bobtiene el código ASCII y luego lo convierte en base 2 (obteniendo una matriz de 7 dígitos)
1>elimina el primer dígito
2/divide la matriz en (3) pares,
ztranspone la matriz
Sf*une cada fila con espacios
N*une las filas con nuevas líneas

aditsu
fuente
0

C, 249 244

#define B?111:46
#define P(a,b)printf("%c%c ",a B,b B):
a,i;main(int c,char**v){for(char*p;p=v[1],a<3;puts(""),++a)while(i=*p++)i==32?P(0,0)i/97&122/i?c=(i+=(i==119)*17-97-(i>119))%10,a?a^1?P(i/10%3,i/20)P(c>4|c==1,c/3&&c%3-2)P(c<8,5*c/8%2)0;}

La entrada es un argumento de línea de comando, que debe ser escapado o citado si la cadena contiene espacios. Los caracteres admitidos son letras minúsculas y espacio. Los caracteres no compatibles se descartan en silencio.

Editar: afeitado 5 bytes simplificando una condición

zorro
fuente
0

perl, 195 + 2-50 = 147

Esto maneja el capital, el número y la puntuación, sin depender de unicode (195 bytes + 2 bytes (para -pl) - 50 bonus)

~s/([A-Z])/|$1/g,~s/(\d)/#$1/g,tr/1-90/a-ij/;for$i(1,2,4){map{for$j(1,8){$s.=index(" a,b'k;l^cif/msp_e:h*o!r_djg_ntq|_?_-u(v_____x____._)z\"___w_#y",l$
"}$_=$s

Con sangría:

~s/([A-Z])/|$1/g,
~s/(\d)/#$1/g,
tr/1-90/a-ij/;
for$i(1,2,4){
  map{
    for$j(1,8){
     $s.=index(" a,b'k;l^cif/msp_e:h*o!r_djg_ntq|_?_-u(v_____x____._)z\"___w_#y",lc($_))&$j*$i?o:_
    }
   $s.=_
  }split//;
  $s.="
"}
$_=$s

Salida de muestra

perl -pl brail.pl
Hello, 99!
___o__o__o__o__o_________o__o__o__o____
___oo__o_o__o___o_o______o_o___o_o__oo_
_o_______o__o__o________oo____oo____o__
Adán
fuente
0

Javascript ES6 - 282 309 297 283 270 - 50 = 232 259 233 220 bytes

Esto sería más corto, pero la comprobación de letras mayúsculas duele .

f=_=>{z='toLowerCase';k=(a,b)=>a%b>~-b/2?1:0;t=(a,b)=>k(a,b)+`${k(a,b/2)} `;b=c=d='';for(v of _){v==v[z]()?0:(b+=0,c+=0,v=v[z](d+=1));$=` ,'-";9015283467@./+^_>#i[s!jwt)a*kue:ozb<lvh\\r(c%mxd?nyf$p&g]q=`.search(v);b+=t($,64);c+=t($,16);d+=t($,4)}alert(`${b}
${c}
${d}`)}

EDITAR: Gracias a mbomb007 por salvarme dos bytes; desafortunadamente, descubrí que un poco de golf anterior lo había arruinado todo, así que tuve que agregar 27 caracteres nuevamente.

EDITAR: Aa y 12 bytes guardados al mover los espacios.

EDITAR: me di cuenta de que era una tontería mostrar como caracteres y guardé bastantes bytes. También guardé algunos caracteres intercambiando k = (a, b) => a% (2 * b)> b-1? 1: 0 para k = (a, b) => a% b> ~ -b / 2? 1: 0.

Marcus Dirr
fuente
Tal vez sería más corto para asignar string.toLowerCasea una variable?
mbomb007
Los números deben ser dos letras (por ejemplo, 3 = ⠼⠉): el prefijo del número (⠼) y las cifras se convierten a la letra equivalente (3 = c = ⠉). 1-9-->a-iy0-->j
Adam
He visto diferentes gráficos, ese no fue el caso en el que verifiqué.
Marcus Dirr
Y me acabo de dar cuenta de que usé la codificación ASCII Braille en lugar de un gráfico Ascii real. Entonces esto está descalificado de todos modos.
Marcus Dirr