Przetłumacz tekst ASCII na Braille'a


19

Napisz program, który tłumaczy tekst ASCII na wynik brajla . Wymagania:

  • Dane wejściowe mogą pochodzić ze standardowego wejścia, wiersza poleceń lub innego zewnętrznego źródła wejściowego.
  • Wyjście powinno być rozpoznawalne jako Braille'a, forma wyjścia zależy od Ciebie. Przykładem może być opodniesiona kropka i .niewy podniesiona kropka. Tekstowa reprezentacja wzoru, taka jak, 1-3-4jest niedopuszczalna. Zawijanie długich linii nie jest wymagane.
  • Minimalne rozwiązanie wymaga tylko 26 znaków alfabetu i spacji. Wszystkie znaki wejściowe nie obsługiwane przez twoje rozwiązanie powinny zostać zignorowane.

Punktacja zależy od liczby znaków w kodzie źródłowym. Kary i bonusy to:

Przykładowe wywołanie i wyjście (minimalne rozwiązanie):

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

zdefiniuj „dzielna próba”. Czy wymagane jest także zawijanie linii?
John Dvorak

@JanDvorak: Dzięki, zaktualizowane pytanie.
Greg Hewgill

1
@GregHewgill Czy możesz zwiększyć premię za dodanie wielkich liter, liczb i interpunkcji? Obecnie jest to 26 + 10 + 12 = 48 dodatkowych znaków, niewiele premii (chyba że skompresujesz dane w alfabecie Braille'a)
qwr

1
Możesz policzyć bajty zamiast znaków i usunąć karę, koszt jest mniej więcej taki sam (pierwsze rozwiązanie @ DigitalTrauma to 85 bajtów). Edycja: Właśnie zdałem sobie sprawę, że będzie karać języki takie jak APL. To zależy od Ciebie.
nyuszika7h

1
Człowieku ... kara za znaki Unicode nie jest wystarczająco duża, aby uczynić to interesującym. Chciałem zobaczyć, jak ludzie będą kodować zestaw Braille'a.
Almo

Odpowiedzi:


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)

Obecnie obsługuje małe litery i niektóre znaki interpunkcyjne, ale wciąż jest w toku.

Przykład:

$ 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

Używaj małych liter.

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

One-liner (dzięki ɐɔıʇǝɥʇuʎs)

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

1
Dlaczego nie uczynić z niego jednego linera? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 znaków.
4ıʇǝɥʇuʎs,

@ wıʇǝɥʇuʎs wow, zapomniałem o maxsztuczce. Dziękuję
qwr

Możesz zapisać znak, po prostu wstawiając spacje dla wszystkich znaków for l in input():print((" "*97+"⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵")[ord(l)],end="")
nieliterowych

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

Ta implementacja wymaga, aby jej argument, jeśli zawiera spacje, musiał być cytowany:

# braille "hello world"

3

BBC Basic 103 znaki ASCII lub 92 tokeny

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

Być może nie do końca to, co zamierzał PO, to na nowo definiuje czcionkę dla małych liter. VDU 23,n,a,b,c,d,e,f,g,hprzypisuje bitmapę 8x8 do znaku n, składającego się z ośmiu bajtów. Następowanie parametru średnikiem zamiast przecinkiem powoduje, że jest on traktowany jako dwubajtowa liczba little-endian.

Wzory brajla dla liter aprzechodzących zsą przechowywane w A $, zgodnie z następującym wzorem bitowym. Jest to wyodrębniane przez maski z 9 = binarne 1001i przesunięcia w prawo (dzielenie przez 2 i 4 jest używane, ponieważ standardowy BBC basic nie ma operatora shift).

 8 1
16 2
32 4

Nieskluczony kod

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

Przykład użycia

Odbywa się to w trybie ekranowym 6 dla przejrzystości (wpisz MODE6, jak tylko otworzysz emulator wiersza poleceń).

W rzeczywistości po uruchomieniu kodu wszystkie małe litery (w tym klawiatura) pojawiają się w brajlu.

wprowadź opis zdjęcia tutaj

Emulator na stronie http://bbcbasic.co.uk/bbcwin/bbcwin.html .

Zobacz także moją podobną odpowiedź: /codegolf//a/28869/15599


2

Bash + coreutils

Minimalne rozwiązanie - tylko małe litery, 83 (33 znaki Unicode + 50 punktów karnych):

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

Wielkie litery, cyfry i znaki interpunkcyjne, 120 (120 znaków Unicode + 50 kar - 50 bonusów):

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

Przykładowe dane wyjściowe:

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

Na razie brak bonusów.


2
Myślę, że można używać krótkiego otwierającego tagu w code-golfie , więc możesz użyć <?zamiast <?php[SPACE]zapisać 4 znaki.
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);}

Pierwsze podejscie. Brak bonusów.


2
Możesz go zmniejszyć do 279 za pomocą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
Będę musiał pamiętać o takim podejściu, ładne długie pojedyncze zdanie dla pętli :)
Matt

1

CJam - 51

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

Wypróbuj na http://cjam.aditsu.net/

Przykładowe dane wejściowe:

braille is strange

Przykładowe dane wyjściowe:

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 

Obsługuje tylko małe litery i spacje. Inne znaki są mapowane na obsługiwane znaki (w szczególności wielkie litery na małe).

Wyjaśnienie:

Znaki brajlowskie są kodowane za pomocą 1 dla podniesionej kropki i 0 dla niewy podniesionej kropki, od lewej do prawej i od góry do dołu. Daje to 6 cyfr bazowych 2; 1 jest poprzedzany, aby uniknąć usuwania zer wiodących, następnie liczba jest konwertowana na podstawę 10, a następnie na odpowiedni znak ASCII.
Przykład: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

Program konwertuje każdy znak z powrotem na triplet par bitów (np. [[0 1][1 1][1 0]]) Uzyskując macierz par bitów. Macierz jest następnie transponowana i dodawane są separatory (spacje w wierszach, znaki nowej linii między wierszami).

qwczytuje dane wejściowe do ciągu = tablica znaków
{…}%stosuje blok do każdego znaku
i32%pobiera kod ASCII mod 32 (spacja-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"to ciąg zawierający znaki brajla kodowany jak wyjaśniono wcześniej,
=pobiera odpowiedni
i2bkod brajlowski z ciągu, pobiera kod ASCII, a następnie konwertuje na bazę 2 (uzyskując tablicę 7 cyfr)
1>usuwa 1 cyfrę wiodącą
2/dzieli tablicę na (3) pary
ztransponuje macierze
Sf*łączy każdy wiersz z spacje
N*łączą rzędy z nowymi liniami


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

Dane wejściowe to argument wiersza polecenia, który musi być poprzedzony znakiem zapytania lub cytatem, jeśli ciąg zawiera spacje. Obsługiwane znaki to małe litery i spacja. Nieobsługiwane postacie są po cichu usuwane.

Edycja: Ogolono 5 bajtów, upraszczając warunek


0

perl, 195 + 2-50 = 147

To obsługuje kapitał, liczbę i interpunkcję, bez polegania na Unicode (195 bajtów + 2 bajty (za -pl) - 50 premii)

~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

Z wcięciem:

~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

Próbka wyjściowa

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 bajtów

Byłoby to krócej, ale sprawdzanie wielkich liter boli .

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

EDYCJA: Dzięki mbomb007 za zaoszczędzenie mi dwóch bajtów - niestety, odkryłem, że trochę poprzedniej gry w golfa zrujnowało wszystko, więc musiałem ponownie dodać 27 znaków.

EDYCJA: Aa i 12 bajtów zapisanych przez przesunięcie spacji.

EDYCJA: Uświadomiłem sobie, że głupio było wypisywać jako znaki i zapisałem sporo bajtów. Zapisałem także kilka znaków, zamieniając k = (a, b) => a% (2 * b)> b-1? 1: 0 dla k = (a, b) => a% b> ~ -b / 2? 1: 0.


Może byłoby krótsze przypisanie string.toLowerCasedo zmiennej?
mbomb007

Cyfry powinny składać się z dwóch liter (np. 3 = ⠼⠉): prefiks liczby (⠼) i szyfry są konwertowane na równoważną literę (3 = c = ⠉). 1-9-->a-ii0-->j
Adam

Widziałem różne wykresy - nie na tym, który sprawdziłem.
Marcus Dirr

I właśnie zdałem sobie sprawę, że użyłem kodowania brajlowskiego ASCII zamiast rzeczywistej mapy Ascii. To i tak jest zdyskwalifikowane.
Marcus Dirr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.