Dans la cryptographie à clé publique, une empreinte de clé publique est une courte séquence d'octets utilisée pour identifier une clé publique plus longue.
Dans SSH en particulier, ils peuvent être utilisés pour vérifier qu'un serveur est bien le serveur avec lequel je m'attends à communiquer et que je ne suis pas ciblé par une attaque de type "man-in-the-middle".
Ils sont généralement représentés par une chaîne de chiffres hexadécimaux. Il peut donc être fastidieux et fastidieux de la comparer à l’empreinte digitale que j’attendrais:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Pour faciliter les choses, OpenSSH a introduit une méthode de visualisation des empreintes digitales en tant qu’art ASCII, qui se présenterait ainsi:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Avec cela, je pourrais essayer de me rappeler la forme approximative de la technique ASCII et je la reconnaisrais (théoriquement) lorsque l’empreinte du serveur serait modifiée et que l’image serait différente.
Comment ça marche
La grille a une largeur de 17 caractères et une hauteur de 9 caractères. "L'évêque" commence à la ligne 4 / colonne 8 (le centre). Chaque position peut être notée [x, y], c'est-à-dire [8,4] pour la position de départ de l'évêque.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
L'évêque utilise l'empreinte digitale pour se déplacer. Il le lit par octets de gauche à droite et du bit le moins significatif au bit le plus significatif:
Fingerprint 37 : e4 : 6a : ... : 5e
Bits 00 11 01 11 : 11 10 01 00 : 01 10 10 10 : ... : 01 01 11 10
| | | | | | | | | | | | | | | |
Step 4 3 2 1 8 7 6 5 12 11 10 9 64 63 62 61
L'évêque agira selon le plan suivant:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Cas spéciaux:
- Si l'évêque est dans un coin et bougerait de nouveau dans le coin, il ne bougera pas du tout. C'est-à-dire que l'évêque est à
[0,0]
et sa prochaine étape serait00
. Il reste à[0,0]
- Si l'évêque se trouve dans un coin ou contre un mur et se déplace dans l'un des murs, il se déplace uniquement horizontalement ou verticalement. C'est-à-dire que l'évêque est à
[0,5]
et sa prochaine étape serait01
. Il ne peut pas aller à gauche, alors il monte simplement[0,4]
.
Chaque position a une valeur de combien de fois l'évêque a visité ce champ:
Value | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11| 12| 13| 14| 15| 16|
Character | | . | o | + | = | * | B | O | X | @ | % | & | # | / | ^ | S | E |
Les valeurs 15 (S) et 16 (E) ont ceci de particulier qu'elles marquent respectivement la position de départ et d'arrivée de l'évêque et écrasent la valeur réelle de la position de respect.
Objectif
Créez un programme qui prend une empreinte alphanumérique en entrée et produit sa représentation graphique ASCII comme indiqué dans les exemples.
Exemples
Input:
16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
Output:
+-----------------+
| . |
| + . |
| . B . |
| o * + |
| X * S |
| + O o . . |
| . E . o |
| . . o |
| . . |
+-----------------+
Input:
b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b
Output:
+-----------------+
| o.o |
| .= E.|
| .B.o|
| .= |
| S = .|
| . o . .= |
| . . . oo.|
| . o+|
| .o.|
+-----------------+
Input:
05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47
Output:
+-----------------+
| o=. |
| o o++E |
| + . Ooo. |
| + O B.. |
| = *S. |
| o |
| |
| |
| |
+-----------------+
Règles
- C'est du code-golf . Le code dans le moins d'octets gagne.
- Vous ne pouvez pas utiliser une bibliothèque existante qui produit l'image.
- Utilisez la langue que vous préférez!
- Votre soumission doit être un programme complet
la source
33:33:33:...:33
,cc:cc:cc:...:cc
serait des exemples pour cela. L’empreinte digitale est généralement un hachage MD5, il est donc très peu probable que vous obteniez un tel résultat. Je n'ai trouvé aucune source fiable sur la manière de traiter ces problèmes, alors pour le moment, je dirais: supposons qu'aucune cellule ne sera visitée plus de 14 fois.Réponses:
Pyth, 125 octets
Essayez-le en ligne: démonstration ou test-suite
J'ai écrit il y a quelques jours, mais je ne l'ai pas posté car je n'étais pas vraiment content.
Explication:
L'idée principale est la suivante. Je commence par la paire
(4, 8)
. Dans chaque mouvement,(m1,m2)
je vais du(x, y)
au(x-1+2*m1, y-1+2*m2)
. Pour vous assurer que ces coordonnées ne vont pas en dehors des frontières, je vais faire des listes, les trier et retourner l'élément central:(sorted(0,8,newx)[1], sorted(0,16,newy)[1])
.Je garde une trace de toutes les positions. À cette liste de positions, j'ajoute une liste de toutes les positions possibles, les trie et les code longueur-exécution. Ce qui me donne un numéro pour chaque position. Avec ce numéro, je peux choisir le caractère coorect et, à la fin, écraser les caractères des positions de début et de fin.
la source
Dyalog APL (178)
C'est une fonction qui prend la chaîne comme argument correct et renvoie une matrice de caractères contenant la représentation artistique ASCII, par exemple:
Explication:
⎕ML←3
: réglé⎕ML
sur3
. Cela rend⊂
plus utile pour fractionner des chaînes.F←9 17⍴0
: faire une matrice de 17 x 9 de zéros.F
représente combien de fois chaque poste a été visité.⍵⊂⍨':'≠⍵
: divisé⍵
en:
caractères.{
...}¨
: pour chaque groupe:¯1+⍵⍳⍨⎕D,'abcdef'
: trouve l'index de chaque caractère dans la chaîne'01234567890abcdef'
. Soustrayez 1, car APL est 1-indexé par défaut.(4/2)⊤
: convertit les valeurs en représentations 4 bits (il devrait maintenant y avoir une matrice 2-sur-4).↓⊖4 2⍴⍉
: faites pivoter la matrice, utilisez les éléments pour remplir une matrice 2 sur 4 à la place, reproduisez-la horizontalement, puis obtenez chaque ligne séparément. Cela nous donne les 4 valeurs à 2 bits dont nous avons besoin.⊃,/
: joindre les listes résultantes ensemble, en donnant une liste d’étapes de 2 bits.5 9{
...}
: étant donné la liste des étapes et commençant à la position [9,5]:(⍺⌷F)+←1
: incrémente la position actuelle dansF
.×⍴⍵:
: si la liste des étapes n'est pas vide:↑⍵
: faites le premier pas dans la liste⍺-1 1-2×
: récupère le delta de cette étape et le soustrait de la position actuelle1 1⌈9 17⌊
: restreindre le mouvement à l'intérieur du champ(
...)∇1↓⍵
: continue avec la nouvelle position et le reste des étapes(⍺⌷F)←16
: misF
à 16 en position finaleF[5;9]←15
: régléF
à 15 à la position de départ' .o+=*BOX@%&#/^SE'[1+F]
: associe chaque position au caractère correspondantK⍪(M,
...,M←'|')⍪K←'+','+',⍨17⍴'-'
: encapsule le résultat en lignesla source
Perl, 300 + 1 (-n) = 301 octets
Cette réponse est dégoûtante, mais c'est aussi la première de ce casse-tête, donc ça ira pour le moment.
-n
prendre une ligne d’entrée sur STDIN et remplir$_
.la source
R,
465459410393382357 octetsAvec indentations et nouvelles lignes:
Usage:
la source
function
.Octave, 277
Explication:
Échantillon échantillon:
la source
Pyth,
145143140Essayez-le en ligne.
Pyth n'est pas vraiment bon pour les défis avec itération. J'attends de CJam qu'il batte facilement.
la source
JavaScript (ES6) 249
208Modifier la bordure manquante ajoutée
Testez l'exécution de l'extrait de code ci-dessous dans tout navigateur compatible EcmaScript 6.
la source
forEach
, les bordures verticales sont toujours manquantes.Python,
381328-51 grâce à @JonathanFrech
Légèrement non golfé pour des raisons d'explication:
Ce bordel d'une ligne:
Est fonctionnellement équivalent à ceci:
mais niche tous les conditionnels dans ce style de raccourci de golf:
(false_value,true_value)[condition]
Espérons que le reste est assez expliciteDes tests
la source
(1,0)[p%17==16]
est+(p%17!=16)
, ou peut-être mêmep%17!=16
.] for
.fp
devrait êtref
.~16
? Un peu d'obfuscation ne peut jamais nuire à votre golf!Ruby 288
Essayez-le en ligne: http://ideone.com/QOHAnM
La version lisible (celle à partir de laquelle j'ai commencé le golf) est ici: http://ideone.com/XR64km
la source
C - 488
Il doit y avoir un moyen de réduire cette taille ....
la source
Rouille - 509 octets
Large mais ... presque proche de C. Comme d'habitude, de nombreux octets ont été utilisés du fait que Rust ne transtype pas automatiquement les types les uns dans les autres. Mais il y a probablement aussi place à amélioration ... pourrait probablement utiliser certaines idées d'autres solutions.
la version ungolfed est sur le Rust Playground en ligne
la source