В криптографии с открытым ключом отпечаток открытого ключа - это короткая последовательность байтов, используемая для идентификации более длинного открытого ключа.
В частности, в SSH их можно использовать для проверки того, что сервер на самом деле является сервером, с которым я ожидаю установить связь, и на меня не нацелена атака «человек посередине».
Обычно они представлены в виде строки шестнадцатеричных цифр, поэтому сравнивать их с отпечатком пальца может быть довольно скучно и утомительно:
37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e
Чтобы сделать это немного проще, OpenSSH представила метод визуализации отпечатков пальцев как ASCII-арт, который будет выглядеть следующим образом:
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
При этом я мог бы попытаться вспомнить грубую форму искусства ASCII и затем (теоретически) распознать его, когда отпечаток пальца сервера изменился и изображение выглядит иначе.
Как это работает
Сетка имеет ширину 17 символов и высоту 9 символов. «Епископ» начинается в строке 4 / колонке 8 (в центре). Каждую позицию можно обозначить как [x, y], то есть [8,4] для начальной позиции слона.
1111111
01234567890123456
+-----------------+
0| |
1| |
2| |
3| |
4| S |
5| |
6| |
7| |
8| |
+-----------------+
Епископ использует отпечатки пальцев, чтобы передвигаться. Он читает его побайтно слева направо и от младшего к старшему:
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
Епископ будет двигаться по следующему плану:
Bits Direction
-----------------
00 Up/Left
01 Up/Right
10 Down/Left
11 Down/Right
Особые случаи:
- Если епископ окажется в углу и снова войдет в угол, он вообще не будет двигаться. то есть: епископ в
[0,0]
и его следующим шагом будет00
. Он остается в[0,0]
- Если епископ находится в углу или у стены и двигается в одну из стен, он движется только горизонтально или вертикально. то есть: епископ в
[0,5]
и его следующим шагом будет01
. Он не может идти налево, поэтому он просто движется вверх, к[0,4]
.
Каждая позиция содержит значение того, как часто епископ посещал это поле:
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 |
Значения 15 (S) и 16 (E) отличаются тем, что они обозначают начальную и конечную позиции слона соответственно и перезаписывают реальное значение соответствующей позиции.
Цель
Создайте программу, которая принимает буквенно-цифровой отпечаток в качестве входных данных и создает свое художественное представление ASCII, как показано в примерах.
Примеры
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 |
| |
| |
| |
+-----------------+
правила
- Это код-гольф . Код в наименьшем количестве байтов побеждает.
- Вы не можете использовать существующую библиотеку, которая производит изображение.
- Используйте любой язык, который вы предпочитаете!
- Ваша заявка должна быть полной программой
источник
33:33:33:...:33
,cc:cc:cc:...:cc
Будет примером для этого. Отпечаток пальца обычно является хешем MD5, поэтому маловероятно, что вы получите такой результат. Я не нашел надежных источников о том, как с этим справиться, поэтому пока скажу: предположим, что ни одна клетка не будет посещена более 14 раз.Ответы:
Pyth, 125 байт
Попробуйте онлайн: демонстрация или тест-сьют
Я написал несколько дней назад, но не опубликовал это, потому что я не был очень рад этому.
Объяснение:
Основная идея заключается в следующем. Я начинаю с пары
(4, 8)
. В каждом шаге(m1,m2)
я иду от(x, y)
к(x-1+2*m1, y-1+2*m2)
. Чтобы убедиться в том, что эти координаты не выходят за пределы границ, я сделаю некоторые списки, сортировать их и вернуть средний элемент:(sorted(0,8,newx)[1], sorted(0,16,newy)[1])
.Я отслеживаю все позиции. К этому списку позиций я добавляю список всех возможных позиций, сортирую их и кодирую по длине прогона. Что дает мне номер для каждой позиции. С этим номером я могу выбрать правильный символ и в конце перезаписать символы начальной и конечной позиции.
источник
Дьялог АПЛ (178)
Это функция, которая принимает строку в качестве правого аргумента и возвращает матрицу символов, содержащую художественное представление ASCII, например:
Объяснение:
⎕ML←3
: установите⎕ML
в3
. Это делает⊂
более полезным для разделения строк.F←9 17⍴0
: сделать матрицу нулей 17 на 9.F
представляет, сколько раз каждая позиция была посещена.⍵⊂⍨':'≠⍵
: разделить⍵
на:
персонажей.{
...}¨
: для каждой группы:¯1+⍵⍳⍨⎕D,'abcdef'
: найти индекс каждого символа в строке'01234567890abcdef'
. Вычтите 1, потому что APL по умолчанию индексируется 1.(4/2)⊤
: преобразовать значения в их 4-битные представления (теперь должна быть матрица 2 на 4).↓⊖4 2⍴⍉
: поверните матрицу, используйте элементы, чтобы заполнить матрицу 2 на 4, зеркально отразите эту матрицу по горизонтали, а затем получите каждую строку отдельно. Это дает нам 4 2-битных значения, которые нам нужны.⊃,/
: объединить полученные списки вместе, дав список 2-битных шагов.5 9{
...}
: дан список шагов и начиная с позиции [9,5]:(⍺⌷F)+←1
: увеличить текущую позицию вF
.×⍴⍵:
: если список шагов не пуст:↑⍵
: сделать первый шаг из списка⍺-1 1-2×
: получить дельту для этого шага и вычесть ее из текущей позиции1 1⌈9 17⌊
: ограничить движение с точностью до поля(
...)∇1↓⍵
: продолжить с новой позиции и остальных шагов(⍺⌷F)←16
: установитеF
в 16 в конечной позицииF[5;9]←15
: установитеF
на 15 в начальной позиции' .o+=*BOX@%&#/^SE'[1+F]
: сопоставить каждую позицию с соответствующим символомK⍪(M,
...,M←'|')⍪K←'+','+',⍨17⍴'-'
: обернуть результат в строкиисточник
Perl, 300 + 1 (-n) = 301 байт
Этот ответ отвратителен, но он также является первым для этой головоломки, поэтому он подойдет на данный момент.
-n
взять строку ввода на STDIN и заполнить$_
.источник
R
465459410393382357 байтС отступами и переносами:
Использование:
источник
function
.Октава, 277
Объяснение:
Образец прогона:
источник
Pyth,
145143140Попробуйте онлайн.
Pyth не очень хорош в задачах с итерацией. Я ожидаю, что CJam победит это легко.
источник
JavaScript (ES6) 249
208редактировать Добавлена пропущенная граница
Попробуйте запустить приведенный ниже фрагмент в любом браузере, совместимом с EcmaScript 6
источник
forEach
, вертикальные границы все еще отсутствуют.Питон,
381328-51 благодаря @JonathanFrech
Слегка разгромлен ради объяснения:
Этот беспорядок линии:
Функционально эквивалентно этому:
но вкладывает все условности в этот стиль игры в гольф:
(false_value,true_value)[condition]
надеюсь, остальное довольно очевиднотесты
источник
(1,0)[p%17==16]
есть+(p%17!=16)
, или, возможно, дажеp%17!=16
.] for
.fp
должно бытьf
.~16
? Немного запутывания никогда не повредит вашему гольфу!Ruby 288
Попробуйте онлайн: http://ideone.com/QOHAnM
Читаемая версия (с которой я начал играть в гольф) находится здесь: http://ideone.com/XR64km
источник
С - 488
Должен быть способ сделать это меньше ....
источник
Ржавчина - 509 байт
Большой, но ... почти рядом с C. Как обычно, используется много байтов из-за того, что Rust автоматически не преобразует типы друг в друга. Но, возможно, есть место и для улучшения ... возможно, можно использовать некоторые идеи из других решений.
версия без игры в гольф на Rust Playground онлайн
источник