Traduzir texto ASCII para braille


19

Escreva um programa que traduza texto ASCII para saída em braille . Requisitos:

  • A entrada pode vir de stdin, linha de comando ou outra fonte de entrada externa.
  • A saída deve ser reconhecida como braille, a forma de saída é sua. Um exemplo seria opara um ponto levantado e .para um ponto não levantado. Representação de padrão textual como 1-3-4não é aceitável. O empacotamento de linha longa não é necessário.
  • Apenas os 26 caracteres e o espaço do alfabeto são necessários para uma solução mínima. Todos os caracteres de entrada não suportados pela sua solução devem ser ignorados.

A pontuação é pelo número de caracteres no código fonte. As penalidades e bônus são:

  • +50 de penalidade por usar caracteres braille Unicode como saída.
  • Bônus de -50 para apoiar maiúsculas, números e pontuação.
  • Bônus de 200 para apoiar ligaduras e contrações de uma letra do Braille em inglês (grau 2) . (Isso fará com que seja um desafio separado, pois é um problema bem diferente.)

Chamada e saída de amostra (solução 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 .  . .

defina "tentativa valente". Além disso, é necessária a quebra de linha?
John Dvorak

@ JanDvorak: Obrigado, pergunta atualizada.
Greg Hewgill

11
@GregHewgill Você pode aumentar ainda mais o bônus por incluir letras maiúsculas, números e pontuação? Atualmente isso é 26 + 10 + 12 = 48 caracteres extras, não muito de um bônus (a menos que você compactar os dados braille)
QWR

11
Você pode contar bytes em vez de caracteres e remover a penalidade, o custo é quase o mesmo (a primeira solução do @ DigitalTrauma é de 85 bytes). Edit: Acabei de perceber que penalizaria idiomas como o APL. Você decide.
precisa saber é o seguinte

11
Cara ... a penalidade para caracteres unicode não é grande o suficiente para tornar isso interessante. Eu queria ver como as pessoas codificariam o conjunto de braille.
Almo

Respostas:


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)

Atualmente, suporta letras minúsculas e alguma pontuação, mas ainda é um trabalho em andamento.

Exemplo:

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

6

Python - 90 75 + 50 = 125

Use letras minúsculas.

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

Linha única (graças a ɐɔıʇǝɥʇuʎs)

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

11
Por que não torná-lo uma linha? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 caracteres.
ɐɔıʇǝɥʇuʎs

@ Uau, eu esqueci o maxtruque. Obrigado
qwr

Você pode salvar um char colocando apenas espaços em branco para todos os caracteres não-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 implementação requer que seu argumento, se contenha espaços, seja citado:

# braille "hello world"

3

BBC Basic 103 caracteres ASCII ou 92 tokens

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

Possivelmente não exatamente o que o OP pretendia, isso redefine a fonte dos caracteres em minúsculas. VDU 23,n,a,b,c,d,e,f,g,hatribui um bitmap de 8x8 ao caractere n, consistindo em oito bytes. Seguir um parâmetro com ponto e vírgula em vez de vírgula faz com que seja tratado como um número little endian de dois bytes.

Os padrões de braille para letras apassadas zsão armazenados em A $, de acordo com o seguinte padrão de bits. Isso é extraído por máscaras com 9 = binário 1001e shift de direitos (a divisão por 2 e 4 é usada como padrão, o BBC Basic não possui operador de turno).

 8 1
16 2
32 4

Código ungolfed

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

Exemplo de uso

Isso é feito no modo de tela 6 para maior clareza (digite MODE6 assim que você abrir o emulador de linha de comando).

Na verdade, depois de executar o código, qualquer letra minúscula (incluindo a entrada do teclado) aparece em Braille.

insira a descrição da imagem aqui

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

Veja também esta minha resposta semelhante: /codegolf//a/28869/15599


2

Bash + coreutils

Solução mínima - somente em minúsculas, 83 (33 caracteres unicode + 50 de penalidade):

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

Letras maiúsculas, números e pontuação, 120 (120 caracteres unicode + 50 de penalidade - bônus de 50):

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

Exemplo de saída:

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

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");

Não há bônus por enquanto.


2
Eu acho que é bom usar uma pequena tag de abertura no code-golf , para que você possa usar em <?vez de <?php[SPACE]salvar 4 caracteres.
precisa saber é o seguinte

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);}

Primeira tentativa. Sem bônus.


2
Você pode reduzi-la a 279 comw=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)
Wally West

11
Terá que se lembrar que a abordagem, agradável declaração longo único loop for :)
Matt

1

CJam - 51

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

Experimente em http://cjam.aditsu.net/

Exemplo de entrada:

braille is strange

Exemplo de saída:

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 

Ele suporta apenas letras minúsculas e espaço. Outros caracteres são mapeados para caracteres suportados (em especial letras maiúsculas para minúsculas).

Explicação:

Os caracteres em braille são codificados usando 1 para um ponto elevado e 0 para um ponto não elevado, da esquerda para a direita e de cima para baixo. Isso fornece 6 dígitos de base 2; a 1 é anexado para evitar a exclusão de zeros à esquerda; o número é convertido na base 10 e no caractere ASCII correspondente.
Exemplo: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

O programa converte de volta cada caractere no trio de pares de bits (como [[0 1][1 1][1 0]]), obtendo uma matriz de pares de bits. A matriz é então transposta e os separadores são adicionados (espaços dentro de linhas, novas linhas entre linhas).

qlê a entrada em uma string = array de caracteres
{…}%aplica o bloco a cada caractere
i32%obtém o código ASCII mod 32 (espaço-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"é uma string que contém os caracteres em braille codificado como explicado anteriormente
=obtém o caractere braille codificado correspondente da sequência,
i2bobtém o código ASCII e depois converte para a base 2 (obtendo uma matriz de 7 dígitos)
1>remove o 1 dígito inicial
2/divide a matriz em (3) pares
ztranspõe a matriz que
Sf*une cada linha com espaços
N*une as linhas com novas linhas


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;}

Entrada é um argumento da linha de comandos, que deve ser escapado ou citado se a sequência contiver espaços. Os caracteres suportados são letras minúsculas e espaço. Caracteres não suportados são eliminados silenciosamente.

Editar: Raspou 5 bytes, simplificando uma condição


0

perl, 195 + 2-50 = 147

Ele lida com capital, número e pontuação, sem depender de unicode (195 bytes + 2 bytes (para -pl) - 50 bônus)

~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

Com recuo:

~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

Saída de amostra

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__

0

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

Isso seria mais curto, mas checar letras maiúsculas doeria .

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}`)}

EDIT: Obrigado ao mbomb007 por me salvar dois bytes - infelizmente, descobri que um pouco do golfe anterior havia arruinado tudo, então tive que adicionar 27 caracteres novamente.

Edição: e 12 bytes salvos movendo os espaços.

EDIT: Percebi que era bobagem produzir caracteres e salvou alguns bytes. Também salvei alguns caracteres trocando k = (a, b) => a% (2 * b)> b-1? 1: 0 para k = (a, b) => a% b> ~ -b / 2? 1: 0.


Talvez seja mais curto atribuir string.toLowerCasea uma variável?
mbomb007

Os números devem ter duas letras (por exemplo, 3 = ⠼⠉): o prefixo do número (⠼) e as cifras são convertidos na letra equivalente (3 = c = ⠉). 1-9-->a-ie0-->j
Adam

Eu já vi gráficos diferentes - não foi esse o caso em que verifiquei.
Marcus Dirr

E acabei de perceber que usei a codificação ASCII Braille em vez de um gráfico Ascii real. Portanto, isso é desqualificado de qualquer maneira.
Marcus Dirr
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.