En la criptografía de clave pública, una huella digital de clave pública es una secuencia corta de bytes utilizada para identificar una clave pública más larga.
En SSH, en particular, se pueden usar para verificar que un servidor es de hecho el servidor con el que espero comunicarme y que no soy el objetivo de un ataque de hombre en el medio.
Por lo general, se representan como una cadena de dígitos hexadecimales, por lo que puede ser bastante aburrido y tedioso compararlo con la huella digital que esperaría:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Para hacerlo un poco más fácil, OpenSSH ha introducido un método para visualizar huellas digitales como arte ASCII, que se vería así:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Con esto, podría tratar de recordar la forma aproximada del arte ASCII y luego (teóricamente) lo reconocería cuando la huella digital del servidor cambiara y la imagen se viera diferente.
Cómo funciona
La cuadrícula tiene un ancho de 17 caracteres y una altura de 9 caracteres. El "obispo" comienza en la fila 4 / columna 8 (el centro). Cada posición se puede denotar como [x, y], es decir, [8,4] para la posición inicial del obispo.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
El obispo usa la huella digital para moverse. Lo lee en bytes de izquierda a derecha y del bit menos significativo al bit más significativo:
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
El obispo se moverá según el siguiente plan:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Casos especiales:
- Si el obispo está en una esquina y volvería a moverse hacia la esquina, no se mueve en absoluto. es decir: el obispo está en
[0,0]
y su próximo paso sería00
. El permanece en[0,0]
- Si el alfil está en una esquina o en una pared y se mudaría a una de las paredes, se mueve solo horizontal o verticalmente. es decir: el obispo está en
[0,5]
y su próximo paso sería01
. No puede ir a la izquierda, así que simplemente se mueve hacia arriba[0,4]
.
Cada posición tiene un valor de la frecuencia con que el obispo ha visitado este campo:
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 |
Los valores 15 (S) y 16 (E) son especiales porque marcan la posición inicial y final del alfil respectivamente y sobrescriben el valor real de la posición de respeto.
Gol
Cree un programa que tome una huella digital alfanumérica como entrada y produzca su representación artística ASCII como se muestra en los ejemplos.
Ejemplos
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 |
| |
| |
| |
+-----------------+
Reglas
- Este es el código de golf . El código en la menor cantidad de bytes gana.
- Puede no utilizar una biblioteca existente que produce la imagen.
- ¡Usa el idioma que prefieras!
- Su envío tiene que ser un programa completo
fuente
33:33:33:...:33
,cc:cc:cc:...:cc
serían ejemplos para esto. La huella digital generalmente es un hash MD5, por lo que es muy poco probable que obtenga ese resultado. No he encontrado ninguna fuente confiable sobre cómo lidiar con esto, por lo que por ahora diría: Suponga que no se visitará ninguna celda más de 14 veces.Respuestas:
Pyth, 125 bytes
Pruébelo en línea: Demostración o Test-Suite
Escribí hace unos días, pero no lo publiqué, porque no estaba muy contento con eso.
Explicación:
La idea básica es la siguiente. Empiezo con la pareja
(4, 8)
. En cada movimiento(m1,m2)
voy del(x, y)
al(x-1+2*m1, y-1+2*m2)
. Para asegurarse de que estas coordenadas no salen fuera de las fronteras, voy a hacer algunas listas, clasificar y regresar el elemento central:(sorted(0,8,newx)[1], sorted(0,16,newy)[1])
.Realizo un seguimiento de todas las posiciones. A esta lista de posiciones agrego una lista de todas las posiciones posibles, las ordeno y las codifico por longitud de ejecución. Lo que me da un número para cada posición. Con este número, puedo elegir el carácter coherente y, al final, sobrescribir los caracteres de la posición inicial y final.
fuente
Dyalog APL (178)
Esta es una función que toma la cadena como argumento correcto y devuelve una matriz de caracteres que contiene la representación de arte ASCII, por ejemplo:
Explicación:
⎕ML←3
: establecido⎕ML
en3
. Esto lo hace⊂
más útil para dividir cadenas.F←9 17⍴0
: crea una matriz de ceros de 17 por 9.F
representa cuántas veces se ha visitado cada puesto.⍵⊂⍨':'≠⍵
: dividido⍵
en:
personajes.{
...}¨
: para cada grupo:¯1+⍵⍳⍨⎕D,'abcdef'
: encuentra el índice de cada carácter en la cadena'01234567890abcdef'
. Reste 1, porque APL está indexado en 1 por defecto.(4/2)⊤
: convierte los valores a sus representaciones de 4 bits (ahora debería haber una matriz de 2 por 4).↓⊖4 2⍴⍉
: gire la matriz, use los elementos para llenar una matriz de 2 por 4 en su lugar, refleje esa matriz horizontalmente y luego obtenga cada línea por separado. Esto nos da los 4 valores de 2 bits que necesitamos.⊃,/
: une las listas resultantes, dando una lista de pasos de 2 bits.5 9{
...}
: dada la lista de pasos, y comenzando en la posición [9,5]:(⍺⌷F)+←1
: incrementa la posición actual enF
.×⍴⍵:
: si la lista de pasos no está vacía:↑⍵
: da el primer paso de la lista⍺-1 1-2×
: obtener el delta para ese paso y restarlo de la posición actual1 1⌈9 17⌊
: restringir el movimiento dentro del campo(
...)∇1↓⍵
: continúe con la nueva posición y el resto de los pasos(⍺⌷F)←16
: establecidoF
en 16 en la posición finalF[5;9]←15
: establecidoF
en 15 en la posición inicial' .o+=*BOX@%&#/^SE'[1+F]
: asigna cada posición al personaje correspondienteK⍪(M,
...,M←'|')⍪K←'+','+',⍨17⍴'-'
: ajusta el resultado en líneasfuente
Perl, 300 + 1 (-n) = 301 bytes
Esta respuesta es asquerosa, pero también es la primera para este acertijo, por lo que lo hará por ahora.
-n
tomar una línea de entrada en STDIN y llenar$_
.fuente
R,
465459410393382357 bytesCon hendiduras y nuevas líneas:
Uso:
fuente
function
.Octava, 277
Explicación:
Ejecución de muestra:
fuente
Pyth,
145143140Pruébalo en línea.
Pyth no es realmente bueno en los desafíos con la iteración. Espero que CJam lo supere fácilmente.
fuente
JavaScript (ES6) 249
208Editar borde faltante agregado
Pruebe a ejecutar el fragmento a continuación en cualquier navegador compatible con EcmaScript 6
fuente
forEach
, aún faltan los bordes verticales.Python,
381328-51 gracias a @JonathanFrech
Ligeramente poco golfista por el bien de la explicación:
Este lío de una línea:
Es funcionalmente equivalente a esto:
pero anida todos los condicionales en este estilo de atajo de golf:
(false_value,true_value)[condition]
espero que el resto se explique por sí soloPruebas
fuente
(1,0)[p%17==16]
es+(p%17!=16)
, o posiblemente inclusop%17!=16
.] for
.fp
debería serf
.~16
? ¡Un poco de ofuscación nunca puede dañar tu golf!Rubí 288
Pruébelo en línea: http://ideone.com/QOHAnM
La versión legible (la que comencé a jugar al golf) está aquí: http://ideone.com/XR64km
fuente
C - 488
Debe haber una manera de hacer esto más pequeño ...
fuente
Óxido - 509 bytes
Grande pero ... casi cerca de C. Como es habitual, hay muchos bytes usados debido a la forma en que Rust no convierte automáticamente los tipos entre sí. Pero probablemente también haya margen de mejora ... probablemente podría usar algunas ideas de otras soluciones.
versión sin golf está en el Rust Playground en línea
fuente