Кодировать кодовую страницу

15

Вступление

Кодовая страница отображает целочисленные значения на определенный символ. Мы можем визуализировать кодовую страницу следующим образом:

+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | Б | C | D | E | F |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +
| 0 | q | ш | е | г | т | z | ты | я | о | р | а | с | д | f | г | J |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +
| 1 | к | л | у | х | с | V | б | п | м | Q | W | E | R | T | Z | U |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +
| 2 | Я | O | P | A | S | D | F | G | H | J | | | | | | |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +

В строках указывается первая цифра, а в столбцах - вторая цифра шестнадцатеричного числа.

Соревнование

Учитывая строку из 16-255 уникальных символов, выведите соответствующую кодовую страницу, используя в качестве значения нулевой индекс каждого символа в строке. qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJНапример, входные данные приведут таблицу выше.

  • Вывод должен быть в том же формате, что и в таблице выше. Только завершающий перевод строки не является обязательным.
  • Если длина ввода не кратна 16, вам нужно начать новую строку для оставшихся символов и оставить неиспользуемые ячейки пустыми (= заполнено 3 пробелами).
  • Каждый персонаж размещается точно в середине ячейки, дополненный одним пробелом слева и справа.
  • Значения в первой строке и столбце задаются шестнадцатеричными числами с цифрами 0123456789ABCDEF. Они дополняются одним пробелом слева и справа. Вы можете использовать строчные шестнадцатеричные цифры, но вам нужно придерживаться одной.
  • Единственными символами, присутствующими в выходных данных, являются дефисы -, плюсы +, каналы |, пробелы , цифры шестнадцатеричных чисел и символы из входных данных.
  • Любые встроенные функции, которые связаны с таблицами ASCII-art или тривиализируют проблему, запрещены.
  • Вы можете предположить, что ввод состоит только из символов определенной кодировки. Пожалуйста, уточните, так ли это.
  • Если ваш язык может обрабатывать только ввод ASCII, вы можете использовать ввод только ASCII и повторяющиеся символы.

правила

Удачного кодирования!

Denker
источник
Можем ли мы использовать строчные шестнадцатеричные цифры?
Ручка двери
@ Doorknob Да, уточнил в вызове.
Денкер
1
Можем ли мы предположить, что ввод ASCII (возможно, с повторяющимися символами)?
Луис Мендо
@DenkerAffe Это противоречило бы слову «уникальный» или «255» в «Заданной строке из 16–255 уникальных символов , хотя ...»
Луис Мендо,
1
@ LuisMendo Хм, да, это правда. Позволит это для языков, которые могут обрабатывать только ASCII.
Денкер

Ответы:

7

Pyth, 60 байт


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

Ведущий символ новой строки является значительным.

Попробуй это здесь.

Дверная ручка
источник
Можете ли вы показать переданный код?
CalculatorFeline
@CatsAreFluffy Просто включите режим отладки в онлайн-переводчике.
Денкер
Что делает перевод строки?
Утренняя монахиня
@ Adnan Ой, это было упущением с моей стороны. Исправлено, спасибо.
Ручка двери
@KennyLau Это печатает первый +---+---+---[...]. В Pyth функция newline печатает и возвращает свой аргумент.
Ручка двери
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 Ах, да. Я этого не видел. Черт ... редактировать сейчас в процессе. Хотя, если честно, это выглядит намного лучше, чем тот, который показывает OP, не так ли?
Р. Кап
Почему голосование против?
Р. Кап
@ R.Kap Я не могу вам точно сказать, но здесь, есть upvote
кот
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 Immediate Window, которая деструктивно принимает входные данные из диапазона [A1]и выводит ActiveSheetобъект.

Golfed

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

сгенерированный вывод

Стол чтоли

Тейлор Скотт
источник
пробники не действительны, но все равно круто. Чтобы сделать его более похожим (но все же недействительным?), Вы должны включить соответствующие границы ячейки.
Линдон Уайт