Traduire du texte ASCII en braille


19

Écrivez un programme qui traduit le texte ASCII en sortie braille . Exigences:

  • L'entrée peut provenir de stdin, de la ligne de commande ou d'une autre source d'entrée externe.
  • La sortie doit être reconnaissable en braille, la forme de la sortie dépend de vous. Un exemple serait opour un point en relief et .pour un point non en relief. Une représentation textuelle comme celle-ci 1-3-4n'est pas acceptable. Un enroulement longue ligne n'est pas requis.
  • Seuls les 26 caractères alphabétiques et l'espace sont requis pour une solution minimale. Tous les caractères saisis non pris en charge par votre solution doivent être ignorés.

La notation se fait par nombre de caractères dans le code source. Les pénalités et bonus sont:

  • Pénalité de +50 pour l'utilisation de caractères braille Unicode en sortie.
  • -50 bonus pour prendre en charge les majuscules, les chiffres et la ponctuation.
  • -200 bonus pour soutenir les ligatures et les contractions à une lettre du braille anglais (2e année) . (Cela en fera un défi distinct car c'est un problème assez différent.)

Exemple d'appel et de sortie (solution minimale):

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

définir "tentative vaillante". De plus, le retour à la ligne est-il nécessaire?
John Dvorak

@JanDvorak: Merci, question mise à jour.
Greg Hewgill

1
@GregHewgill Pouvez-vous augmenter le bonus pour inclure les majuscules, les chiffres et la ponctuation? Actuellement, c'est 26 + 10 + 12 = 48 caractères supplémentaires, pas beaucoup de bonus (sauf si vous compressez les données en braille)
qwr

1
Vous pouvez compter les octets au lieu des caractères et supprimer la pénalité, le coût est à peu près le même (la première solution de @ DigitalTrauma est de 85 octets). Edit: Je viens de réaliser que cela pénaliserait des langues comme APL. C'est à vous.
nyuszika7h

1
Mec ... la pénalité pour les caractères Unicode n'est pas assez grande pour rendre ça intéressant. Je voulais voir comment les gens allaient coder l'ensemble braille.
Almo

Réponses:


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)

Prend actuellement en charge les lettres minuscules et une certaine ponctuation, mais c'est toujours un travail en cours.

Exemple:

$ 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

Utilisez des lettres minuscules.

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

One-liner (merci aux ɐɔıʇǝɥʇuʎs)

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

1
Pourquoi ne pas en faire une doublure? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 caractères.
ɐɔıʇǝɥʇuʎs

@ ɐɔıʇǝɥʇuʎs wow, j'ai oublié l' maxastuce. Merci
qwr

Vous pouvez enregistrer un caractère en mettant simplement des blancs pour tous les caractères non-lettre: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);}}

Cette implémentation nécessite que son argument, s'il contient des espaces, soit cité:

# braille "hello world"

3

BBC Basic 103 caractères ASCII ou 92 jetons

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

Peut-être pas tout à fait ce que l'OP avait prévu, cela redéfinit la police des caractères minuscules. VDU 23,n,a,b,c,d,e,f,g,hassigne un bitmap 8x8 au caractère n, composé de huit octets. Le fait de suivre un paramètre avec un point-virgule au lieu d'une virgule le fait être traité comme un nombre en petits caractères à deux octets.

Les modèles en braille pour les lettres ajusqu'à zsont stockés dans A $, selon le modèle de bits suivant. Ceci est extrait par des masques avec 9 = binaire 1001et des changements de droits (la division par 2 et 4 est utilisée car la base BBC standard n'a pas d'opérateur de décalage.)

 8 1
16 2
32 4

Code non 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

Exemple d'utilisation

Cela se fait en mode écran 6 pour plus de clarté (tapez MODE6 dès que vous ouvrez l'émulateur de ligne de commande.)

En fait, après l'exécution du code, toutes les lettres minuscules (y compris la saisie au clavier) apparaissent en braille.

entrez la description de l'image ici

Émulateur sur http://bbcbasic.co.uk/bbcwin/bbcwin.html .

Voir également ma réponse similaire: /codegolf//a/28869/15599


2

Bash + coreutils

Solution minimale - minuscules uniquement, 83 (33 caractères unicode + 50 pénalités):

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

Capitales, nombres et ponctuation, 120 (120 caractères unicode + 50 pénalités - 50 bonus):

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

Exemple de sortie:

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

Pas de bonus pour l'instant.


2
Je pense qu'il est correct d'utiliser une balise d'ouverture courte dans le code-golf , vous pouvez donc utiliser <?au lieu d' <?php[SPACE]enregistrer 4 caractères.
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);}

Premier essai. Pas de bonus.


2
Vous pouvez le réduire à 279 avecw=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
Il faudra se souvenir de cette approche, belle longue déclaration simple pour la boucle :)
Matt

1

CJam - 51

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

Essayez-le sur http://cjam.aditsu.net/

Exemple d'entrée:

braille is strange

Exemple de sortie:

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 

Il ne prend en charge que les minuscules et l'espace. D'autres caractères sont mappés aux caractères pris en charge (en particulier les lettres majuscules à minuscules).

Explication:

Les caractères braille sont codés en utilisant 1 pour un point en relief et 0 pour un point non en relief, de gauche à droite et de haut en bas. Cela donne 6 chiffres de base 2; un 1 est ajouté pour éviter de supprimer les zéros en tête, puis le nombre est converti en base 10 puis en caractère ASCII correspondant.
Exemple: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

Le programme reconvertit chaque caractère en triplet de paires de bits (comme [[0 1][1 1][1 0]]) en obtenant une matrice de paires de bits. La matrice est ensuite transposée et des séparateurs sont ajoutés (espaces dans les lignes, nouvelles lignes entre les lignes).

qlit l'entrée dans une chaîne = tableau de caractères
{…}%applique le bloc à chaque caractère
i32%obtient le code ASCII mod 32 (espace-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"est une chaîne contenant les caractères braille encodé comme expliqué précédemment
=obtient le caractère braille codé correspondant de la chaîne
i2bobtient le code ASCII puis convertit en base 2 (obtention d'un tableau de 7 chiffres)
1>supprime le premier chiffre
2/divise le tableau en (3) paires
ztranspose la matrice
Sf*joint chaque ligne avec espaces
N*rejoint les lignes avec des retours à la ligne


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

L'entrée est un argument de ligne de commande, qui doit être échappé ou cité si la chaîne contient des espaces. Les caractères pris en charge sont les lettres minuscules et l'espace. Les caractères non pris en charge sont supprimés en silence.

Edit: rasé de 5 octets en simplifiant une condition


0

perl, 195 + 2-50 = 147

Cela gère le capital, le nombre et la ponctuation, sans compter sur unicode (195 octets + 2 octets (pour -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

Avec retrait:

~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

Exemple de sortie

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 octets

Ce serait plus court, mais la vérification des majuscules faisait mal .

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: Merci à mbomb007 de m'avoir sauvé deux octets - malheureusement, j'ai trouvé qu'un peu de golf précédent avait tout gâché, j'ai donc dû ajouter 27 caractères.

EDIT: Aa et 12 octets enregistrés en déplaçant les espaces.

EDIT: réalisé qu'il était stupide de sortir en tant que caractères, et a sauvé pas mal d'octets. J'ai également enregistré quelques caractères en échangeant k = (a, b) => a% (2 * b)> b-1? 1: 0 pour k = (a, b) => a% b> ~ -b / 2? 1: 0.


Peut-être que ce serait plus court à attribuer string.toLowerCaseà une variable?
mbomb007

Les chiffres doivent être composés de deux lettres (par exemple, 3 = ⠼⠉): le préfixe numérique (⠼) et les chiffres sont convertis en la lettre équivalente (3 = c = ⠉). 1-9-->a-iet0-->j
Adam

J'ai vu différents graphiques - ce n'était pas le cas sur celui que j'ai vérifié.
Marcus Dirr

Et je viens de réaliser que j'ai utilisé l'encodage ASCII Braille plutôt qu'un véritable diagramme Ascii. C'est donc disqualifié de toute façon.
Marcus Dirr
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.