Coder une page de codes

15

introduction

Une page de codes mappe des valeurs entières à un caractère spécifique. Nous pouvons visualiser une page de codes comme celle-ci:

+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +
| 0 | q | w | e | r | t | z | u | je | 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 | Je | O | P | A | S | D | F | G | H | J | | | | | | |
+ --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + --- + - - + --- + --- + --- + --- +

Les lignes spécifient le premier chiffre et les colonnes le deuxième chiffre du nombre hexadécimal.

Le défi

Étant donné une chaîne de 16 à 255 caractères uniques, affichez la page de codes correspondante en utilisant l'index de base zéro de chaque caractère de la chaîne comme valeur. L'entrée qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJpar exemple donnerait le tableau ci-dessus.

  • La sortie doit être exactement au même format que le tableau ci-dessus. Seule une nouvelle ligne de fin est facultative.
  • Si la longueur d'entrée n'est pas un multiple de 16, vous devez commencer une nouvelle ligne pour les caractères restants et laisser les cellules inutilisées vides (= remplies de 3 espaces).
  • Chaque personnage est placé exactement au milieu d'une cellule, complété par un espace à gauche et à droite.
  • Les valeurs de la première ligne et colonne sont données par des nombres hexadécimaux avec les chiffres 0123456789ABCDEF. Ceux-ci sont également rembourrés avec un espace à gauche et à droite. Vous pouvez choisir d'utiliser des chiffres hexadécimaux en minuscules, mais vous devez vous en tenir à un.
  • Les seuls caractères présents dans la sortie sont les tirets -, les plus +, les tuyaux |, les espaces , les chiffres des nombres hexadécimaux et les caractères de l'entrée.
  • Toute intégration liée à des tables ASCII ou banalisant le problème de quelque manière que ce soit est interdite.
  • Vous pouvez supposer que l'entrée se compose uniquement de caractères d'un codage spécifique. Veuillez préciser si tel est le cas.
  • Si votre langue ne peut gérer que la saisie ASCII, vous pouvez supposer une saisie ASCII uniquement et des caractères répétés.

Règles

Codage heureux!

Denker
la source
Pouvons-nous utiliser des chiffres hexadécimaux en minuscules?
Poignée de porte
@ Doorknob Oui, l'a précisé dans le défi.
Denker
1
Pouvons-nous supposer que l'entrée est ASCII (avec éventuellement des caractères répétés)?
Luis Mendo
@DenkerAffe Cela entrerait en conflit avec le mot "unique" ou avec "255" dans Étant donné une chaîne de 16 à 255 caractères uniques , cependant ...
Luis Mendo
1
@LuisMendo Hmm oui, c'est vrai. Je vais autoriser cela pour les langues qui ne peuvent gérer que l'ASCII.
Denker

Réponses:

7

Pyth, 60 octets


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

La nouvelle ligne leader est significative.

Essayez-le ici.

Poignée de porte
la source
Pouvez-vous montrer le code transpilé?
CalculatorFeline
@CatsAreFluffy Activez simplement le mode de débogage dans l'interpréteur en ligne.
Denker
Que fait la nouvelle ligne?
Leaky Nun
@Adnan Whoops, c'était un oubli de ma part. Fixé, merci.
Poignée de porte
@KennyLau Il imprime le premier +---+---+---[...]. En Pyth, la fonction newline imprime et renvoie son argument.
Poignée de porte
5

Python 3.5, 326 355 octets:

( +29 octets car si la longueur de la dernière ligne n'est pas un multiple de 16, les cellules inutilisées doivent être laissées vides (bien que, à mon avis, cela semble beaucoup mieux si ces cellules vides ne sont même pas affichées) )

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

Fonctionne comme un charme!

Exemples d'entrées et de sorties:

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

J'espère que ça va.

En outre, voici une autre version que je crée pour ce défi, qui, bien est un candidat invalide car il ne pas imprimer des cellules vides supplémentaires pour la dernière ligne si sa longueur est pas un multiple de 16, à mon avis , les résultats d' une page beaucoup mieux à la recherche que celle requise par OP, principalement parce qu'elle n'affiche même pas les cellules vides si la dernière ligne n'est pas un multiple de 16, mais affiche simplement les cellules remplies, et c'est tout:

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

Voici un exemple d'entrée et de sortie pour le code inapplicable ci-dessus:

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
la source
" Si la longueur d'entrée n'est pas un multiple de 16, vous devez commencer une nouvelle ligne pour les caractères restants et laisser les cellules inutilisées vides (= remplies de 3 espaces). "
Leaky Nun
@KennyLau Ah, oui. Je n'ai pas vu ça. Dang ... éditez maintenant en cours. Honnêtement, cela semble beaucoup mieux que celui qu'OP montre, vous ne pensez pas?
R. Kap
Pourquoi le vote négatif?
R. Kap
@ R.Kap Je ne pourrais pas tout à fait vous le dire, mais ici, ayez un vote positif
chat
2

05AB1E , 65 63 octets

Code:

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

Essayez-le en ligne! . Utilise l' encodage CP-1252 .

Adnan
la source
1

JavaScript (ES6), 148 octets

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

Il ' 0123456789ABCDEF'existe pour remplir la première colonne, mais couvre également la première ligne. La chaîne d'entrée est ensuite complétée par des espaces pour lui permettre d'être divisée en sous-chaînes de longueur 16, ce qui (?|^)empêche la correspondance de l'espace de tête. Le reste ne fait que joindre les morceaux.

Neil
la source
1

Excel VBA, 157 octets (tricherie?)

Fonction de fenêtre immédiate VBE anonyme qui prend de manière destructive les entrées de la plage [A1]et les sorties vers l' ActiveSheetobjet.

Golfé

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

Formaté

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

Entrée sortie

Donné:

[A1]="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJ"

la sortie générée est

Chose de table

Taylor Scott
la source
probs pas valide, mais cool quand même. Pour le rendre plus similaire (mais toujours invalide?), Vous devez activer les pensionnaires de cellule appropriés.
Lyndon White