แปลข้อความ ASCII เป็นอักษรเบรลล์


19

เขียนโปรแกรมที่แปลข้อความ ASCII เป็นอักษรเบรลล์เอาต์พุตที่ต้องการ:

  • อินพุตอาจมาจาก stdin, บรรทัดคำสั่งหรือแหล่งอินพุตภายนอกอื่น
  • ควรจดจำเอาต์พุตเป็นอักษรเบรลล์รูปแบบของเอาต์พุตจะขึ้นอยู่กับคุณ ตัวอย่างจะoเป็นจุดที่ยกขึ้นและ.สำหรับจุดที่ไม่ได้ยกขึ้น การแสดงรูปแบบต้นฉบับเดิมเช่น1-3-4ไม่สามารถยอมรับได้ ไม่จำเป็นต้องใช้การพันบรรทัดยาว
  • ต้องการตัวอักษรและช่องว่าง 26 ตัวสำหรับการแก้ปัญหาขั้นต่ำ ควรละเว้นอักขระอินพุตทั้งหมดที่โซลูชันของคุณไม่สนับสนุน

การให้คะแนนคือจำนวนอักขระในซอร์สโค้ด บทลงโทษและโบนัส ได้แก่ :

  • +50 โทษสำหรับการใช้อักษรเบรลล์ Unicodeเป็นเอาท์พุท
  • -50 โบนัสสำหรับการสนับสนุนตัวพิมพ์ใหญ่ตัวเลขและเครื่องหมายวรรคตอน
  • -200 โบนัสสำหรับหนังสติ๊กสนับสนุนและเป็นหนึ่งในตัวอักษรหดตัวจากอังกฤษ (ชั้นประถมศึกษาปีที่ 2) อักษรเบรลล์ (จะทำให้สิ่งนี้เป็นความท้าทายที่แยกจากกันเนื่องจากเป็นปัญหาที่แตกต่างกัน)

ตัวอย่างการร้องขอและเอาต์พุต (โซลูชันขั้นต่ำ):

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

กำหนด "ความพยายามที่กล้าหาญ" นอกจากนี้จำเป็นต้องมีการตัดบรรทัด
John Dvorak

@JanDvorak: ขอบคุณคำถามที่อัปเดต
Greg Hewgill

1
@GregHewgill คุณสามารถสร้างโบนัสสำหรับการรวมตัวพิมพ์ใหญ่ตัวเลขและเครื่องหมายวรรคตอนใหญ่ขึ้นได้หรือไม่? ปัจจุบันคือ 26 + 10 + 12 = 48 อักขระพิเศษโบนัสไม่มากนัก (ยกเว้นกรณีที่คุณบีบอัดข้อมูลอักษรเบรลล์)
qwr

1
คุณสามารถนับไบต์แทนตัวอักษรและลบบทลงโทษค่าใช้จ่ายประมาณเท่าเดิม (@ DigitalTrauma โซลูชั่นแรกคือ 85 ไบต์) แก้ไข:ฉันเพิ่งรู้ว่าจะลงโทษภาษาเช่น APL มันขึ้นอยู่กับคุณ.
nyuszika7h

1
ผู้ชาย ... บทลงโทษสำหรับตัวอักษร Unicode นั้นไม่ใหญ่พอที่จะทำให้มันน่าสนใจ ฉันต้องการดูว่าผู้คนจะเข้ารหัสชุดอักษรเบรลล์อย่างไร
Almo

คำตอบ:


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)

ขณะนี้รองรับตัวอักษรตัวพิมพ์เล็กและเครื่องหมายวรรคตอนบางตัว แต่ก็ยังอยู่ระหว่างดำเนินการ

ตัวอย่าง:

$ 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

ใช้อักษรตัวพิมพ์เล็ก

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

หนึ่งซับ (ขอบคุณɐɔıʇǝɥʇuʎs)

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

1
ทำไมไม่ทำให้มันเป็นหนึ่งซับ? for l in input():print("⠀⠁⠃⠉⠙⠑⠋⠛⠓⠊⠚⠅⠇⠍⠝⠕⠏⠟⠗⠎⠞⠥⠧⠺⠭⠽⠵"[max(0,ord(l)-96)],end="")75 ตัวอักษร
Julıʇǝɥʇuʎs

@ aboutı,uʎsว้าวฉันลืมเกี่ยวกับmaxเคล็ดลับ ขอบคุณ
qwr

คุณสามารถประหยัดถ่านได้เพียงแค่ใส่ช่องว่างสำหรับตัวละครที่ไม่ใช่ตัวอักษรทั้งหมด: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);}}

การใช้งานนี้ต้องการให้อาร์กิวเมนต์ของมันหากมีช่องว่างจะต้องยกมา:

# braille "hello world"

3

BBC ASC 103 ตัวอักษร ASCII หรือโทเค็น 92

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

อาจไม่ได้เป็นอย่างที่ OP ต้องการสิ่งนี้จะกำหนดตัวอักษรใหม่สำหรับอักขระตัวพิมพ์เล็ก VDU 23,n,a,b,c,d,e,f,g,hกำหนดบิตแมป 8x8 ให้กับอักขระ n ซึ่งประกอบด้วยแปดไบต์ การติดตามพารามิเตอร์ด้วยเซมิโคลอนแทนเครื่องหมายคอมมาทำให้ถือเป็นหมายเลข little-endian สองไบต์

รูปแบบอักษรเบรลล์สำหรับตัวอักษรaผ่านzจะถูกเก็บไว้ใน A $ ตามรูปแบบบิตต่อไปนี้ สิ่งนี้ถูกสกัดด้วยมาสก์ที่มี 9 = ไบนารี่1001และลิฟท์ค่าสิทธิ (การหารด้วย 2 และ 4 ถูกใช้เนื่องจากบีบีซีขั้นพื้นฐานแบบมาตรฐานไม่มีโอเปอเรเตอร์กะ)

 8 1
16 2
32 4

รหัสที่ไม่ได้รับการปรับปรุง

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

ตัวอย่างการใช้งาน

สิ่งนี้จะทำในโหมดหน้าจอ 6 เพื่อความชัดเจน (พิมพ์ MODE6 ทันทีที่คุณเปิดตัวจำลองบรรทัดคำสั่ง)

ที่จริงแล้วหลังจากรันโค้ดตัวอักษรตัวเล็ก (รวมถึงคีย์บอร์ด) จะปรากฏในอักษรเบรลล์

ป้อนคำอธิบายรูปภาพที่นี่

Emulator ที่ http://bbcbasic.co.uk/bbcwin/bbcwin.html

ดูคำตอบที่คล้ายกันนี้ของฉัน: /codegolf//a/28869/15599


2

Bash + coreutils

วิธีแก้ปัญหาน้อยที่สุด - ตัวพิมพ์เล็กเท่านั้น 83 (33 ตัวอักษร Unicode + 50 โทษ):

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

เมืองหลวง, ตัวเลขและเครื่องหมายวรรคตอน, 120 (120 unicode chars + 50 โทษ - 50 โบนัส):

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

ตัวอย่างผลลัพธ์:

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

ไม่มีโบนัสสำหรับตอนนี้


2
ฉันคิดว่ามันโอเคที่จะใช้แท็กเปิดสั้นในcode-golfดังนั้นคุณสามารถใช้<?แทนที่จะ<?php[SPACE]บันทึกได้ 4 ตัวอักษร
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);}

ความพยายามครั้งแรก ไม่มีโบนัส


2
คุณสามารถลดลงเป็น 279 ด้วย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
จะต้องจำไว้ว่าวิธีการที่ดีคำเดียวนานสำหรับวง :)
แมตต์

1

CJam - 51

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

ลองที่http://cjam.aditsu.net/

อินพุตตัวอย่าง:

braille is strange

ตัวอย่างผลลัพธ์:

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 

รองรับเฉพาะอักษรตัวพิมพ์เล็กและช่องว่าง อักขระอื่น ๆ ถูกแมปกับตัวอักษรที่รองรับ (โดยเฉพาะตัวอักษรตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก)

คำอธิบาย:

อักขระอักษรเบรลล์มีการเข้ารหัสโดยใช้ 1 สำหรับจุดที่เพิ่มขึ้นและ 0 สำหรับจุดที่ไม่ได้ยกขึ้นจากซ้ายไปขวาและบนลงล่าง สิ่งนี้ให้ 6 ฐาน -2 หลัก; 1 ถูกเตรียมไว้เพื่อหลีกเลี่ยงการปอกศูนย์นำหน้าจากนั้นตัวเลขจะถูกแปลงเป็นฐาน 10 จากนั้นเป็นอักขระ ASCII ที่สอดคล้องกัน
ตัวอย่าง: t -> ⠞ -> 01/11/10 -> 1011110 -> 94 -> ^

โปรแกรมแปลงอักขระแต่ละตัวกลับเป็น triplet ของคู่ของบิต (เช่น[[0 1][1 1][1 0]]) เพื่อรับเมทริกซ์ของคู่บิต เมทริกซ์จะถูกย้ายแล้วและมีการเพิ่มตัวคั่น (ช่องว่างภายในแถวบรรทัดใหม่ระหว่างแถว)

qอ่านอินพุตลงใน string = array ของตัวละคร
{…}%ใช้บล็อกกับตัวละครแต่ละตัว
i32%ได้รับรหัส ASCII mod 32 (space-> 0, a-> 1, b-> 2, z-> 26)
"@`hptdx|lX\bjrvfz~nZ^ck]swg"เป็นสตริงที่มีอักขระอักษรเบรลล์ ตามที่อธิบายไว้ก่อนที่จะ
=ได้รับอักขระอักษรเบรลล์เข้ารหัสที่สอดคล้องกันจากสตริงที่
i2bได้รับรหัส ASCII แล้วแปลงเป็นฐาน 2 (การรับอาร์เรย์ 7 หลัก)
1>ลบ 1 หลักนำการ
2/แยกอาร์เรย์เป็น (3) คู่
zสลับเมทริกซ์
Sf*ร่วมแต่ละแถวด้วย ช่องว่าง
N*รวมแถวกับบรรทัดใหม่


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

อินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่งซึ่งจะต้องหลีกเลี่ยงหรืออ้างอิงถ้าสตริงมีช่องว่าง อักขระที่รองรับคือตัวอักษรตัวพิมพ์เล็กและช่องว่าง อักขระที่ไม่ได้รับการสนับสนุนลดลงอย่างเงียบ ๆ

แก้ไข:โกน 5 ไบต์ด้วยการทำให้เงื่อนไขง่ายขึ้น


0

perl, 195 + 2-50 = 147

สิ่งนี้จัดการกับเงินทุนจำนวนและเครื่องหมายวรรคตอนโดยไม่ต้องพึ่งพา Unicode (195 ไบต์ + 2 ไบต์ (สำหรับ-pl) - 50 โบนัส)

~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

ด้วยการเยื้อง:

~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

ตัวอย่างผลลัพธ์

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 ไบต์

นี้จะสั้น แต่การตรวจสอบตัวอักษรทุนเจ็บ

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

แก้ไข:ขอบคุณ mbomb007 ที่ช่วยฉันสองไบท์ - โชคไม่ดีที่ฉันพบว่าการเล่นกอล์ฟก่อนหน้านี้เล็กน้อยทำลายทุกอย่างดังนั้นฉันจึงต้องเพิ่ม 27 ตัวอักษรกลับเข้ามา

แก้ไข: Aaand 12 ไบต์บันทึกโดยการย้ายช่องว่าง

แก้ไข:ตระหนักว่ามันเป็นเรื่องโง่ที่จะเอาท์พุทเป็นตัวละครและบันทึกไว้ไม่กี่ไบต์ ฉันยังบันทึกอักขระสองสามตัวโดยการสลับ k = (a, b) => a% (2 * b)> b-1? 1: 0 สำหรับ k = (a, b) => a% b> ~ -b / 2 1: 0


อาจจะสั้นกว่าที่จะกำหนดให้string.toLowerCaseกับตัวแปรหรือไม่?
mbomb007

ตัวเลขควรเป็นตัวอักษรสองตัว (เช่น 3 = ⠼⠉): หมายเลขนำหน้า (⠼) และยันต์จะถูกแปลงเป็นตัวอักษรเทียบเท่า (3 = c = ⠉) 1-9-->a-iและ0-->j
อดัม

ฉันเคยเห็นชาร์ตต่าง ๆ - นั่นไม่ใช่ในกรณีที่ฉันตรวจสอบ
Marcus Dirr

และฉันเพิ่งรู้ว่าฉันใช้การเข้ารหัสอักษรเบรลล์ ASCII มากกว่าแผนภูมิ Ascii จริง ดังนั้นนี่จึงถูกตัดสิทธิ์แล้ว
Marcus Dirr
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.