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-i와0-->j
— 아담

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

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