Code a code page

18

3

Introduction

A code page maps integer values to a specific character. We can visualize a code page like this:

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

The rows specify the first digit and the columns the second digit of the hex-number.

The Challenge

Given a string of 16-255 unique characters, output the corresponding code page using the zero-based index of each character in the string as it's value. The input qwertzuiopasdfgjklyxcvbnmQWERTZUIOPASDFGHJ for example would yield the table above.

  • The output has to be in the exact same format as the table above. Only a trailing newline is optional.
  • If the input length is not a multiple of 16, you need to start a new row for the remaining characters and leave the unused cells empty (=filled with 3 spaces).
  • Each character is placed exactly in the middle of a cell, padded by one space to the left and right.
  • The values in the first row and column are given by hex-numbers with the digits 0123456789ABCDEF. Those are padded with one space to the left and right as well. You may choose to use lowercase hex-digits but you need to stick to one.
  • The only characters present in the output are hyphens -, pluses +, pipes |, spaces , the digits for hexadecimal numbers and the characters from the input.
  • Any builtins that are related to ASCII-art tables or trivialize the problem in any way are forbidden.
  • You may assume that the input consists only of characters of a specific encoding. Please specify if that is the case.
  • If your language can only handle ASCII input, you may assume ASCII-only input and repeated characters.

Rules

Happy Coding!

Denker

Posted 2016-04-01T23:57:02.223

Reputation: 6 639

Can we use lowercase hex digits? – Doorknob – 2016-04-01T23:59:36.193

@Doorknob Yes, clarified it in the challenge. – Denker – 2016-04-02T00:00:57.337

1Can we assume the input is ASCII (with possibly repeated characters)? – Luis Mendo – 2016-04-02T00:05:35.090

@DenkerAffe That would conflict with the word "unique" or with "255" in Given a string of 16-255 unique characters, though... – Luis Mendo – 2016-04-02T00:07:36.610

@DenkerAffe It's a pity, because using non-ASCII will leave quite a few languages out. You could always allow sequences with repeated characters, and so allow ASCII-only languages too. The spirit of the challenge is not altered by that, and more languages can participate – Luis Mendo – 2016-04-02T00:12:07.080

1@LuisMendo Hmm yea, thats true. Gonna allow that for languages that can only handle ASCII. – Denker – 2016-04-02T00:14:53.067

@DenkerAffe Is it okay if the code page is not in exactly the same format as the one you show? – R. Kap – 2016-04-02T03:47:16.507

@R.Kap No, the output has to be exactly as specified. – Denker – 2016-04-02T12:35:19.777

@DenkerAffe I'm talking about the look of the page. For example,is it okay to print out the first row like | 1 || 2 || 3 || 4 |... instead of what you show in your example? – R. Kap – 2016-04-02T20:42:39.307

@R.Kap That's not an example, thats the reference format. You have to use this and nothing else. Othwewise the answers wouldn't be compareable. – Denker – 2016-04-02T20:52:38.987

@DenkerAffe Ah, okay. I'll use that format then. – R. Kap – 2016-04-02T20:57:22.283

So you have a QWERTZ keyboard, right? – Erik the Outgolfer – 2016-09-04T20:14:55.560

Answers

7

Pyth, 60 bytes


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

The leading newline is significant.

Try it here.

Doorknob

Posted 2016-04-01T23:57:02.223

Reputation: 68 138

Can you show the transpiled code? – CalculatorFeline – 2016-04-02T00:27:48.667

@CatsAreFluffy Just enable the debug mode in the online interpreter. – Denker – 2016-04-02T00:42:45.060

What does the newline do? – Leaky Nun – 2016-04-02T10:56:56.480

@Adnan Whoops, that was an oversight on my part. Fixed, thanks. – Doorknob – 2016-04-03T14:48:05.277

@KennyLau It prints the first +---+---+---[...]. In Pyth, the newline function prints and returns its argument. – Doorknob – 2016-04-03T14:48:28.983

I just did not know that "\n" means, I thought it means the string "n" (because "" is used for strings) – Leaky Nun – 2016-04-03T14:50:35.797

6

Python 3.5, 326 355 bytes:

(+29 bytes since if the length of the last row is not a multiple of 16, unused cells should be left empty (although, in my opinion, it looks much better if those empty cells are just not even shown))

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+'+')

Works like a charm!

Sample Inputs and Outputs:

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 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

I hope this is okay.

Also, here is another version I created for this challenge, which, although is an invalid candidate since it does not print out extra empty cells for the last row if its length is not a multiple 16, in my opinion outputs a much better looking page than the one required by OP, mainly because it does not even show empty cells if the last row is not a multiple of 16, but instead just shows filled cells, and that's it:

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)+'+')

Here is a sample input and output for the inapplicable code above:

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.)

R. Kap

Posted 2016-04-01T23:57:02.223

Reputation: 4 730

"If the input length is not a multiple of 16, you need to start a new row for the remaining characters and leave the unused cells empty (=filled with 3 spaces)." – Leaky Nun – 2016-04-03T07:24:20.753

@KennyLau Ah, yes. I did not see that. Dang...edit now in progress. Honestly though, this looks much better than the one OP shows, don't you think? – R. Kap – 2016-04-03T07:25:24.893

Why the down vote? – R. Kap – 2016-04-05T19:06:06.867

@R.Kap I couldn't quite tell you, but here, have an upvote – cat – 2016-04-16T15:22:01.723

3

Excel VBA, 157 146 Bytes (Cheating?)

Anonymous VBE Immediate Window function that destructively takes input from range [A1] and outputs to the ActiveSheet object.

Golfed

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

Formatted

[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]=""

Input / Output

Given:

[A1]="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJ"

the generated output is

Table thingy

Taylor Scott

Posted 2016-04-01T23:57:02.223

Reputation: 6 709

probs not valid, but cool anyway. To make it more similar (but still invalid?) you should turn on the appropriate cell boarders. – Lyndon White – 2018-01-21T14:43:12.240

2

JavaScript (ES6), 148 bytes

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

The ' 0123456789ABCDEF' exists to populate the first column, but conveniently also covers the first row. The input string is then padded with spaces to allow it to be split into substrings of length 16, with the (?|^) preventing the leading space from being matched. The rest is just joining up the pieces.

Neil

Posted 2016-04-01T23:57:02.223

Reputation: 95 035

2

05AB1E, 65 63 bytes

Code:

"+---"17×'+J©,žhAu6£¹J16÷)v„| ?N>iðëN<16B}y«ð17×ðñvy„ |ðJ?}¶?®,

Try it online!. Uses CP-1252 encoding.

Adnan

Posted 2016-04-01T23:57:02.223

Reputation: 41 965

1

PowerShell, 127 126 121 bytes

($d='+---'*17+'+')
($n="0123456789ABCDEF$args"+' '*16)|sls '.{16}'-a|% m*|% v*|%{"$($n[$i++-1]+$_|% t*y|%{"| $_"}) |"
$d}

Try it online!

mazzy

Posted 2016-04-01T23:57:02.223

Reputation: 4 832

1

Excel (Version 1911), 247

A1 =DEC2HEX(COLUMN(A1:P1)-1)
A2 'Input String
A3 =2+LEN(A2)/16
A4 =CONCAT(" ",C2#)
A5 =TEXTJOIN("
"&REPT("+---",17)&"+
",0,,"| "&MID(A4,B2#+1,1)&" | "&MID(TEXTJOIN(" | ",0,A1#,MID(A2&REPT(" ",16),HEX2DEC(C2#&A1#)+1,1)),B2#*64+1,61)&" |",) ' Output
B2 =SEQUENCE(A3)-1
C2 =DEC2HEX(SEQUENCE(A3-1)-1)

Sample Test

Sample test

Excel (Joke answer), 88 Bytes

Not a valid solution, but fun

B2 'Input
C4 =DEC2HEX(SEQUENCE(,16,0))
B5 =DEC2HEX(SEQUENCE(1+LEN(B2)/16)-1)
C5 =MID(B2,HEX2DEC(B5#&C4#)+1,1)

Output

enter image description here

begolf123

Posted 2016-04-01T23:57:02.223

Reputation: 531

0

Perl 5 -F, 134 bytes

@F=(@a=($",0..9,A..F),@F,($")x(16-(@F%16||16)));shift@F;$,=" | ";say$:="
"."+---"x17 .'+';say+('| '.shift@a),(splice@F,0,16),$:while@F

Try it online!

Xcali

Posted 2016-04-01T23:57:02.223

Reputation: 7 671