Na criptografia de chave pública, uma impressão digital de chave pública é uma sequência curta de bytes usada para identificar uma chave pública mais longa.
No SSH, em particular, eles podem ser usados para verificar se um servidor é de fato o servidor com o qual estou esperando me comunicar e não sou alvo de um ataque do tipo intermediário.
Eles geralmente são representados como uma sequência de dígitos hexadecimais, portanto, pode ser bastante chato e tedioso compará-lo com a impressão digital que eu esperaria:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Para facilitar um pouco, o OpenSSH introduziu um método para visualizar impressões digitais como arte ASCII, com a seguinte aparência:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
Com isso, eu poderia tentar lembrar a forma grosseira da arte ASCII e então (teoricamente) a reconheceria quando a impressão digital do servidor mudasse e a imagem parecesse diferente.
Como funciona
A grade tem uma largura de 17 caracteres e uma altura de 9 caracteres. O "bispo" começa na linha 4 / coluna 8 (o centro). Cada posição pode ser indicada como [x, y], ou seja, [8,4] para a posição inicial do bispo.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
O bispo usa a impressão digital para se movimentar. Ele lê em bytes da esquerda para a direita e do bit menos significativo para o bit mais 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
O bispo adotará o seguinte plano:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Casos especiais:
- Se o bispo está em um canto e se move novamente para o canto, ele não se move. ou seja: o bispo está
[0,0]
e seu próximo passo seria00
. Ele permanece em[0,0]
- Se o bispo estiver em um canto ou em uma parede e se mover para uma das paredes, ele se moverá horizontal ou verticalmente. ou seja: o bispo está
[0,5]
e seu próximo passo seria01
. Ele não pode ir para a esquerda, então ele apenas sobe, para[0,4]
.
Cada posição possui um valor de quantas vezes o bispo visitou esse 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 |
Os valores 15 (S) e 16 (E) são especiais, pois marcam a posição inicial e final do bispo, respectivamente, e substituem o valor real da posição correspondente.
Objetivo
Crie um programa que use uma impressão digital alfanumérica como entrada e produz sua representação artística ASCII, conforme mostrado nos exemplos.
Exemplos
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 |
| |
| |
| |
+-----------------+
Regras
- Isso é código-golfe . O código no menor número de bytes vence.
- Você não pode usar uma biblioteca existente que produz a imagem.
- Use o idioma que você preferir!
- Sua inscrição deve ser um programa completo
fonte
33:33:33:...:33
,cc:cc:cc:...:cc
seriam exemplos para isso. A impressão digital é geralmente um hash MD5, por isso é altamente improvável que você obtenha esse resultado. Não encontrei nenhuma fonte confiável sobre como lidar com isso, então, por enquanto, eu diria: Suponha que nenhuma célula será visitada mais de 14 vezes.Respostas:
Pitão, 125 bytes
Experimente online: demonstração ou suíte de testes
Escrevi há alguns dias, mas não a publiquei, porque não estava realmente feliz com isso.
Explicação:
A ideia básica é a seguinte. Eu começo com o par
(4, 8)
. Em cada movimento(m1,m2)
eu vou do(x, y)
para(x-1+2*m1, y-1+2*m2)
. Para certificar-se, que estas coordenadas não ir para fora das fronteiras, vou fazer algumas listas, classificá-los e devolver o elemento do meio:(sorted(0,8,newx)[1], sorted(0,16,newy)[1])
.Eu acompanho todas as posições. A esta lista de posições, adiciono uma lista de todas as posições possíveis, classificá-las e codificá-las no comprimento da execução. O que me dá um número para cada posição. Com esse número, posso escolher o caractere co-correto e, no final, substituir os caracteres da posição inicial e final.
fonte
Dyalog APL (178)
Esta é uma função que usa a string como argumento correto e retorna uma matriz de caracteres contendo a representação artística ASCII, por exemplo:
Explicação:
⎕ML←3
: definido⎕ML
como3
. Isso torna⊂
mais útil para dividir seqüências de caracteres.F←9 17⍴0
: faça uma matriz de zeros de 17 por 9.F
representa quantas vezes cada posição foi visitada.⍵⊂⍨':'≠⍵
: dividir⍵
em:
caracteres.{
...}¨
: para cada grupo:¯1+⍵⍳⍨⎕D,'abcdef'
: encontre o índice de cada caractere na string'01234567890abcdef'
. Subtraia 1, porque a APL é indexada 1 por padrão.(4/2)⊤
: converta os valores em suas representações de 4 bits (agora deve haver uma matriz de 2 por 4).↓⊖4 2⍴⍉
: gire a matriz, use os elementos para preencher uma matriz 2 por 4, espelhe essa matriz horizontalmente e, em seguida, obtenha cada linha separadamente. Isso nos fornece os 4 valores de 2 bits necessários.⊃,/
: junte as listas resultantes, fornecendo uma lista de etapas de 2 bits.5 9{
...}
: dada a lista de etapas e iniciando na posição [9,5]:(⍺⌷F)+←1
: incrementa a posição atual emF
.×⍴⍵:
: se a lista de etapas não estiver vazia:↑⍵
: dê o primeiro passo da lista⍺-1 1-2×
: obtenha o delta para essa etapa e subtraia-o da posição atual1 1⌈9 17⌊
: restringir o movimento para dentro do campo(
...)∇1↓⍵
: continue com a nova posição e o restante das etapas(⍺⌷F)←16
: definidoF
como 16 na posição finalF[5;9]←15
: definidoF
como 15 na posição inicial' .o+=*BOX@%&#/^SE'[1+F]
: mapeia cada posição para o caractere correspondenteK⍪(M,
...,M←'|')⍪K←'+','+',⍨17⍴'-'
: agrupar o resultado em linhasfonte
Perl, 300 + 1 (-n) = 301 bytes
Essa resposta é nojenta, mas também é a primeira para esse quebra-cabeça, então será o suficiente por enquanto.
-n
para pegar uma linha de entrada no STDIN e preencher$_
.fonte
R,
465459410393382357 bytesCom recuos e novas linhas:
Uso:
fonte
function
.Oitava, 277
Explicação:
Exemplo de execução:
fonte
Pyth,
145143140Experimente online.
Pyth não é realmente bom em desafios com iteração. Estou esperando que o CJam o derrote facilmente.
fonte
JavaScript (ES6) 249
208Editar Borda ausente adicionada
Teste a execução do snippet abaixo em qualquer navegador compatível com EcmaScript 6
fonte
forEach
, as bordas verticais ainda estão ausentes.Python,
381328-51 graças a @JonathanFrech
Ligeiramente não-destruído por uma questão de explicação:
Essa bagunça de uma linha:
É funcionalmente equivalente a isso:
mas aninha todos os condicionais nesse estilo de atalho de golfe:
(false_value,true_value)[condition]
Espero que o resto seja bastante auto-explicativoTestes
fonte
(1,0)[p%17==16]
é+(p%17!=16)
, ou possivelmente atép%17!=16
.] for
.fp
deveria serf
.~16
? Um pouco de ofuscação nunca pode prejudicar o seu golfe!Ruby 288
Experimente online: http://ideone.com/QOHAnM
A versão legível (da qual comecei a jogar golfe) está aqui: http://ideone.com/XR64km
fonte
C - 488
Deve haver uma maneira de tornar isso menor ....
fonte
Ferrugem - 509 bytes
Grande, mas ... quase próximo de C. Como de costume, há muitos bytes usados devido à maneira como o Rust não lança automaticamente tipos um no outro. Mas provavelmente também há espaço para melhorias ... provavelmente poderia usar algumas idéias de outras soluções.
versão ungolfed está no Rust Playground on-line
fonte