コードページをコーディングする


15

前書き

コードページは、整数値を特定の文字にマップします。次のようなコードページを視覚化できます。

+ --- + --- + --- + --- + --- + --- + ---- + --- + --- + --- + --- + --- +- -+ --- + --- + --- + --- +
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
+ --- + --- + --- + --- + --- + --- + ---- + --- + --- + --- + --- + --- +- -+ --- + --- + --- + --- +
| 0 | q | w | e | r | t | z | あなた| 私| o | p | | s | d | f | g | j |
+ --- + --- + --- + --- + --- + --- + ---- + --- + --- + --- + --- + --- +- -+ --- + --- + --- + --- +
| 1 | k | l | y | x | c | v | b | n | m | Q | W | E | R | T | Z | U |
+ --- + --- + --- + --- + --- + --- + ---- + --- + --- + --- + --- + --- +- -+ --- + --- + --- + --- +
| 2 | 私| O | P | A | S | D | F | G | H | J | | | | | | |
+ --- + --- + --- + --- + --- + --- + ---- + --- + --- + --- + --- + --- +- -+ --- + --- + --- + --- +

行は16進数の最初の桁を指定し、列は2番目の桁を指定します。

チャレンジ

16〜255個の一意の文字列を指定すると、文字列内の各文字のゼロベースのインデックスを値として使用して、対応するコードページを出力します。qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJたとえば、入力により上記の表が生成されます。

  • 出力は上記の表とまったく同じ形式である必要があります。末尾の改行のみがオプションです。
  • 入力の長さが16の倍数でない場合、残りの文字の新しい行を開始し、未使用のセルを空のままにする必要があります(= 3つのスペースで埋められます)。
  • 各文字は、セルの中央に正確に配置され、左右に1つのスペースが埋め込まれます。
  • 最初の行と列の値は、数字の付いた16進数で指定されます0123456789ABCDEF。これらにも左右に1つのスペースが埋め込まれます。小文字の16進数を使用することもできますが、1桁に固執する必要があります。
  • 出力に存在する文字は、ハイフン-、プラス+、パイプ|、スペース、16進数の数字、および入力からの文字のみです。
  • ASCIIアートテーブルに関連するビルトインや、何らかの方法で問題を単純化するビルトインは禁止されています。
  • 入力は特定のエンコーディングの文字のみで構成されていると想定できます。その場合は指定してください。
  • ご使用の言語がASCII入力のみを処理できる場合、ASCIIのみの入力と繰り返し文字を想定できます。

ルール

  • 機能または完全なプログラムが許可されます。
  • 入出力のデフォルト規則
  • 標準の抜け穴が適用されます。
  • これはなので、バイト数が最も少なくなります。Tiebreakerは以前の提出です。

ハッピーコーディング!


小文字の16進数を使用できますか?
ドアノブ

@Doorknobはい、チャレンジで明らかにしました。
デンカー

1
入力がASCII(おそらく文字が繰り返される)であると想定できますか?
ルイスメンドー

それは言葉「独特」とかと競合する@DenkerAffe「255」で16から255個のユニークな文字列を考えると、しかし...
ルイスMendo

1
@LuisMendoうーん、それは本当だ。ASCIIのみを処理できる言語では、これを許可します。
デンカー

回答:


7

Pyth、60バイト


K+*"+---"hJ16\+Vm++"| "j" | "d" |"+]+]d.HMJ.e+.Hk.[bdJczJNK

主要な改行は重要です。

ここで試してみてください。


トランスコンパイルされたコードを表示できますか?
CalculatorFeline

@CatsAreFluffyオンラインインタープリターでデバッグモードを有効にします。
デンカー

改行は何をしますか?
リーキー修道女

@Adnan Whoops、それは私の側の見落としでした。修正済み、ありがとう。
ドアノブ

@KennyLau最初のを印刷し+---+---+---[...]ます。Pythでは、newline関数は引数を出力して返します。
ドアノブ

5

Python 3.5、326 355バイト:

最後の行の長さが16の倍数でない場合、未使用のセルは空のままにしておく必要があるため+29バイト

def f(r):o=' 0123456789ABCDEF';r=[r[0+i:16+i]for i in range(0,len(r),16)];print('+---'*17+'+\n|',end='');[print(' {} |'.format(h),end='')for h in o];print(''.join([str(e+' | ')if e.isdigit()or e.isalpha()else str(e)for e in''.join([str('\n'+'+---'*17+'+\n| '+x[0]+x[1])for x in zip(o[1::1],r)])]),end='');print('  |'+'   |'*(15-len(r[-1]))+'\n'+'+---'*17+'+')

チャームのように機能します!

サンプルの入力と出力:

Input: 'hopper'

Output:

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | h | o | p | p | e | r |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

Input: 'honkhonkhonkhonkhonk'

Output:

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | h | o | n | k | h | o | n | k | h | o | n | k | h | o | n | k | 
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 1 | h | o | n | k |   |   |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

Input: 'hi'

Output: 

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | h | i |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

これでいいと思います。

また、ここでこのチャレンジ用に作成した別のバージョンがありますが、最後の行に余分な空のセルが出力されないため無効です。主に最後の行が16の倍数ではない場合でも空のセルを表示せず、代わりに塗りつぶされたセルのみを表示するため、OPで必要なものよりも、それだけです:

def f2(r):o=' 0123456789ABCDEF';r=[r[0+i:16+i]for i in range(0,len(r),16)];print('+---'*17+'+\n|',end='');[print(' {} |'.format(h),end='')for h in o];print(''.join([str(e+' | ')if e.isdigit()or e.isalpha()else str(e)for e in''.join([str('\n'+'+---'*17+'+\n| '+x[0]+x[1])for x in zip(o[1::1],r)])]));print('+---'*(len(r[-1])+1)+'+')

上記の適用できないコードの入力と出力の例を次に示します。

Input: 'ggreuuobgugoubgoubguorgoruguor'

Output:

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | g | g | r | e | u | u | o | b | g | u | g | o | u | b | g | o | 
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 1 | u | b | g | u | o | r | g | o | r | u | g | u | o | r | 
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

    (As you can see, there are no empty cells shown in the entire table. This looks much better to me.)

入力の長さが16の倍数でない場合、残りの文字の新しい行を開始し、未使用のセルを空のままにする必要があります(= 3つのスペースで埋められます)。
Leaky Nun

@KennyLauあ、はい。私はそれを見ませんでした。ダン...編集中です。正直なところ、これはOPが示すものよりもはるかに良く見えますよね?
R. Kap

なぜ反対票なのか?
R. Kap

@ R.Kapはっきり言えませんが、ここでは、賛成票があります
cat


1

JavaScript(ES6)、148バイト

s=>(s=' 0123456789ABCDEF'+s+' '.repeat(15)).match(/(?!^).{16}/g).map((t,i)=>d+`+
| `+[s[i],...t].join` | `,d=`+---`.repeat(17)).join` |
`+` |
${d}+`

' 0123456789ABCDEF'最初の列を移入するために存在するが、好都合にも、最初の行をカバーします。次に、入力文字列にスペースを埋め込み、長さ16の部分文字列に分割できるようにし(?|^)、先頭のスペースが一致しないようにします。残りはピースを結合するだけです。


1

Excel VBA、157バイト(不正行為?)

範囲から入力を破壊的に取得し[A1]、出力する匿名VBEイミディエイトウィンドウ関数ActiveSheetオブジェクトに。

ゴルフ

[B1:Q1]="=Dec2Hex(Column(B1)-2)":L=[Len(A1)]:For i=0To l:Cells(Int(i/16)+2,i Mod 16+2)=Mid([A1],i+1,1):Next:For i=1To Int(l/16)+1:Cells(i+1,1)=i:Next:[A1]=""

フォーマット済み

[B1:Q1]="=Dec2Hex(Column(B1)-2)"
L=[Len(A1)]
For i=0To l:Cells(Int(i/16)+2,i Mod 16+2)=Mid([A1],i+1,1):Next
For i=1To Int(l/16)+1:Cells(i+1,1)=i:Next
[A1]=""

入出力

与えられた:

[A1]="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJ"

生成された出力は

テーブルもの


probsは有効ではありませんが、とにかくクールです。似たような(しかしまだ無効ですか?)ようにするには、適切なセル境界線をオンにする必要があります。
リンドンホワイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.