Zakoduj stronę kodową

15

Wprowadzenie

Strona kodowa odwzorowuje wartości całkowite na określony znak. Możemy wizualizować stronę kodową w następujący sposób:

+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +
| | 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 | Ja | O | P | A | S | D | F | G | H | J | | | | | | |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +

Wiersze określają pierwszą cyfrę, a kolumny drugą cyfrę liczby szesnastkowej.

Wyzwanie

Biorąc pod uwagę ciąg 16-255 unikalnych znaków, wypisz odpowiednią stronę kodową, używając zerowego indeksu każdego znaku w ciągu jako jego wartości. Na qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJprzykład dane wejściowe dają tabelę powyżej.

  • Dane wyjściowe muszą być w dokładnie takim samym formacie jak powyższa tabela. Tylko końcowy znak nowej linii jest opcjonalny.
  • Jeśli długość wejściowa nie jest wielokrotnością 16, musisz rozpocząć nowy wiersz dla pozostałych znaków i pozostaw nieużywane komórki puste (= wypełnione 3 spacjami).
  • Każda postać jest umieszczona dokładnie na środku komórki, wypełniona jednym spacją po lewej i prawej stronie.
  • Wartości w pierwszym wierszu i kolumnie są podane liczbami szesnastkowymi z cyframi 0123456789ABCDEF. Są one wypełnione jedną spacją po lewej i prawej stronie. Możesz użyć małych cyfr szesnastkowych, ale musisz trzymać się jednej.
  • Jedynymi znakami obecnymi na wyjściu są łączniki -, plusy +, potoki |, spacje , cyfry liczb szesnastkowych i znaki z danych wejściowych.
  • Wszelkie wbudowane funkcje związane z tabelami ASCII-art lub w jakikolwiek sposób trywializujące problem są zabronione.
  • Możesz założyć, że dane wejściowe składają się tylko ze znaków określonego kodowania. Proszę podać, czy tak jest.
  • Jeśli twój język obsługuje tylko wprowadzanie ASCII, możesz założyć, że wprowadzane są tylko znaki ASCII i powtarzające się znaki.

Zasady

Happy Coding!

Denker
źródło
Czy możemy używać małych liter szesnastkowych?
Klamka
@Doorknob Tak, wyjaśniłem to w wyzwaniu.
Denker,
1
Czy możemy założyć, że dane wejściowe to ASCII (z możliwie powtarzającymi się znakami)?
Luis Mendo,
@DenkerAffe To byłoby sprzeczne ze słowem „niepowtarzalny” lub z „255” w Biorąc pod uwagę ciąg 16-255 unikalnych znaków , chociaż ...
Luis Mendo
1
@LuisMendo Hmm tak, to prawda. Pozwolę na to w przypadku języków, które mogą obsługiwać tylko ASCII.
Denker,

Odpowiedzi:

7

Pyth, 60 bajtów


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

Wiodąca nowa linia jest znacząca.

Wypróbuj tutaj.

Klamka
źródło
Czy możesz pokazać transpilowany kod?
CalculatorFeline
@CatsAreFluffy Wystarczy włączyć tryb debugowania w tłumaczu online.
Denker,
Co robi nowa linia?
Leaky Nun
@Adnan Whoops, to był mój nadzór. Naprawiono, dziękuję.
Klamka
@KennyLau Drukuje pierwszy +---+---+---[...]. W Pyth funkcja nowej linii wypisuje i zwraca swój argument.
Klamka
5

Python 3.5, 326 355 bajtów:

( +29 bajtów, ponieważ jeśli długość ostatniego wiersza nie jest wielokrotnością 16, nieużywane komórki należy pozostawić puste (chociaż moim zdaniem wygląda to znacznie lepiej, jeśli te puste komórki nie są nawet pokazane) )

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

Działa jak marzenie!

Przykładowe dane wejściowe i wyjściowe:

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

Mam nadzieję, że to w porządku.

Ponadto, oto kolejna wersja, którą stworzyłem dla tego wyzwania, która choć jest nieprawidłowym kandydatem, ponieważ nie drukuje dodatkowych pustych komórek dla ostatniego wiersza, jeśli jego długość nie jest wielokrotnością 16, moim zdaniem daje znacznie lepiej wyglądającą stronę niż wymagany przez OP, głównie dlatego, że nie pokazuje nawet pustych komórek, jeśli ostatni wiersz nie jest wielokrotnością 16, ale zamiast tego pokazuje tylko wypełnione komórki, i to jest to:

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

Oto przykładowe dane wejściowe i wyjściowe dla powyższego kodu:

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
źródło
Jeśli długość wejściowa nie jest wielokrotnością 16, musisz rozpocząć nowy wiersz dla pozostałych znaków i pozostaw nieużywane komórki puste (= wypełnione 3 spacjami).
Leaky Nun
@KennyLau Ah, tak. Nie widziałem tego. Dang ... edycja w toku. Szczerze mówiąc, wygląda to znacznie lepiej niż ten pokazany przez OP, nie sądzisz?
R. Kap.
Dlaczego głosowanie w dół?
R. Kap
@ R.Kap Nie mogłem do końca powiedzieć, ale tutaj mam głos
kot
2

05AB1E , 65 63 bajtów

Kod:

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

Wypróbuj online! . Wykorzystuje kodowanie CP-1252 .

Adnan
źródło
1

JavaScript (ES6), 148 bajtów

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

' 0123456789ABCDEF'Istnieje do wypełnienia pierwszej kolumny, ale korzystnie obejmuje również pierwszy rząd. Łańcuch wejściowy jest następnie wypełniany spacjami, aby umożliwić podzielenie go na podciągi o długości 16 za pomocą(?|^) zapobiegając dopasowaniu wiodącej przestrzeni. Reszta po prostu łączy elementy.

Neil
źródło
1

Excel VBA, 157 bajtów (Oszukiwanie?)

Anonimowa funkcja natychmiastowego okna VBE, która destrukcyjnie przenosi dane wejściowe z zakresu [A1]i dane wyjściowe doActiveSheet obiektu.

Grał w golfa

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

Sformatowany

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

Wejście wyjście

Dany:

[A1]="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJ"

generowane wyjście to

Tabela rzeczy

Taylor Scott
źródło
probs niepoprawne, ale i tak fajne. Aby było bardziej podobne (ale nadal nieważne?), Należy włączyć odpowiednie granice komórek.
Lyndon White