ASCII 텍스트를 점자로 번역


19

ASCII 텍스트를 점자 출력으로 변환하는 프로그램을 작성하십시오 . 요구 사항 :

  • 입력은 stdin, 명령 행 또는 기타 외부 입력 소스에서 올 수 있습니다.
  • 출력은 점자로 인식 할 수 있어야하며 출력 형식은 사용자에게 달려 있습니다. 예를 들어 o올린 점과 올리지 .않은 점이 있습니다. 와 같은 텍스트 패턴 표현 1-3-4은 허용되지 않습니다. 긴 줄 바꿈이 필요하지 않습니다.
  • 최소한의 솔루션에는 26 개의 알파벳 문자와 공백 만 있으면됩니다. 솔루션에서 지원하지 않는 모든 입력 문자는 무시해야합니다.

스코어링은 소스 코드의 문자 수입니다. 위약금과 보너스는 다음과 같습니다 :

  • 유니 코드 점자 문자 를 출력으로 사용하면 +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 .  . .

"valiant 시도"를 정의하십시오. 또한 줄 바꿈이 필요합니까?
John Dvorak

@ JanDvorak : 감사합니다.
Greg Hewgill

1
@GregHewgill 대문자, 숫자 및 문장 부호를 포함하여 보너스를 더 크게 만들 수 있습니까? 현재는 26 + 10 + 12 = 48 개의 추가 문자이며, 보너스는 그리 많지 않습니다 (점자 데이터를 압축하지 않는 한)
qwr

1
문자 대신 바이트를 계산하고 페널티를 제거 할 수 있습니다. 비용은 거의 같습니다 (@DigitalTrauma의 첫 번째 솔루션은 85 바이트입니다). 편집 : 나는 APL과 같은 언어에 불이익을 줄 것이라는 것을 깨달았습니다. 그것은 당신에게 달려 있습니다.
nyuszika7 시간

1
유니 코드 문자에 대한 형벌은 이것을 흥미롭게 만들 정도로 충분하지 않습니다. 사람들이 점자 세트를 어떻게 인코딩 할 것인지 알고 싶었습니다.
Almo

답변:


6

파이썬, 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ʎ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

Ungolfed 코드

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 .

/codegolf//a/28869/15599 내 비슷한 답변을 참조하십시오.


2

배쉬 + 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 에 짧은 여는 태그를 사용하는 것이 좋습니다. 그래서 4 문자를 저장 하는 <?대신 사용할 수 있습니다 <?php[SPACE].
nyuszika7 시간

1

자바 스크립트-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 자리 숫자를 제공합니다. 선행 0을 제거하지 않기 위해 1이 앞에오고 숫자는 10 진수로 변환 된 다음 해당 ASCII 문자로 변환됩니다.
예 : t-> ⠞-> 01/11/10-> 1011110-> 94-> ^

이 프로그램은 각 문자를 비트 쌍의 비트 (예 : 등 [[0 1][1 1][1 0]])로 변환하여 비트 쌍의 행렬을 얻습니다. 그런 다음 행렬이 바뀌고 구분 기호가 추가됩니다 (행 내의 공백, 행 사이의 줄 바꿈).

q문자열로 입력을 읽습니다 = 문자 배열은
{…}%각 문자에 블록을 적용합니다
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

펄, 195 + 2-50 = 147

유니 코드 (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

자바 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 % b> ~ -b /에 k = (a, b) => a % (2 * b)> b-1? 1 : 0을 바꾸어 몇 문자를 절약했습니다. 2? 1 : 0.


string.toLowerCase변수 에 할당 하는 것이 더 짧을 까요?
mbomb007

숫자는 두 글자 (예 : 3 = ⠼⠉) 여야합니다. 숫자 접두사 (⠼)와 암호는 동등한 문자 (3 = c = ⠉)로 변환됩니다. 1-9-->a-i0-->j
아담

나는 다른 차트를 보았습니다. 내가 확인한 차트는 그렇지 않았습니다.
Marcus Dirr

방금 실제 Ascii 차트 대신 ASCII 점자 인코딩을 사용했습니다. 따라서 이것은 실격입니다.
Marcus Dirr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.