将ASCII文本转换为盲文


19

编写将ASCII文本转换为盲文输出的程序。要求:

  • 输入可能来自stdin,命令行或其他外部输入源。
  • 输出应可识别为盲文,输出形式由您决定。一个例子是o凸起的点和.非凸起的点。诸如此类的文本模式表示形式1-3-4是不可接受的。不需要长行换行。
  • 最少需要26个字母字符和空格。解决方案不支持的所有输入字符都应忽略。

评分是根据源代码中的字符数进行的。罚款和奖金为:

  • 使用Unicode盲文字符作为输出时,+ 50罚款。
  • 支持大写字母,数字和标点符号的奖励为-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 2014年

@JanDvorak:谢谢,更新了问题。
Greg Hewgill 2014年

1
@GregHewgill您能增加包括大写字母,数字和标点符号在内的奖金吗?目前,这是26 + 10 + 12 = 48个额外的字符,没有多少额外的奖励(除非您压缩盲文数据)
qwr

1
您可以计算字节数而不是字符数并消除代价,代价大致相同(@DigitalTrauma的第一个解决方案是85字节)。编辑:我刚刚意识到这会惩罚APL等语言。由你决定。
nyuszika7h 2014年

1
伙计... Unicode字符的罚款不足以使这个变得有趣。我想看看人们如何编码盲文集。
Almo 2014年

Answers:


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

蟒蛇-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个字符。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎ的哇,我忘了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基本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。在参数后面加上分号(而不是逗号)会导致该参数被视为两字节的小端数字。

字母的盲文图案 az根据以下位至存储在A $中。这是通过具有9 =二进制1001和右移的掩码提取的(除以2和4用作标准BBC基本,没有移位运算符。)

 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。)

实际上,运行代码后,所有小写字母(包括键盘输入)都会出现在盲文中。

在此处输入图片说明

模拟器在 http://bbcbasic.co.uk/bbcwin/bbcwin.html的

另请参阅我的类似答案:https : //codegolf.stackexchange.com/a/28869/15599


2

Bash + coreutils

最小解决方案-仅小写字母,为83(33个Unicode字符+ 50罚款):

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

大写,数字和标点符号:120(120个Unicode字符+ 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 2014年

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
您可以使用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
将不得不记住这种方法,循环很长的单个语句:)
Matt

1

果酱-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->⠞-> 10/11/11-> 1011110-> 94-> ^

该程序将每个字符转换回三对位对(例如[[0 1][1 1][1 0]]),以获得位对矩阵。然后对矩阵进行转置并添加分隔符(行内的空格,行间的换行符)。

q将输入读取为字符串=字符数组,
{…}%将块应用于每个字符,
i32%获取ASCII码mod 32(空格-> 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 '16

数字应为两个字母(例如3 =⠼⠉):数字前缀(⠼)和密码将转换为等效字母(3 = c =⠉)。1-9-->a-i0-->j
亚当

我看过不同的图表-我检查过的情况并非如此。
Marcus Dirr

我只是意识到我使用了ASCII盲文编码,而不是实际的Ascii图表。因此,这还是被取消参赛资格。
Marcus Dirr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.