Mã một trang mã


15

Giới thiệu

Một trang mã ánh xạ các giá trị nguyên thành một ký tự cụ thể. Chúng ta có thể hình dung một trang mã như thế này:

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

Các hàng chỉ định chữ số đầu tiên và các cột là chữ số thứ hai của số hex.

Các thách thức

Đưa ra một chuỗi gồm 16-255 ký tự duy nhất, xuất trang mã tương ứng bằng cách sử dụng chỉ mục dựa trên số không của mỗi ký tự trong chuỗi làm giá trị của nó. qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJVí dụ, đầu vào sẽ mang lại bảng trên.

  • Đầu ra phải có cùng định dạng như bảng trên. Chỉ có một dòng mới là tùy chọn.
  • Nếu độ dài đầu vào không phải là bội số của 16, bạn cần bắt đầu một hàng mới cho các ký tự còn lại và để trống các ô không sử dụng (= chứa đầy 3 khoảng trắng).
  • Mỗi ký tự được đặt chính xác ở giữa một ô, được đệm bởi một khoảng trắng ở bên trái và bên phải.
  • Các giá trị trong hàng và cột đầu tiên được cho bởi các số hex với các chữ số 0123456789ABCDEF. Những người được đệm với một không gian bên trái và bên phải là tốt. Bạn có thể chọn sử dụng chữ số hex chữ thường nhưng bạn cần phải dán vào một chữ số.
  • Các ký tự duy nhất có trong đầu ra là dấu gạch nối -, dấu cộng +, đường ống |, dấu cách , chữ số cho số thập lục phân và các ký tự từ đầu vào.
  • Bất kỳ nội dung liên quan đến bảng nghệ thuật ASCII hoặc tầm thường hóa vấn đề theo bất kỳ cách nào đều bị cấm.
  • Bạn có thể cho rằng đầu vào chỉ bao gồm các ký tự của một mã hóa cụ thể. Vui lòng xác định nếu đó là trường hợp.
  • Nếu ngôn ngữ của bạn chỉ có thể xử lý đầu vào ASCII, bạn có thể giả sử các ký tự đầu vào và lặp lại chỉ ASCII.

Quy tắc

Chúc mừng mã hóa!


Chúng ta có thể sử dụng chữ số hex chữ thường không?
Doorknob

@Doorknob Vâng, làm rõ nó trong thử thách.
Denker

1
Chúng ta có thể giả sử đầu vào là ASCII (với các ký tự có thể lặp lại) không?
Luis Mendo

@DenkerAffe Điều đó sẽ mâu thuẫn với từ "duy nhất" hoặc với "255" trong Cho một chuỗi gồm 16-255 ký tự duy nhất , mặc dù ...
Luis Mendo

1
@LuisMendo Hmm yea, đó là sự thật. Gonna cho phép đối với các ngôn ngữ chỉ có thể xử lý ASCII.
Denker

Câu trả lời:


7

Bình thường, 60 byte


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

Các dòng mới hàng đầu là đáng kể.

Hãy thử nó ở đây.


Bạn có thể hiển thị mã được phiên mã?
Máy

@CatsAreFluffy Chỉ cần kích hoạt chế độ gỡ lỗi trong trình thông dịch trực tuyến.
Denker

Dòng mới làm gì?
Leaky Nun

@Adnan Rất tiếc, đó là một sự giám sát về phía tôi. Đã sửa, cảm ơn.
Doorknob

@KennyLau Nó in cái đầu tiên +---+---+---[...]. Trong Pyth, hàm newline in và trả về đối số của nó.
Doorknob

5

Python 3.5, 326 355 byte:

( +29 byte vì nếu độ dài của hàng cuối cùng không phải là bội số của 16, các ô không được sử dụng sẽ bị bỏ trống (mặc dù, theo tôi, sẽ tốt hơn nhiều nếu các ô trống đó thậm chí không được hiển thị) )

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

Hoạt động như một lá bùa!

Đầu vào và đầu ra mẫu:

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

Tôi hy vọng điều này là ổn.

Ngoài ra, đây là một phiên bản khác tôi đã tạo cho thách thức này, trong đó, mặc dù là một ứng cử viên không hợp lệ vì nó không in ra các tế bào thêm trống cho hàng cuối cùng nếu chiều dài của nó không phải là một bội số 16, theo ý kiến của tôi ra một trang tốt hơn nhiều tìm kiếm so với yêu cầu của OP, chủ yếu là vì nó thậm chí không hiển thị các ô trống nếu hàng cuối cùng không phải là bội số của 16, mà thay vào đó chỉ hiển thị các ô đã điền và đó là:

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

Dưới đây là một mẫu đầu vào và đầu ra cho mã không thể áp dụng ở trên:

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

" Nếu độ dài đầu vào không phải là bội số của 16, bạn cần bắt đầu một hàng mới cho các ký tự còn lại và để trống các ô không sử dụng (= chứa đầy 3 khoảng trắng). "
Leaky Nun

@KennyLau À, vâng. Tôi đã không nhìn thấy điều đó. Dang ... chỉnh sửa ngay bây giờ. Thành thật mà nói, điều này có vẻ tốt hơn nhiều so với một chương trình OP, bạn có nghĩ vậy không?
R. Kap

Tại sao bỏ phiếu xuống?
R. Kap

@ R.Kap Tôi không thể nói cho bạn biết, nhưng ở đây, có một upvote
mèo


1

JavaScript (ES6), 148 byte

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

Sự ' 0123456789ABCDEF'tồn tại để điền vào cột đầu tiên, nhưng thuận tiện cũng bao gồm hàng đầu tiên. Chuỗi đầu vào sau đó được đệm bằng các khoảng trắng để cho phép phân tách thành các chuỗi con có độ dài 16, với việc (?|^)ngăn không gian đầu không khớp. Phần còn lại chỉ là tham gia lên các mảnh.


1

Excel VBA, 157 Byte (Gian lận?)

Chức năng Cửa sổ tức thời VBE ẩn danh có thể phá hủy đầu vào từ phạm vi [A1]và đầu ra choActiveSheet đối tượng.

Chơi gôn

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

Định dạng

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

Đầu ra đầu vào

Được:

[A1]="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJ"

đầu ra được tạo ra là

Bảng điều


probs không hợp lệ, nhưng dù sao mát mẻ. Để làm cho nó giống nhau hơn (nhưng vẫn không hợp lệ?), Bạn nên bật các ô nội dung thích hợp.
Lyndon White
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.