Terjemahkan teks ASCII ke huruf braille

19

Tulis program yang menerjemahkan teks ASCII menjadi output braille . Persyaratan:

  • Input dapat berasal dari stdin, baris perintah, atau sumber input eksternal lainnya.
  • Output harus dikenali sebagai braille, bentuk output terserah Anda. Contohnya adalah ountuk titik yang dinaikkan dan .untuk titik yang tidak dinaikkan. Representasi pola tekstual seperti 1-3-4itu tidak dapat diterima. Pembungkus garis panjang tidak diperlukan.
  • Hanya 26 karakter alfabet dan ruang yang diperlukan untuk solusi minimal. Semua karakter input yang tidak didukung oleh solusi Anda harus diabaikan.

Penilaian adalah dengan jumlah karakter dalam kode sumber. Hukuman dan bonus adalah:

  • +50 penalti untuk menggunakan karakter braille Unicode sebagai output.
  • -50 bonus untuk modal, angka, dan tanda baca pendukung.
  • -200 bonus untuk ligatur pendukung dan kontraksi satu huruf dari Braille Bahasa Inggris (Kelas-2) . (Akan membuat ini tantangan terpisah karena ini masalah yang sangat berbeda.)

Permintaan dan hasil sampel (solusi minimal):

$ 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
sumber
mendefinisikan "usaha yang gagah berani". Juga, apakah pembungkus baris diperlukan?
John Dvorak
@ JanDvorak: Terima kasih, pertanyaan terbaru.
Greg Hewgill
1
@GregHewgill Bisakah Anda membuat bonus untuk memasukkan huruf besar, angka, dan tanda baca lebih besar? Saat ini 26 + 10 + 12 = 48 karakter tambahan, tidak banyak bonus (kecuali Anda mengompres data braille)
qwr
1
Anda bisa menghitung byte alih-alih karakter dan menghapus penalti, biayanya hampir sama (solusi pertama DigitalTrauma adalah 85 byte). Sunting: Saya baru menyadari bahwa akan menghukum bahasa seperti APL. Terserah kamu.
nyuszika7h
1
Man ... penalti untuk karakter unicode tidak cukup besar untuk membuat ini menarik. Saya ingin melihat bagaimana orang akan menyandikan braille set.
Almo

Jawaban:

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)

Saat ini mendukung huruf kecil dan beberapa tanda baca, tetapi masih dalam proses.

Contoh:

$ 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
sumber
6

Python - 90 75 + 50 = 125

Gunakan huruf kecil.

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

One-liner (terima kasih kepada ɐɔıʇǝɥʇuʎs)

for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")
qwr
sumber
1
Mengapa tidak menjadikannya one-liner? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 karakter.
ɐɔıʇǝɥʇuʎ
@ wowıʇǝɥʇu wow, saya lupa maxtriknya. Terima kasih
qwr
Anda dapat menyimpan char dengan hanya mengosongkan semua karakter non-huruf: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);}}

Implementasi ini mensyaratkan bahwa argumennya, jika berisi spasi, harus dikutip:

# braille "hello world"
Greg Hewgill
sumber
3

BBC Basic 103 karakter ASCII atau 92 token

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

Mungkin tidak seperti yang dimaksudkan OP, ini mendefinisikan ulang font untuk huruf kecil. VDU 23,n,a,b,c,d,e,f,g,hmenetapkan bitmap 8x8 ke karakter n, terdiri dari delapan byte. Mengikuti parameter dengan titik koma alih-alih koma menyebabkannya diperlakukan sebagai angka bit-endian dua byte.

Pola braille untuk surat amelalui zdisimpan dalam A $, sesuai dengan pola bit berikut. Ini diekstraksi oleh topeng dengan 9 = biner 1001dan pergeseran hak (pembagian oleh 2 dan 4 digunakan sebagai standar BBC basic tidak memiliki operator shift.)

 8 1
16 2
32 4

Kode tidak dikunci

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

Contoh penggunaan

Ini dilakukan dalam mode layar 6 untuk kejelasan (ketik MODE6 segera setelah Anda membuka emulator baris perintah.)

Sebenarnya, setelah menjalankan kode, huruf kecil apa pun (termasuk input keyboard) muncul di Braille.

masukkan deskripsi gambar di sini

Emulator di http://bbcbasic.co.uk/bbcwin/bbcwin.html .

Lihat juga jawaban saya yang serupa ini: /codegolf//a/28869/15599

Level River St
sumber
2

Bash + coreutils

Solusi minimal - hanya huruf kecil, 83 (33 karakter unicode + 50 penalti):

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

Kapital, angka, dan tanda baca, 120 (120 karakter unicode + 50 penalti - 50 bonus):

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

Contoh output:

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

Tidak ada bonus untuk saat ini.

Camilan
sumber
2
Saya pikir tidak apa-apa menggunakan tag pembuka pendek di kode-golf , jadi Anda bisa menggunakan <?alih-alih <?php[SPACE]menyimpan 4 karakter.
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);}

Percobaan pertama. Tidak ada bonus.

Mat
sumber
2
Anda dapat menguranginya menjadi 279 denganw=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
Harus ingat pendekatan itu, pernyataan tunggal panjang yang bagus untuk loop :)
Matt
1

CJam - 51

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

Cobalah di http://cjam.aditsu.net/

Contoh input:

braille is strange

Contoh output:

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 

Ini hanya mendukung huruf kecil dan ruang. Karakter lain dipetakan ke karakter yang didukung (khususnya huruf besar ke kecil).

Penjelasan:

Karakter braille dikodekan menggunakan 1 untuk titik yang dinaikkan dan 0 untuk titik yang tidak dinaikkan, kiri ke kanan dan atas ke bawah. Ini memberikan 6 basis-2 digit; a 1 didahulukan untuk menghindari pengupasan angka nol di depan, maka angka tersebut dikonversi ke basis 10 kemudian ke karakter ASCII yang sesuai.
Contoh: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

Program ini mengkonversi kembali setiap karakter ke triplet pasangan bit (seperti [[0 1][1 1][1 0]]) memperoleh matriks pasangan bit. Matriks tersebut kemudian ditransformasikan dan pemisah ditambahkan (spasi di dalam baris, baris baru di antara baris).

qmembaca input ke string = array karakter
{…}%menerapkan blok ke setiap karakter
i32%mendapatkan kode ASCII mod 32 (spasi-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"adalah string yang berisi karakter huruf braille dikodekan seperti yang dijelaskan sebelum
=mendapatkan karakter braille yang dikodekan yang sesuai dari string
i2bmendapatkan kode ASCII kemudian dikonversi ke basis 2 (memperoleh array 7 digit)
1>menghapus 1 digit
2/terbagi array menjadi (3) pasangan
ztranspos matriks
Sf*bergabung dengan setiap baris dengan spasi
N*bergabung dengan baris dengan baris baru

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

Input adalah argumen baris perintah, yang harus diloloskan atau dikutip jika string berisi spasi. Karakter yang didukung adalah huruf kecil dan spasi. Karakter yang tidak didukung akan dihapus secara diam-diam.

Sunting: Dicukur 5 byte dengan menyederhanakan suatu kondisi

Rubah
sumber
0

perl, 195 + 2-50 = 147

Ini menangani modal, angka, dan tanda baca, tanpa mengandalkan unicode (195 byte + 2 byte (untuk -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

Dengan lekukan:

~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

Output sampel

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__
Adam
sumber
0

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

Ini akan lebih pendek, tetapi memeriksa huruf kapital terasa sakit .

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: Terima kasih kepada mbomb007 karena telah menyelamatkan saya dua byte - sayangnya, saya menemukan bahwa sedikit golf sebelumnya telah merusak segalanya, jadi saya harus menambahkan 27 karakter kembali.

EDIT: Aaand 12 byte disimpan dengan menggerakkan spasi.

EDIT: Menyadari itu konyol untuk output sebagai karakter, dan menyimpan beberapa byte. Saya juga menyimpan beberapa karakter dengan menukar k = (a, b) =>% (2 * b)> b-1? 1: 0 untuk k = (a, b) => a% b> ~ -b / 2? 1: 0.

Marcus Dirr
sumber
Mungkin akan lebih pendek untuk menetapkan string.toLowerCaseke variabel?
mbomb007
Angka-angka harus dua huruf (mis. 3 = ⠼⠉): awalan angka (⠼) dan cipher dikonversi ke huruf yang setara (3 = c = ⠉). 1-9-->a-idan0-->j
Adam
Saya telah melihat grafik yang berbeda - bukan itu yang saya periksa.
Marcus Dirr
Dan saya baru sadar saya menggunakan pengkodean Braille ASCII daripada bagan Ascii yang sebenarnya. Jadi ini memang didiskualifikasi.
Marcus Dirr