ASCIIテキストを点字に翻訳する


19

ASCIIテキストを点字出力に変換するプログラムを作成します。要件:

  • 入力は、stdin、コマンドライン、またはその他の外部入力ソースから行われます。
  • 出力は点字として認識できる必要があります。出力の形式はユーザー次第です。例はo、隆起したドットと.非隆起したドットの場合です。などのテキストパターン表現1-3-4は受け入れられません。長い行の折り返しは必要ありません。
  • 最小限のソリューションには、26文字のアルファベットとスペースのみが必要です。ソリューションでサポートされていない入力文字はすべて無視する必要があります。

スコアリングは、ソースコードの文字数によって行われます。ペナルティとボーナスは次のとおりです。

  • 出力としてUnicode点字を使用すると、+ 50のペナルティが発生します。
  • 資本、数字、句読点をサポートするための-50ボーナス。
  • 英語(Grade-2)点字からの合字と1文字の収縮をサポートするための-200ボーナス。(これはまったく別の問題なので、これを別の課題にします。)

サンプルの呼び出しと出力(最小限のソリューション):

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

「有効な試み」を定義します。また、行の折り返しが必要ですか?
ジョン・ドヴォルザーク

@JanDvorak:ありがとう、更新された質問。
グレッグヒューギル14

1
@GregHewgill大文字、数字、句読点を含めることでボーナスを大きくできますか?現在、これは26 + 10 + 12 = 48個の追加文字であり、ボーナスの大部分はありません(点字データを圧縮しない限り)
qwr 14

1
文字の代わりにバイトを数え、ペナルティを取り除くことができます。コストはほぼ同じです(@DigitalTraumaの最初のソリューションは85バイトです)。編集:私はちょうどそれがAPLのような言語にペナルティを課すことに気づいた。それはあなた次第です。
nyuszika7h 14

1
男... Unicode文字のペナルティは、これを面白くするには十分ではありません。人々がどのようにして点字セットをエンコードするのかを知りたかった。
アルモ14

回答:


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文字。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇ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 Basic 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,h8バイトで構成される文字nに8x8ビットマップを割り当てます。パラメーターの後にコンマではなくセミコロンを付けると、2バイトのリトルエンディアンとして扱われます。

文字用の点字パターンをa介してz、次のビットパターンに応じて、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ユニコード文字+ 50ペナルティ):

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

大文字、数字、句読点、120(120ユニコード文字+ 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 14

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
そのアプローチを覚えておく必要があります、ループのための素敵な長い単一の文:)
Matt 14

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-> ^

プログラムは、各文字をビットのペアのトリプレットに変換します(次のような [[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

これは、ユニコードに依存せずに、大文字、数字、句読点を処理します(195バイト+ 2バイト(for -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

ジャバスクリプト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}`)}

編集: 2バイトを節約してくれた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

数字は2文字にする必要があります(例:3 =⠼⠉):数字のプレフィックス(⠼)と暗号は同等の文字(3 = c =⠉)に変換されます。1-9-->a-iおよび0-->j
アダム

私はさまざまなチャートを見てきました-私がチェックしたチャートではそうではありませんでした。
マーカスディル

そして、実際のアスキーチャートではなくASCII点字エンコーディングを使用していることに気付きました。とにかくこれは失格です。
マーカスディアー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.