점자 그래픽


46

× 2 블록에서 부울 행렬을 잘라 점자 문자로 렌더링 U+2800... U+28FF.

[[0,1,0,0,1,0],
 [1,0,0,0,0,0],
 [1,0,0,0,1,0],
 [1,1,1,1,0,0]]

⣎⣀⠅

치수가 4와 2의 배수가 아닌 경우 0으로 채 웁니다.

[[0,1,0],
 [1,0,0],
 [1,1,1]]

⠮⠄

일반적인 골프 규칙이 적용되며 입력 형식이 유연합니다. 출력은 행렬의 구조를 가져야하거나 행렬처럼 보입니다 (예 : 문자열 목록). 줄 바꿈이있는 단일 문자열.

힌트 : chr(0x2800 + 128*b7 + 64*b6 + 32*b5 + 16*b4 + 8*b3 + 4*b2 + 2*b1 + b0)도트 패턴

b0 b3
b1 b4
b2 b5
b6 b7

더 큰 시험 :

[[0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0],
 [0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1],
 [0,1,1,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1],
 [1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1],
 [1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1,0],
 [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0],
 [1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0],
 [1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,1],
 [1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,0],
 [1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,0],
 [1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0],
 [1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,1,0,0,1,1,0,0],
 [0,1,1,0,1,1,1,0,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0],
 [0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0],
 [0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,1,1,1,1,0]]

⣰⠟⠻⣦⠀⠠⠾⡇⢠⡞⢛⡆
⣿⢠⣬⣥⠄⣀⠀⡇⢈⣻⣈⡀
⣿⠘⢹⡇⡞⠙⡇⣧⡉⢹⡏⠀
⠘⠷⠟⠁⠳⠾⠃⠘⠇⠾⠧⠀

두 번째 도전을 축하합니다.
Adám

5
더 나은 설명 : 행이 흑백 (픽셀 당 1 비트) 프레임 버퍼 또는 그래픽 캔버스의 가로 래스터 선을 나타내는 2D 부울 값 배열이 있습니다. 이 캔버스의 모든 4x2 직사각형 블록을 유니 코드 점자 문자로 인코딩하십시오. 가장자리에서 분수 블록을 처리하려면 캔버스 너비를 2의 배수로, 높이를 4의 배수로 0으로 채우십시오 (또는 그렇지 않으면 데이터가 마치 패딩 된 것처럼 처리하여 동등한 출력을 보장).
Kaz

3
@Kaz 몰라요,이 게시물이 얼마나 간결한 지 개인적으로 정말 감사합니다. IMO는 더 명확하게 작성하지 않을 것입니다 (높이는 4, 너비는 2 여야 함을 지적하는 것과 같은 몇 가지 작은 설명 외에도). 귀하의 제안은 현재 게시물보다 읽기가 어렵습니다.
Quelklef

답변:


10

젤리 ,  31  30 바이트

sz0Z
ç€2ZF€ç€8Zœ?@€€-36Ḅ+⁽$ṁỌY

온라인으로 사용해보십시오!

어떻게?

sz0Z - Link 1, split & right-pad with zeros: list, items; number, chunkSize
s    - split items into chunks of length chunkSize
 z0  - transpose with filler zero
   Z - transpose

ç€2ZF€ç€8Zœ?@€€-36Ḅ+⁽$ṁỌY - Main link: list of lists of numbers (1s & 0s), M
ç€2                       - call the last link (1) as a dyad for €ach (left=M, right=2)
                          -  ((left,right) bits read left-right then top-bottom)
   Z                      - transpose the resulting list of lists of lists
                          -  ((left, right) bits read top-bottom then left-right)
    F€                    - flatten €ach
      ç€8                 - call the last link (1) as a dyad for €ach (left=^, right=8)
         Z                - transpose the resulting list of lists of lists
                          -  ("blocks" each and all read left-right top-to bottom)
               -36        - literal -36
             €€           - for €ach (block-wise row) for €ach (block)
          œ?@             -   lexicographical permutation with reversed arguments
                          -    (get the permutation at index -36 (modular) in a list of
                          -     all permutations of the indexes sorted lexicographically.
                          -     That is the 8!-36 = 40284th - equivalently the values at
                          -     indexes [8,7,6,4,2,5,3,1])
                  Ḅ       - convert from binary list to integer (vectorises)
                    ⁽$ṁ   - base 250 literal = 10240
                   +      - add
                       Ọ  - cast to character (vectorises)
                        Y - join with newlines
                          - implicit print

1보다 큰 "숫자"를 지원 합니까 ? 결과에 10240 (0x2800-2 바이트)을 추가하는 대신 이진수 벡터에 40 (0x28-1 바이트)을 추가 할 수 있습니다. 젤리에 대해 잘 모르므로 이것이 실제로 작동하는지 확실하지 않습니다.
ngn

실제로 당신이 제안하는 것처럼 40의 선행 숫자를 변환 할 것이지만, 우리는 그것을 더 많은 바이트의 코드 ( ) 가 필요할 것 같은 목록 (2 깊이)에 추가해야합니다 ;@€€40Ḅ.
Jonathan Allan

6

자바 스크립트 ES7 210 207 201 200 198 194 185 183 바이트

a=>eval('for(y=0,c="";A=a[y];y+=4,c+=`\n`)for(x=0;A[x]+1;x+=2)c+=String.fromCharCode(10240+eval("for(N=k=0;k<6;k++)N+=(g=(X,Y=3)=>(a[Y+y]||0)[X+x]|0)(k>2,k%3)*2**k")|g(0)+g(1)*2<<6)')

ngn 덕분에 4 바이트 절약

Luke 덕분에 3 바이트 절약

작동 원리

코드를 여러 부분으로 나누고 별도로 이야기 할 것입니다.

for(y=x=0, c=""; a[y]; x+=2)
    !((a[y] || [])[x]+1) && (y+=4,x=0,c+=`\n`)

모든 변수가 선언되는 곳입니다. xy"커서"(현재 점자 글자의 왼쪽 에지)의 위치이다. x 좌표는 반복 할 때마다 2 씩 증가하며 인덱스가있는 행이 없으면 중지됩니다 y(a [x]가 undefined없으면 false로 변환 됨).

두 번째 행에는 여러 가지 트릭이 있습니다. 위치 (a[y] || [])[x]에서 값을 조회 (x, y)해도 오류가 발생하지 않습니다. 는 &&평소와 연산자이며, 좌측이 사실 인 경우에만, 식의 우측을 확인한다. 이것은 다음과 같이 번역 될 수 있습니다.

if (!((a[y] || [])[x] + 1)) 
    y+=4,x=0,c+=`\n`

다음 부분 :

c+=String.fromCharCode(10240+eval("for(N=k=0;k<6;k++)N+=(g=(x,y)=>(a[y]||[])[x]||0)(~~(k/3)+x,k%3+y)*2**k,N")+g(x,y+3)*64+g(x+1,y+3)*128)

String.fromCharCode전달 된 숫자를 동일한 문자 코드를 가진 유니 코드 문자로 변환합니다. 괄호 안의 표현식은 점자 문자의 색인을 계산합니다.

for(N=k=0;k<6;k++)N+=(g=(x,y)=>(a[y]||[])[x]||0)(~~(k/3)+x,k%3+y)*2**k

의 위치를 ​​통해 이동

1 4
2 5
3 6

차수는 해당 위치의 값에 2 i을 곱합니다 . 여기서 i는 인덱스이고 더합니다. 그만큼

g=(x,y)=>(a[y]||[])[x]||0

part는이라는 람다 함수를 선언합니다.이 함수 gxand 및 주어진 y좌표가 (x, y)위치 의 값을 반환하거나 위치가 배열의 경계를 벗어난 경우 0을 반환합니다.

+g(x,y+3)*64+g(x+1,y+3)*128

이 부분은 조금 더 일찍 정의 된 함수를 사용하여 올바른 가중치로 마지막 두 위치를 더합니다.

마지막으로

a=>eval('...')

부분에는 2 개의 기능이 있습니다. 익명 람다를 정의하고 for 루프로 인해 문제가 발생하지 않도록합니다 (이와 같은 단일 행 람다는 단일 for 루프 만 포함 할 수 없으므로 평가가 우회합니다).


몇 가지 간단한 제안 : ||0-> |0; ~~(k/3)-> (k>2); *128-> <<7(교체는 +-s와 |-s)
NGN

ES7 버전을 기본 솔루션으로 제출하지 않으시겠습니까?
Shaggy

@Shaggy 모두 ES7을 실행할 수있는 것은 아니므로 백업입니다.
Bálint

그것은이 부분들과 관련이 없다.;) 코드를 올바르게 실행할 수있는 하나의 단일 인터프리터 (브라우저)가있는 한 여기에서 유효한 것으로 간주된다.
Shaggy

@ngn 처음 두 가지에 감사하지만 비트 시프 팅은 기본적으로 우선 순위가 낮으므로 작동하지 않습니다.
Bálint

6

매쓰, 126 110 97 90

FromCharacterCode[10240+ListCorrelate[2^{{0,3},{1,4},{2,5},{6,7}},#,1,0][[;;;;4,;;;;2]]]&

이 솔루션 은 기본적으로 슬라이딩 행렬 곱셈 (또는 내적) 인 행렬에 대해 (역전 된) 커널ListCorrelate 을 활용하는 이점을 활용 합니다. 여기에 시각적 설명을 참조 하십시오 . 패딩은 네 번째 인수로 사용하여 수행됩니다 . 다음 예제에서는 결과가 위의 힌트와 일치 할 것으로 예상합니다.0

ListCorrelate[
  2^{{0, 3}, {1, 4}, {2, 5}, {6, 7}},
  {{b0, b3}, {b1, b4}, {b2, b5}, {b6, b7}}
]

(* returns {{b0 + 2 b1 + 4 b2 + 8 b3 + 16 b4 + 32 b5 + 64 b6 + 128 b7}} *)

참고 ListConvolve세 번째 인수가 될 것이기 때문에, 어떤 짧은되지 않습니다 -1.

이것은 매트릭스의 모든 위치에서 커널을 적용하기 때문에 모든 네 번째 행과 두 번째 열에서 요소를 추출하면됩니다. 우리는 대한 shorthands을 사용 Span하고 Part: [[;;;;4,;;;;2]].

유용하게 FromCharacterCode는 문자 코드 매트릭스를 가져 와서 문자열 목록을 리턴 할 수 있습니다.


이 솔루션은 허용되는 출력 형식 중 하나 인 문자열 목록을 반환합니다. Column@출력을“행렬처럼 보이게”하기 만하면 됩니다.


무료 온라인 Mathematica 노트북에서이 문제를 해결할 수 있습니다. 여기로 이동 한 후,이 코드에 눌러 붙여 넣기, 잠시 기다려, 새 노트북 만들기를 클릭합니다 shift+enter.

m1={{0,1,0,0,1,0},{1,0,0,0,0,0},{1,0,0,0,1,0},{1,1,1,1,0,0}};
m2={{0,1,0},{1,0,0},{1,1,1}};
m3={{0,0,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,1,0},{0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1},{0,1,1,0,0,1,1,1,0,0,0,1,1,1,1,0,0,1,1,0,0,0,1},{1,1,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,1,1,0,0,1,1},{1,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1,0},{1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0},{1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0},{1,1,0,1,1,1,1,1,0,0,1,1,0,0,1,0,0,1,1,1,1,1,1},{1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,0,1,1,1,1,1,1,0},{1,1,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,0},{1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0},{1,1,0,0,0,1,1,0,1,0,0,0,1,0,1,1,1,0,0,1,1,0,0},{0,1,1,0,1,1,1,0,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0},{0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,0,0},{0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,1,1,1,1,0}};

MatrixToBraille := Column@
  FromCharacterCode[10240+ListCorrelate[2^{{0,3},{1,4},{2,5},{6,7}},#,1,0][[;;;;4,;;;;2]]]&

MatrixToBraille/@{m1,m2,m3}

그럼 당신은 이것을 볼 수 있습니다 :


5

Dyalog APL, 133 122 114 112 101 100 98 95 94 93 90 88 86 바이트

가정 ⎕IO←0

{C⍴{⎕UCS 10240+2⊥(∊S⌷⍨⍵+⍳¨A)[⍎¨⍕76531420]}¨(,b)/,⍳⍴b←{0 0≡A|⍵}¨⍳⍴S←⍵↑⍨A×C←⌈(⍴⍵)÷A←4 2}

- 채팅 중 @ Adám 덕분에 8 9 12 바이트

@ngn 덕분에 -2 바이트

온라인으로 사용해보십시오!

(입력은 어떻게 )?

  • A←4 2벡터 4 2를 변수에 저장A
  • (⍴⍵)÷의 차원을 나눈 값A
  • , 천장
  • C←에 저장 C
  • 을 곱한 값 A
  • ⍵↑⍨그 치수에 맞습니다
  • S←에 저장 S
  • ⍳⍴의 색인 S
  • {0 0≡A|⍵}¨, 1셀의 왼쪽 상단이고, 0다른 곳
  • (,b)/,⍳⍴b←진실 된 지수
  • {⎕UCS 10240+2⊥(∊S⌷⍨⍵+⍳¨A)[⍎¨⍕76531420]}¨각 요소를 점자로 변환
  • C⍴치수를 C

고려 +/(2*0 3 1,A,4+⍳3)×something2⊥something[⍎¨⍕76524130]
NGN

내가 그것을 바꾼 후에도 여전히 작동하는 WOULD ⎕IO←0?
Zacharý

실제로, 그것은 다음 에서만 작동합니다 ⎕IO←0:)
ngn

나는 그것을 시도했는데, 내가 잘못하고 있습니까? tio.run/…
Zacharý

죄송합니다 ⎕IO. APL 에서이 어리석은 일 ( )을 잊었습니다 . 내용은 ⎕IO←1물론 당신은 76524130.의 각 숫자에 1을 추가해야 할 것,
NGN

4

자바 스크립트, 136 바이트

a=>(b=a.map(x=>[]),a.map((l,i)=>l.map((c,j)=>b[i>>2][j>>1]|=c<<'01263457'[i%4+j*4%8])),b.map(l=>l.map(c=>String.fromCharCode(10240+c))))

ngn 덕분에 비트 시프트를 사용하면 4 바이트가 절약됩니다.


당신은 같은 비트 교대 사용할 수 있습니다 i/4|0> -i>>2
NGN

c*2**비트 시프트입니다 :)
ngn

4

파이썬 2 + drawille , 141 125 120 116 바이트

ngn 및 L3viathan 덕분에 16 바이트 절약

L3viathan 덕분에 5 바이트 절약

ngn 덕분에 4 바이트 절약

from drawille import*
def a(d,c=Canvas(),e=enumerate):[c.set(j,i)for i,x in e(d)for j,y in e(x)if y];print c.frame()

온라인으로 사용해보십시오!

tio에는 drawille이 설치되어 있지 않아 작동하지 않습니다.


파이썬과 배터리! :) 나를 놀라게하지 않습니다. enumerate()목록 이해 를 사용 하는 경우이를 120 바이트 미만으로 줄일 수 있습니다 .
ngn

함수를 하나의 라이너로 만들어서 몇 바이트를 절약하십시오.def b(d,c=l.Canvas()):print([c.set(j,i)for i,x in enumerate(d)for j,y in enumerate(x)if y]and c).frame()
L3viathan


당신은 and c트릭이 필요하지 않습니다 -이해는 그 자체로 진술이 될 수 있습니다;print c.frame()
ngn

3

APL (Dyalog) , 57 54 바이트 *

OP 덕분에 -3입니다. 부울 매트릭스를 프롬프트합니다. 문자 행렬을 인쇄합니다.

1↓⎕UCS{240,⌽(,⍉3↑⍵),⊢⌿⍵}⌺(2 24 2)⊢0⍪⍣3⍪∘03⊢⎕,0

온라인으로 사용해보십시오!

⎕,0 오른쪽에 0을 추가하십시오 (짝수의 경우 무시 됨)

 그 수율 (분리하도록 3하고 )

⍪∘0⍣3 하단에 0을 추가합니다 ( 부분 창을 삭제 하기 때문에 )

0⍪⍣3왼쪽 상단에서 시작  하기 때문에 3 번이 0으로 쌓임

 산출량 (괄호와으로 구분 0)

{}⌺(2 2⍴4 2) 4 행 수직 및 2 행 수평 단계가있는 각 4 행 2 열 창에서 :

⊢⌿⍵ 마지막 행 (수직 오른쪽 축소); [b6,b7]

(), 접두사 :

  3↑ 세 줄을 가져 가라. [[b0,b3],[b1,b4],[b2,b5]]

   바꾸어 놓다; [[b0,b1,b2],[b3,b4,b5]]

  , 얽힘; [b0,b1,b2,b3,b4,b5]

 이제 우리는 [b0,b1,b2,b3,b4,b5,b6,b7]

 역; [b7,b6,b5,b4,b3,b2,b1,b0]

40, 접두사 40 (40 × 2 9 = 10240);[40,b7,b6,b5,b4,b3,b2,b1,b0]

2⊥ 기수 -2 (이진)로 평가

⎕UCS 문자로 변환

1↓ 첫 번째 행을 삭제하십시오 ( 패딩으로 인해 모두 0 )


* 클래식에서는로 계산 됩니다 ⎕U233A.


몇 바이트를 절약하는 쉬운 방법이 있습니다. Jelly 솔루션 아래의 내 의견을 참조하십시오.
ngn

실수가 있어야합니다. TIO 링크가 여기에 게시 한 코드와 일치하지 않습니다.
ngn

마지막에 0으로 채워지는 코드입니다 : 0⍪⍣3⍪∘0⍣3⊢⎕,0vs0⍪∘0⍣3⊢⎕,0
ngn

고정 @ngn,하지만 난 그 느낌이 ⍪∘0⍣3,0단지의 버그로 인해 필요 하고, 첫 번째는 테스트 케이스 필요하지 않습니다.
Adám

내 테스트 사례는 철저하지 않습니다. 물론 솔루션은 유효한 입력을 위해 작동해야합니다. 을 (를) 단축 0⍪⍣3⍪∘0⍣3⊢⍵,0할 수 있습니다 0(⊖⍪)⍣6⊢⍵,0.
ngn

2

파이썬 (3) , 168 (165) 161 바이트

def f(m):
 while m:
  r,m,s=[*zip(*m)],m[4:],''
  while r:s+=chr(10240+sum(q<<int(w)for(q,w)in zip((r[0]+(0,)*3)[:4]+(r+[()])[1],'01263457')));r=r[2:]
  print(s)

온라인으로 사용해보십시오!


멋지게 골프를 쳤다! [*zip(*m[:4])]을 호출 하는 대신 3 바이트를 저장할 수 있습니다 list.
Lynn


1

파이썬 3 , 169 바이트

a=[]
y=0
for l in eval(input()):
 y-=1;a+=y%4//3*[-~len(l)//2*[10240]];x=0
 for v in l:a[-1][x//2]|=v<<(6429374>>y%4*6+x%2*3&7);x+=1
for l in a:print(*map(chr,l),sep='')

온라인으로 사용해보십시오!


당신은 다시 작성할 수 있습니다 if y%4<1:a+=-~len(l)//2*[10240],a+=(y%4<1)*[-~len(l)//2*[10240]]와 맞 x=0;y+=1같은 줄에. 바이트를 절약한다고 생각합니다.
ngn

@ngn은 거기에서 몇 바이트를 더 절약했습니다. 감사합니다!
Lynn

1

펄 5 , 164 바이트

163 바이트 코드 + 1 플래그 -p

@a=eval}{for(;$r<@a;$r+=4){for($c=0;$c<@{$a[0]};$c+=2){$n="0b";map$n.=0|$a[$r+3][$c+$_],1,0;for$y(1,0){map$n.=0|$a[$r+$_][$c+$y],2,1,0}$\.=chr 0x2800+oct$n}$\.=$/}

온라인으로 사용해보십시오!

각 행 쉼표를 한 줄로 분리합니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.