编码代码页


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 | 米| 问| W | E | R | T | Z | U |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- +- -+ --- + --- + --- +-
| 2 | 我 O | P | A | S | D | F | G | H | J | | | | | | |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- +- -+ --- + --- + --- +-

这些行指定十六进制数的第一位,第二列指定十六进制数。

挑战

给定一个由16-255个唯一字符组成的字符串,请使用字符串中每个字符的从零开始的索引作为其值,输出相应的代码页。qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJ例如,输入将产生上表。

  • 输出必须与上表完全相同的格式。仅尾随换行符是可选的。
  • 如果输入长度不是16的倍数,则需要为剩余字符开始新的一行,并将未使用的单元格留空(=填充3个空格)。
  • 每个字符都精确地放置在单元格的中间,并在左右两侧填充一个空格。
  • 第一行和第一列中的值由带有数字的十六进制数字给出0123456789ABCDEF。左侧和右侧也填充了一个空格。您可以选择使用小写的十六进制数字,但需要坚持使用一个。
  • 输出中出现的唯一字符是连字符-,加号+,管道|,空格,十六进制数字和输入中的字符。
  • 禁止使用任何与ASCII艺术表相关的内建函数或以任何方式使该问题变得微不足道的方法。
  • 您可以假设输入仅包含特定编码的字符。请说明是否是这种情况。
  • 如果您的语言只能处理ASCII输入,则可以采用仅ASCII输入和重复字符。

规则

编码愉快!


我们可以使用小写的十六进制数字吗?
门把手

@Doorknob是的,在挑战中进行了澄清。
Denker

1
我们是否可以假设输入为ASCII(可能重复的字符)?
Luis Mendo

@DenkerAffe那会与给定的字符串16-255个唯一字符中的单词“ unique”或“ 255”相冲突,但是……
Luis

1
@LuisMendo嗯,是的。对于只能处理ASCII的语言,将允许这样做。
Denker

Answers:


7

Pyth,60个字节


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

领先的换行很重要。

在这里尝试。


您可以显示转译的代码吗?
CalculatorFeline

@CatsAreFluffy只需在在线解释器中启用调试模式。
Denker

换行符是做什么的?
Leaky Nun

@Adnan Whoops,这是我的疏忽。固定,谢谢。
门把手

@KennyLau它打印第一个+---+---+---[...]。在Pyth中,换行函数打印并返回其参数。
门把手

5

Python的3.5,326个 355字节:

+29个字节,因为如果最后一行的长度不是 16的倍数,则未使用的单元格应留空(尽管我认为,即使不显示这些空单元格也要好得多)

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所要求的,主要是因为如果最后一行不是16的倍数,它甚至不显示空单元格,而是仅显示填充的单元格,就是这样:

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啊,是的。我没有看到。Dang ...编辑正在进行中。老实说,这看起来比一个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字节(作弊?)

匿名VBE立即窗口功能,该功能具有破坏性地从范围中获取输入[A1]并输出到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"

生成的输出是

桌上的东西


概率无效,但仍然很酷。为了使其更相似(但仍然无效?),您应该打开适当的单元寄宿生。
Lyndon White
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.