点字グラフィックス


46

4x2のブロックにブール行列をカットし、点字としてそれらをレンダリングし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]]

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

2番目の挑戦おめでとうございます。
アダム

5
より良い説明:白黒(ピクセルあたり1ビット)フレームバッファーまたはグラフィックスキャンバスの水平ラスターラインを行が表すブール値の2D配列があります。このキャンバスのすべての4x2長方形ブロックをUnicode点字にエンコードします。端で小数ブロックを処理するには、キャンバスの幅を2の倍数に、高さを4の倍数にゼロで埋め込みます(または、同等の出力を確保し、データをそのように埋め込みます)。
カズ

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バイト)を追加する代わりに、2進数のベクトルに40(0x28-1バイト)を追加できます。私はゼリーについてあまり知らないので、これが本当に機能するかどうかはわかりません。
-ngn

あなたが提案するように実際に先頭の数字40を変換しますが、私たちはより多くのバイトのコードを必要とするだろうと思う(2の深さで)そのようなリストに追加する必要があります(;@€€40Ḅ)。
ジョナサンアラン

6

JavaScriptの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`)

これは、すべての変数が宣言される場所です。xそしてy、「カーソル」(現在の点字の左上端)の位置です。x座標は反復ごとに2ずつ増加し、インデックスを持つ行がなくなると停止しますy(a [x]はundefined存在しない場合に戻り、falseに変換されます)。

2行目には複数のトリックがあります。(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渡された数値を同じ文字コードのUnicode文字に変換するだけです。括弧内の式は点字のインデックスを計算します:

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はg、と呼ばれるラムダ関数を宣言します。and 座標を指定するxy、その(x, y)位置の値、または位置が配列の境界の外側にある場合は0 を返します。

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

この部分は、少し前に定義した関数を使用して、正しい重みで最後の2つの位置を合計します。

最後になりましたが、

a=>eval('...')

一部には2つの機能があります。匿名ラムダを定義し、forループが問題を引き起こさないことを保証します(このような単一行のラムダは、単一のforループのみを含むことはできず、評価はこれを回避します)。


いくつかの簡単な提案:||0-> |0; ~~(k/3)-> (k>2); *128-> <<7(- +sを|-sに置き換えます)
-ngn

主なソリューションとしてES7バージョンを提出してみませんか?
シャギー

それはバックアップですので@Shaggyないの誰もが、まだES7を実行することができます
バリント

それは無関係です 'これらの部分の周り;)コードを適切に実行できる単一のインタプリタ(ブラウザ)がある限り、ここで有効であると見なされます。
シャギー

@ngn最初の二つのおかげで、それは動作しませんので、ビットシフトは、基本的には何よりも低い優先順位を持っている
バリント

6

Mathematica、126 110 97 90

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

この溶液をを利用するListCorrelateために、マトリックス上に(反転)カーネルを畳み込む本質的に摺動行列乗算(又はドット積)です。ここで視覚的な説明を参照してください。パディングは0、4番目の引数として使用して行われます。次の例では、結果が上記のヒントと一致することを期待しています。

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}} *)

ListConvolve3番目の引数はされるので、任意の短い方ではありません-1

これは行列のすべての位置にカーネルを適用するため、4行2列ごとに要素を抽出するだけです。私たちは、のために速記を使用するSpanPart[[;;;;4,;;;;2]]

便利なFromCharacterCodeことに、文字コードのマトリックスを取得して、文字列のリストを返すことができます。


このソリューションは、許可される出力形式の1つである文字列のリストを返します。「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}

- 8 9チャットの@Adámのおかげで 12バイト

@ngnのおかげで-2バイト

オンラインでお試しください!

方法(入力は)?

  • A←4 24 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

私はそれを変更したので、今でも動作し⎕IO←0ますか?
ザカリー

実際には、:)⎕IO←0
ngn

私はそれを試しましたが、何か間違ったことをしていますか?tio.run/...
ザカリー

申し訳ありませんが、⎕IOAPLのこの愚かなこと()を忘れていました。以下の場合⎕IO←1、もちろん、あなたは76524130.の各桁に1を追加する必要があるだろう、
NGN

4

JavaScript、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 + drawille141の 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がインストールされていないため動作しません


Pythonとそのバッテリー!:)びっくりすることはありません。enumerate()リスト内包表記を使用する場合、これを120バイト未満に縮小できます。
-ngn

関数を1行にすることにより、数バイトを節約します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バイト*

-3 OPのおかげ。ブール行列のプロンプト。文字行列を印刷します。

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

オンラインでお試しください!

⎕,0 右側にゼロを追加します(偶数列の場合は無視されます)

 (分離すること収率3

⍪∘0⍣3 下部に3回ゼロを追加します(部分的なウィンドウをドロップするため)

0⍪⍣3 ゼロを3回スタックします(左上隅から始まるため)

 それをもたらす(括弧とを分離する0

{}⌺(2 2⍴4 2) 4行2列ウィンドウごとに、4行垂直および2行水平ステップで:

⊢⌿⍵ 最後の行(点灯、垂直右縮小); [b6,b7]

(), 付加:

  3↑ 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⊥ base-2(バイナリ)として評価

⎕UCS 文字に変換する

1↓ 最初の行をドロップします(パディングのためにすべてゼロ)


* Classicでは、としてカウントし⎕U233Aます。


数バイトを保存する簡単な方法があります。Jellyソリューションの下で私のコメントをご覧ください。
ngn

間違いがあります-TIOリンクはここに投稿したコードと一致しません。
NGN

それは終わり近くのゼロパディングコードです:0⍪⍣3⍪∘0⍣3⊢⎕,0vs0⍪∘0⍣3⊢⎕,0
ngn

固定@ngnが、私はその気持ちを持っている⍪∘0⍣3し、,0唯一のバグが原因で必要とされ、そして最初のものは、あなたのテストケースには必要ありません。
アダム

私のテストケースは網羅的ではありません-もちろん、ソリューションは有効な入力に対して機能するはずです。あなたは短縮することができます0⍪⍣3⍪∘0⍣3⊢⍵,00(⊖⍪)⍣6⊢⍵,0
NGN



1

Python 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はそこからさらに数バイトを節約しました、ありがとう!
リン

1

Perl 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}$\.=$/}

オンラインでお試しください!

1行で区切られた各行のコンマを取ります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.