文字列を点字化する


22

いいえ、これはASCIIテキストを点字変換するのではありません。

2つありますUnicodeに 8 = 256 点字パターンがあります。(「点字」とは、8セルを意味します)

待って ASCII文字はいくつありましたか?

2 7 = 128?

それでは、ASCIIを点字に変えてみましょう。


ASCIIから点字への道

各セルがビットを表し、各セルが「パンチ」されているかどうかがわかります。

これで、各セルを割り当てて、ASCII文字のビットをバイナリとして表すことができます。

(1  )(16 )
(2  )(32 )
(4  )(64 )
(8  )( - )

* ( - )は空白です

これでASCIIを点字に変換できます。たとえば、A(65 = 01000001)は次と等しい

Input -> Output
Braille! -> ⠢⠺⠱⡱⡴⡴⠵⠑
(Upscaled)
.. .o o. o. .. .. o. o.
o. oo .o .o .o .o .o .o
.o .o .o .o oo oo oo ..
.. .. .. o. o. o. .. ..

確かa、ではない(私はそう思うq)?
ニール

@Neil課題は、「文字コード+ 10240を文字に変換する」だけではありません。はい、そうaです
エリックアウトゴルファー

@EriktheOutgolfer私はそれを提案しませんでしたが、パンチされたセルの数が間違っているため、どちらの方法も間違っていたでしょう。
ニール

@ニールああいい。私は再計算し、あなたが正しいことを知りました。
マシュー

MSB(左上)ではなく、LSB(右下)が未使用のままになっていることを他の人に奇妙に感じますか?
ジュリアンウルフ

回答:


14

CJam27 26バイト

80qf{i2b7Te[4/~\)\@+++2bc}

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

説明

点字コードポイントはきちんと順序付けられているため、個々のドットはバイナリでカウントアップされます。ただし、コードポイントのビットの順序は異なります。次の順序が必要です。

04
15
26
37

一方、文字は次の順序でUnicodeでレイアウトされます。

03
14
25
67

(歴史的に、点字は最初の6つのドットしか使用していなかったため、どのような意味がありますか。)7入力はASCII範囲内であることが保証されているため、ドットは必要ありません。その[6 5 4 3 2 1 0]ため、入力文字のビットのリストが与えられた場合、それらをに並べ替えて[3 6 5 4 2 1 0]、左下のドットを表すビットを最上位にプルします。

80     e# Push 80... we'll need this later.
q      e# Read all input.
f{     e# Map this block onto each character, putting a copy of the 80
       e# below each character.
  i    e#   Convert the character to its code point.
  2b   e#   Get its binary representation.
  7Te[ e#   Pad it to 7 bits with zeros. We've now got some bit list
       e#   [6 5 4 3 2 1 0].
  4/   e#   Split into chunks of 4: [[6 5 4 3] [2 1 0]]
  ~    e#   Dump them onto the stack: [6 5 4 3] [2 1 0]
  \    e#   Swap them: [2 1 0] [6 5 4 3]
  )    e#   Pull off the last element: [2 1 0] [6 5 4] 3
  \    e#   Swap: [2 1 0] 3 [6 5 4]
  @    e#   Rotate: 3 [6 5 4] [2 1 0]
  ++   e#   Concatenate twice: [3 6 5 4 2 1 0]
       e#   That's the reordering done.
  +    e#   Prepend the 80. That puts it in the 2^7 position of the
       e#   binary digit list, which gives it a value of 10240, which
       e#   is where the Braille characters start.
  2b   e#   Convert the bits back to an integer.
  c    e#   Convert the code point to the corresponding integer.
}%

1
の巧妙なトリック80
エリックアウトゴルファー

11

JavaScript(ES6)、83バイト

f=
s=>s.replace(/./g,c=>String.fromCharCode((c=c.charCodeAt())&7|c*8&64|c/2&56|10240))
<input oninput=o.textContent=f(this.value)><pre id=o>


そうそう、私はおそらくそれをとる前に2で割って、バイトを節約する必要があります。
マーティンエンダー

たぶんjQueryの悪用を使用できますか?
マシュー盧


5

CJam、27バイト

Neilから盗まれた1バイト。

q{i__8&8*@7&@2/56&++'⠀+}%

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

説明

これは、他のCJamの回答と同じ基本的な考え方を使用しますが、ビットの順序を変更するために、ベース変換とリスト操作の代わりにビット演算を使用します。

q        e# Read all input.
{        e# Map this block over each character...
  i__    e#   Convert the character to its code point and make two copies.
  8&     e#   AND 8. Gives the 4th bit, which we need to move to the 7th place.
  8*     e#   Multiply by 8 to move it up three places.
  @7&    e#   Pull up another copy and take it AND 7. This extracts the three
         e#   least significant bits which shouldn't be moved at all.
  @2/    e#   Pull up the last copy and divide by 2 to shift all bits down
         e#   by one place.
  56&    e#   AND 56. Extracts the three most-significant bits.
  ++     e#   Add all three components back together.
  '⠀+    e#   Add to the empty Braille character which is the offset for all
         e#   the code points and which converts the value to a character.
}%


2

Mathematica 100バイト

FromCharacterCode[10240+#~Drop~{4}~Prepend~#[[4]]~FromDigits~2&/@ToCharacterCode@#~IntegerDigits~2]&

ゴルフをしていない:

ToCharacterCode["Braille!0"]
PadLeft@IntegerDigits[%,2]
Prepend[Drop[#,{4}],#[[4]]]&/@%
FromDigits[#,2]&/@%
FromCharacterCode[%+10240]

これの+60バイトは、長い関数名に結び付けられています。


1

ゼリー、21バイト

O&€“¬®p‘æ.1,8,.+“'ṁ’Ọ

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

使い方

O&€“¬®p‘æ.1,8,.+“'ṁ’Ọ  Main link. Argument: s (string)

O                      Ordinal; map all characters to their Unicode code points.
   “¬®p‘               Yield the code points of the enclosed characters in Jelly's
                       code page, i.e., [1, 8, 112].
 &€                    Take the bitwise AND of each code point to the left and the
                       three code points to the right.
          1,8,.        Yield [1, 8, 0.5].
        æ.             Take the dot product of the array to the right and each flat
                       array in the array to the left.
                “'ṁ’   Yield 10240 = 250 × 39 + 239, where 39 and 239 are the
                       indices of ' and ṁ in Jelly's code page.
               +       Add 10240 to all integers to the left.
                    Ọ  Unordinal; convert all code points to their respective 
                       Unicode charcters.

0

網膜、59バイト

T`�-- -'0-7@-GP-W\`-gp-w--(-/8-?H-OX-_h-ox-`⠀-⡿

オンラインでお試しください!六角ダンプ:

0000  54 60 00 2a 07 10 2a 17  20 2a 17 30 2a 17 40 2a  T`�-- -'0-7@-
0010  47 50 2a 57 5c 60 2a 67  70 2a 77 08 2a 0f 18 2a  GP-W\`-gp-w--
0020  1f 28 2a 2f 38 2a 3f 48  2a 4f 58 2a 5f 68 2a 6f  (-/8-?H-OX-_h-o
0030  78 2a 7f 60 e2 a0 80 2a  e2 a1 bf                 x-`⠀-⡿


0

チップ62 59バイト

h*
 Z~.
z.g+b
>xv<
||sf
Zx^<
Z< |
A/a/D
B/b
C/c
E/d
F/e
G/f

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

もっとゴルフができると思うので、どうやって...

チップは、入力の各バイトをビットの集合として読み取り、アルファベットの最初の8文字で参照します(大文字が入力、小文字が出力)。

HGFEDCBA

入力のこれらのビットを次の3バイトの出力にマップするだけです。

11100010 101000hd 10gfecba

コードの上半分はすべてのシーケンスを実行し、最初の2バイトを生成し、下半分は3番目のバイトを生成します。

仕様ではASCIIの7ビットのみを処理する必要があるため、検討しませんH。8番目のビットを含めるには、行B/bをに変更しB/b/Hます。

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