Dịch văn bản ASCII sang chữ nổi


19

Viết chương trình dịch văn bản ASCII sang đầu ra chữ nổi . Yêu cầu:

  • Đầu vào có thể đến từ stdin, dòng lệnh hoặc một số nguồn đầu vào bên ngoài khác.
  • Đầu ra nên được nhận dạng là chữ nổi, hình thức đầu ra là tùy thuộc vào bạn. Một ví dụ sẽ là omột dấu chấm được nâng lên và .cho một dấu chấm không được nâng lên. Đại diện mẫu văn bản như 1-3-4là không được chấp nhận. Gói dài dòng là không cần thiết.
  • Chỉ có 26 ký tự chữ cái và không gian được yêu cầu cho một giải pháp tối thiểu. Tất cả các ký tự đầu vào không được hỗ trợ bởi giải pháp của bạn nên được bỏ qua.

Ghi điểm là theo số lượng ký tự trong mã nguồn. Hình phạt và tiền thưởng là:

  • +50 hình phạt cho việc sử dụng các ký tự chữ nổi Unicode làm đầu ra.
  • -50 phần thưởng cho việc hỗ trợ chữ hoa, số và dấu chấm câu.
  • -200 phần thưởng cho việc hỗ trợ chữ ghép và các chữ cái co lại từ chữ nổi tiếng Anh (Lớp 2) . (Sẽ biến điều này thành một thách thức riêng vì đây là một vấn đề hoàn toàn khác.)

Gọi mẫu và đầu ra (giải pháp tối thiểu):

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

định nghĩa "nỗ lực dũng cảm". Ngoài ra, có phải là gói-line?
John Dvorak

@JanDvorak: Cảm ơn, câu hỏi cập nhật.
Greg Hewgill

1
@GregHewgill Bạn có thể làm cho phần thưởng bao gồm cả chữ hoa, số và dấu chấm câu lớn hơn không? Hiện tại đó là 26 + 10 + 12 = 48 ký tự phụ, không có nhiều tiền thưởng (trừ khi bạn nén dữ liệu chữ nổi)
qwr

1
Bạn có thể đếm byte thay vì ký tự và xóa hình phạt, chi phí là như nhau (giải pháp đầu tiên của @ DigitalTrauma là 85 byte). Chỉnh sửa: Tôi chỉ nhận ra rằng sẽ phạt các ngôn ngữ như APL. Tuỳ bạn.
nyuszika7h

1
Man ... hình phạt cho ký tự unicode không đủ lớn để làm cho điều này thú vị. Tôi muốn xem mọi người sẽ mã hóa bộ chữ nổi như thế nào.
Almo

Câu trả lời:


6

Con trăn, 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)

Hiện tại hỗ trợ chữ thường và một số dấu câu, nhưng nó vẫn đang trong quá trình hoàn thiện.

Thí dụ:

$ 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

Con trăn - 90 75 + 50 = 125

Sử dụng chữ thường.

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

Một lớp lót (nhờ vào ɐɔıʇǝɥʇuʎs)

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

1
Tại sao không làm cho nó một lót? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 ký tự.
ɐɔıʇǝɥʇuʎs

@ wow forgotʇǝɥʇʇǝɥʇ wow, tôi quên mất maxmánh khóe. Cảm ơn bạn
qwr

Bạn có thể lưu một char bằng cách chỉ đặt khoảng trống cho tất cả các ký tự không phải chữ cái: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);}}

Việc thực hiện này đòi hỏi rằng đối số của nó, nếu nó chứa khoảng trắng, phải được trích dẫn:

# braille "hello world"

3

BBC Basic 103 ký tự ASCII hoặc 92 mã thông báo

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

Có thể không hoàn toàn những gì OP dự định, điều này xác định lại phông chữ cho các ký tự chữ thường. VDU 23,n,a,b,c,d,e,f,g,hgán một bitmap 8x8 cho ký tự n, bao gồm tám byte. Theo sau một tham số bằng dấu chấm phẩy thay vì dấu phẩy làm cho nó được coi là một số cuối nhỏ hai byte.

Các mẫu chữ nổi cho chữ aqua zđược lưu trữ trong A $, theo các mẫu bit sau. Điều này được trích xuất bằng các mặt nạ với 9 = nhị phân 1001và quyền (chia cho 2 và 4 được sử dụng làm tiêu chuẩn cơ bản của BBC không có toán tử thay đổi.)

 8 1
16 2
32 4

Mã bị đánh cắp

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

Ví dụ sử dụng

Điều này được thực hiện ở chế độ màn hình 6 để rõ ràng (gõ MODE6 ngay khi bạn mở trình giả lập dòng lệnh.)

Trên thực tế, sau khi chạy mã, mọi chữ cái viết thường (bao gồm cả nhập bàn phím) sẽ xuất hiện bằng chữ nổi.

nhập mô tả hình ảnh ở đây

Trình giả lập tại http://bbcbasic.co.uk/bbcwin/bbcwin.html .

Xem thêm câu trả lời tương tự này của tôi: /codegolf//a/28869/15599


2

Bash + lõi

Giải pháp tối thiểu - chỉ chữ thường, 83 (33 ký tự unicode + 50 hình phạt):

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

Thủ đô, số và dấu chấm câu, 120 (120 ký tự unicode + 50 hình phạt - 50 tiền thưởng):

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

Ví dụ đầu ra:

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

Không có tiền thưởng cho bây giờ.


2
Tôi nghĩ sẽ ổn khi sử dụng thẻ mở ngắn trong môn đánh gôn , vì vậy bạn có thể sử dụng <?thay vì <?php[SPACE]lưu 4 ký tự.
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);}

Nỗ lực đầu tiên. Không có tiền thưởng.


2
Bạn có thể giảm xuống còn 279 vớiw=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
Sẽ phải nhớ cách tiếp cận đó, câu lệnh đơn dài đẹp cho vòng lặp :)
Matt

1

CJam - 51

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

Dùng thử tại http://cjam.aditsu.net/

Ví dụ đầu vào:

braille is strange

Ví dụ đầu ra:

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 

Nó chỉ hỗ trợ chữ thường và không gian. Các ký tự khác được ánh xạ tới các ký tự được hỗ trợ (cụ thể là các chữ cái viết hoa thành chữ thường).

Giải trình:

Các ký tự chữ nổi được mã hóa bằng cách sử dụng 1 cho dấu chấm nổi và 0 cho dấu chấm không được nâng lên, từ trái sang phải và từ trên xuống dưới. Điều này cho 6 chữ số cơ bản-2; a 1 được chuẩn bị để tránh tước các số 0 đứng đầu, sau đó số được chuyển đổi thành cơ sở 10 sau đó thành ký tự ASCII tương ứng.
Ví dụ: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

Chương trình chuyển đổi trở lại mỗi ký tự thành bộ ba cặp bit (chẳng hạn như [[0 1][1 1][1 0]]) thu được ma trận các cặp bit. Ma trận sau đó được hoán vị và các dấu phân cách được thêm vào (khoảng trắng trong các hàng, dòng mới giữa các hàng).

qđọc đầu vào thành một chuỗi = mảng các ký tự
{…}%áp dụng khối cho mỗi ký tự
i32%sẽ nhận được mã ASCII mod 32 (dấu cách-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"là một chuỗi chứa các ký tự chữ nổi được mã hóa như đã giải thích trước khi
=lấy ký tự chữ nổi được mã hóa tương ứng từ chuỗi
i2b lấy mã ASCII sau đó chuyển đổi sang cơ sở 2 (thu được một mảng gồm 7 chữ số)
1>loại bỏ 1 chữ số hàng đầu
2/chia tách các mảng thành (3) ghép
zcác ma trận
Sf*nối với mỗi hàng với không gian
N*nối các hàng với dòng mới


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

Đầu vào là một đối số dòng lệnh, phải được thoát hoặc trích dẫn nếu chuỗi chứa khoảng trắng. Các ký tự được hỗ trợ là chữ thường và không gian. Nhân vật không được hỗ trợ đang âm thầm bỏ.

Chỉnh sửa: Cạo 5 byte bằng cách đơn giản hóa một điều kiện


0

perl, 195 + 2-50 = 147

Điều này xử lý vốn, số và dấu chấm câu, mà không cần dựa vào unicode (195 byte + 2 byte (cho -pl) - 50 phần thưởng)

~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

Với vết lõm:

~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

Sản lượng mẫu

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 byte

Điều này sẽ ngắn hơn, nhưng kiểm tra chữ in hoa bị tổn thương .

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: Cảm ơn mbomb007 vì đã tiết kiệm cho tôi hai byte - thật không may, tôi thấy rằng một chút chơi golf trước đó đã phá hỏng mọi thứ, vì vậy tôi phải thêm 27 ký tự trở lại.

EDIT: Aaand 12 byte được lưu bằng cách di chuyển khoảng trắng.

EDIT: Nhận ra rằng thật ngớ ngẩn khi xuất ra dưới dạng ký tự và đã lưu khá nhiều byte. Tôi cũng đã lưu một vài ký tự bằng cách hoán đổi k = (a, b) => a% (2 * b)> b-1? 1: 0 cho k = (a, b) => a% b> ~ -b / 2? 1: 0.


Có lẽ nó sẽ ngắn hơn để gán string.toLowerCasecho một biến?
mbomb007

Các số phải là hai chữ cái (ví dụ: 3 = ⠼⠉): tiền tố số (⠼) và mật mã được chuyển đổi thành chữ cái tương đương (3 = c = ⠉). 1-9-->a-i0-->j
Adam

Tôi đã thấy các biểu đồ khác nhau - đó không phải là trường hợp tôi đã kiểm tra.
Marcus Dirr

Và tôi chỉ nhận ra rằng tôi đã sử dụng mã hóa chữ nổi ASCII chứ không phải là biểu đồ thực tế. Vì vậy, điều này là không đủ tiêu chuẩn.
Marcus Dirr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.