П’яний єпископ


42

У криптографії відкритого ключа відбиток відкритого ключа - це коротка послідовність байтів, яка використовується для ідентифікації більш тривалого відкритого ключа.

Зокрема, в 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 і тоді (теоретично) розпізнав би її, коли змінився відбиток сервера і зображення виглядало інакше.

Як це працює

Взяті від Дірка Лосса, Тобіаса Ліммера, Олександра фон Гернлера. 2009. П'яний єпископ: аналіз алгоритму візуалізації відбитків пальців OpenSSH .

Сітка має ширину 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          |
|                 |
|                 |
|                 |
+-----------------+

Правила

  • Це . Код у найменших байтах виграє.
  • Ви можете НЕ використовувати існуючу бібліотеку , яка виробляє зображення.
  • Використовуйте будь-яку мову ви хочете!
  • Подання має бути повноцінною програмою

3
Чи можна припустити, що жоден осередок не відвідуватиметься більше 14 разів?
Мартін Ендер

2
Є кілька кутових випадків мінімального покриття, які призведуть до того, що кілька полів будуть відвідуватися більше 14 разів. 33:33:33:...:33, cc:cc:cc:...:ccбудуть приклади для цього. Відбиток пальців, як правило, має хеш MD5, тому навряд чи ви отримаєте такий результат. Я не знайшов надійних джерел, як боротися з ними, тому зараз я б сказав: припустимо, жодна клітина не буде відвідуватися більше 14 разів.
Падаром

Відповіді:


2

Pyth, 125 байт

Jj*17\-"++"JVc9XXsm@"^ .o+=*BOX@%&#/"hdrS+*U9U17K.u.e@S[0b*8hk)1.b+tNyYNYsm_c4.[08jxsM^.HM16 2d2cz\:,4 8 8ieK17\E76\SjN"||")J

Спробуйте в Інтернеті: Демонстрація або Тест-сюїт

Я писав кілька днів тому, але не опублікував це, тому що не дуже зрадів цьому.

Пояснення:

Основна ідея полягає в наступному. Я починаю з пари (4, 8). З кожним рухом (m1,m2)я переходжу (x, y)до (x-1+2*m1, y-1+2*m2). Щоб переконатися в тому, що ці координати не виходять за межі кордонів, я зроблю деякі списки, сортувати їх і повернути середній елемент: (sorted(0,8,newx)[1], sorted(0,16,newy)[1]).

Я стежу за всіма позиціями. До цього списку позицій я додаю перелік усіх можливих позицій, сортую їх і виконую кодування за довжиною. Що дає мені номер для кожної позиції. За допомогою цього числа я можу вибрати кооректний знак, а в кінці перезаписати символи початкового та кінцевого положення.


9

Діалог APL (178)

{⎕ML←3⋄F←9 17⍴0⋄5 9{(⍺⌷F)+←1⋄×⍴⍵:(1 1⌈9 17⌊⍺-1 1-2×↑⍵)∇1↓⍵⋄(⍺⌷F)←16⋄F[5;9]←15⋄K⍪(M,' .o+=*BOX@%&#/^SE'[1+F],M←'|')⍪K←'+','+',⍨17⍴'-'}⊃,/{↓⊖4 2⍴⍉(4/2)⊤¯1+⍵⍳⍨⎕D,'abcdef'}¨⍵⊂⍨':'≠⍵}

Це функція, яка приймає рядок як правильний аргумент і повертає матрицю символів, що містить представлення мистецтва ASCII, наприклад:

      F←{⎕ML←3⋄F←9 17⍴0⋄5 9{(⍺⌷F)+←1⋄×⍴⍵:(1 1⌈9 17⌊⍺-1 1-2×↑⍵)∇1↓⍵⋄(⍺⌷F)←16⋄F[5;9]←15⋄K⍪(M,' .o+=*BOX@%&#/^SE'[1+F],M←'|')⍪K←'+','+',⍨17⍴'-'}⊃,/{↓⊖4 2⍴⍉(4/2)⊤¯1+⍵⍳⍨⎕D,'abcdef'}¨⍵⊂⍨':'≠⍵}


      F '16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48'
+-----------------+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+
      F 'b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b'
+-----------------+
|            o.o  |
|            .= E.|
|             .B.o|
|              .= |
|        S     = .|
|       . o .  .= |
|        . . . oo.|
|             . o+|
|              .o.|
+-----------------+

Пояснення:

  • ⎕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: встановлено F16 у кінцевій позиції
      • F[5;9]←15: встановлено F15 у вихідному положенні
      • ' .o+=*BOX@%&#/^SE'[1+F]: карта кожної позиції з відповідним символом
      • K⍪(M,... ,M←'|')⍪K←'+','+',⍨17⍴'-': оберніть результат рядками

8

Perl, 300 + 1 (-n) = 301 байт

perl -ne 'sub b{$b=$_[0]+$_[1];$_[0]=$b<0?0:$b>$_[2]?$_[2]:$b}$v=pack"(H2)*",/\w\w/g;($x,$y)=(8,4);$a[b($y,($_&2)-1,8)*17+b($x,($_&1)*2-1,16)]++for map{vec$v,$_,2}0..63;@a[76,$y*17+$x]=(15,16);$c=" .o+=*BOX@%&#/^SE";print$d="+".("-"x17)."+\n",(map{+"|",(map{substr$c,$_,1}@a[$_*17..($_+1)*17-1]),"|\n"}0..8),$d'

Ця відповідь огидна, але вона також є першою для цієї головоломки, тому це зробимо зараз.

-nвзяти рядок введення на STDIN та заповнити $_.

# b($v, -1 or 1, max) modifies $v within 0..max
sub b{$b=$_[0]+$_[1];$_[0]=$b<0?0:$b>$_[2]?$_[2]:$b}

# turn $_ into a binary string
$v=pack"(H2)*",/\w\w/g;

# initialize cursor
($x,$y)=(8,4);

# find an element of single-dimensional buffer @a
$a[
    # y += (bitpair & 2) - 1, within 8
    b($y,($_&2)-1,8) * 17
    # x += (bitpair & 1) * 2 - 1, within 17
  + b($x,($_&1)*2-1,16)
# and increment it
]++
# for each bit pair (in the right order!)
  for map{vec$v,$_,2}0..63;

# overwrite the starting and ending positions
@a[76,$y*17+$x]=(15,16);

# ascii art lookup table
$c=" .o+=*BOX@%&#/^SE";

# output
print
  # the top row, saving it for later
  $d="+".("-"x17)."+\n",
  # each of the eight middle rows
  (map{+
    # converting each character in @a in this row as appropriate
    "|",(map{substr$c,$_,1}@a[$_*17..($_+1)*17-1]),"|\n"
  }0..8),
  # the bottom row
  $d

7

R, 465 459 410 393 382 357 байт

f=function(a){s=strsplit;C=matrix(as.integer(sapply(strtoi(el(s(a,":")),16),intToBits)[1:8,]),2);C[!C]=-1;n=c(17,9);R=array(0,n);w=c(9,5);for(i in 1:64){w=w+C[,i];w[w<1]=1;w[w>n]=n[w>n];x=w[1];y=w[2];R[x,y]=R[x,y]+1};R[]=el(s(" .o+=*BOX@%&#/^",""))[R+1];R[9,5]="S";R[x,y]="E";z="+-----------------+\n";cat(z);for(i in 1:9)cat("|",R[,i],"|\n",sep="");cat(z)}

З відступами та новими рядками:

f=function(a){
    s=strsplit
    C=matrix(as.integer(sapply(strtoi(el(s(a,":")),16),intToBits)[1:8,]),2)
    C[!C]=-1
    n=c(17,9)
    R=array(0,n)
    w=c(9,5)
    for(i in 1:64){
        w=w+C[,i]
        w[w<1]=1
        w[w>n]=n[w>n]
        x=w[1]
        y=w[2]
        R[x,y]=R[x,y]+1
    }
    R[]=el(s(" .o+=*BOX@%&#/^",""))[R+1]
    R[9,5]="S"
    R[x,y]="E"
    z="+-----------------+\n"
    cat(z)
    for(i in 1:9)cat("|",R[,i],"|\n",sep="")
    cat(z)
}

Використання:

> f("16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48")
+-----------------+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+
> f("37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e")
+-----------------+
|                 |
|                 |
|          .      |
|     .   o       |
|o . o . S +      |
|.+ + = . B .     |
|o + + o B o E    |
| o .   + . o     |
|         .o      |
+-----------------+

Не можете ви переграти функцію "матриця", визначивши її один раз як "м"? Те саме для "функції"?
CousinCocaine

Я думаю, вам не потрібно 'sep =' у функції 'cat'
CousinCocaine

за замовчуванням для sep є пробіл, тому мені потрібно його переосмислити, але я дійсно міг би псевдонімом матриці.
планнапус

Крім того, наскільки я знаю, ви не можете псевдоніму function.
планнапус

5

Октава, 277

d=reshape(rot90(dec2bin(hex2dec(strsplit(input('','s'),':'))))>'0',2,[])*2-1;p=[9;5];for m=1:64 p=[max(min(p(:,1)+d(:,m),[17;9]),1) p];end;A=' .o+=*BOX@%&#/^SE';F=A(sparse(p(2,:),p(1,:),1,9,17)+1);F(5,9)='S';F(p(2,1),p(1,1))='E';[a='+-----------------+';b=['|||||||||']' F b;a]

Пояснення:

%// convert the input to binary and rearrange it to be
%//   an array of vectors: [x_displacement; y_displacement]
d=reshape(rot90(dec2bin(hex2dec(strsplit(input('','s'),':'))))>'0',2,[])*2-1;

%// start position array with vector for the start position
p=[9;5];
%// for each move, add displacement, clamping to valid values
for m=1:64 p=[max(min(p(:,1)+d(:,m),[17;9]),1) p];end;

%// alphabet for our fingerprint
A=' .o+=*BOX@%&#/^SE';

%// create a sparse matrix, accumulating values for duplicate
%// positions, and replace counts with symbols
F=A(sparse(p(2,:),p(1,:),1,9,17)+1);

%// correct the start and end symbols and construct the final output
F(5,9)='S';F(p(2,1),p(1,1))='E';
[a='+-----------------+';b=['|||||||||']' F b;a]

Проба зразка:

>> bish
b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b
ans =

+-----------------+
|            o.o  |
|            .= E.|
|             .B.o|
|              .= |
|        S     = .|
|       . o .  .= |
|        . . . oo.|
|             . o+|
|              .o.|
+-----------------+

3

Піта, 145 143 140

Jm*17]09A,4K8FYcz\:V4AmhtS[0^2d+@,HGdtyv@+_.BiY16*7\0+-4dyN),3 4 X@JGHh@@JGH; X@J4K15 X@JGH16
=Y++\+*17\-\+VJ++\|s@L" .o+=*BOX@%&#/^SE"N\|)Y

Спробуйте в Інтернеті.

Pyth насправді не підходить до проблем із ітерацією. Я очікую, що CJam його легко переможе.


3

JavaScript (ES6) 249 208

Редагувати Додано відсутню межу

Випробуйте запуск фрагмента нижче в будь-якому веб-переглядачі, сумісному з EcmaScript 6

B=f=>f.replace(/\w+/g,b=>{for(b=`0x1${b}`;b-1;b>>=2)++g[p=(q=(p=(q=p+~-(b&2)*18)>0&q<162?q:p)+b%2*2-1)%18?q:p]},p=81,z=`+${'-'.repeat(17)}+`,g=Array(162).fill(0))&&g.map((v,q)=>q?q-81?q-p?q%18?' .o+=*BOX@%&#/^'[v]:`|
|`:'E':'S':z+`
|`).join``+`|
`+z

// TEST
console.log=x=>O.innerHTML+=x+'\n'

;['37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e'
,'16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48'
,'b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b'
,'05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47'  
].forEach(t=>console.log(t+'\n'+B(t)+'\n'))


// Less golfed

BB=f=>(
  p = 81,
  g = Array(162).fill(0),
  f.replace(/\w+/g, b => {
    for(b = `0x1${b}`;b != 1; b >>= 2)
      q = p+~-(b&2)*18,
      p = q>0&q<162?q:p,
      p = (q=p+b%2*2-1)%18?q:p,
      ++g[p]
  }),
  g.map((v,q) => q-81?q-p?q%18?' .o+=*BOX@%&#/^'[v]:'\n':'E':'S')
  .join``
)
pre { font-family: menlo,consolas; font-size:13px }
<pre id=O></pre>


Ваш код гольфу сам повинен бути в змозі надрукувати рамки. Наразі лише ваш тестовий зразок друкує верхню та нижню межі в forEach, вертикальні межі все ще відсутні.
Падаром

@Padarom Я неправильно зрозумів ваш коментар "будьте розумні", думаючи, що кордон не запитували
edc65

Я мав на увазі бути розумним, який метод введення та виводу ви використовуєте. Мої вибачення, якщо це було оманливим, я відредагую його
Падаром

3

Пітона, 381 328

-51 завдяки @JonathanFrech

def h(f):
 s=[f'{int(o,16)>>s&3:02b}'for o in f.split(':')for s in(0,2,4,6)];r=[0]*153;p=76;w=17
 for d in s:r[p]+=1;p+=(-(p%w!=0),p%w!=16)[int(d[1])]+(-w*(p//w!=0),w*(p//w!=8))[int(d[0])]
 r[76]=15;r[p]=16;b='+'+'-'*w+'+';print(b);i=0
 while i<153:print(f"|{''.join(' .o+=*BOX@%&#/^SE'[c]for c in r[i:i+w])}|");i+=w
 print(b)

Злегка нездужання заради пояснення:

def h_(f):
 #Alias 17 because it gets used enough times for this to save bytes
 w=17

 #Input parsing
 s=[f'{int(o,16)>>s&3:02b}'for o in f.split(':')for s in(0,2,4,6)]

 #Room setup
 r=[0]*153
 p=76

 #Apply movements
 for d in s:
  r[p]+=1
  p+=(-(p%w!=0),p%w!=16)[int(d[1])]+(-w*(p//w!=0),w*(p//w!=8))[int(d[0])]
 r[76]=15 #Set start position
 r[p]=16 #Set end position

 #Display result
 b='+'+'-'*w+'+'
 print(b)
 i=0
 while i<153:
  print(f"|{''.join(' .o+=*BOX@%&#/^SE'[c]for c in r[i:i+w])}|")
  i+=w
 print(b)

Цей безлад рядка:

r[p]+=1;p+=(-(p%w!=0),p%w!=16)[int(d[1])]+(-w*(p//w!=0),w*(p//w!=8))[int(d[0])]

Функціонально еквівалентний цьому:

if int(d[0]): #Down, Y+
  if p//17!=8:
    p+=17
else: #Up, Y-
  if p//17!=0:
    p-=17
​
if int(d[1]): #Right, X+
  if p%17!=16:
    p+=1
else: #Left, X-
  if p%17!=0:
    p-=1

але вкладає всі умови в цьому стилі ярлика для гольфу: (false_value,true_value)[condition] сподіваємось, решта досить зрозуміла.

Тести

h('16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48')
+-----------------+
|        .        |
|       + .       |
|      . B .      |
|     o * +       |
|    X * S        |
|   + O o . .     |
|    .   E . o    |
|       . . o     |
|        . .      |
+-----------------+

h("b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b")
+-----------------+
|            o.o  |
|            .= E.|
|             .B.o|
|              .= |
|        S     = .|
|       . o .  .= |
|        . . . oo.|
|             . o+|
|              .o.|
+-----------------+

h("05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47")
+-----------------+
|       o=.       |
|    o  o++E      |
|   + . Ooo.      |
|    + O B..      |
|     = *S.       |
|      o          |
|                 |
|                 |
|                 |
+-----------------+
```

Привіт і ласкаво просимо до PPCG. Ви можете гольфувати код, використовуючи однобуквені назви змінних і вводячи одну лінію для циклу в один рядок. (1,0)[p%17==16]є +(p%17!=16), або, можливо, навіть p%17!=16.
Джонатан Фрех

Крім того, в ньому є зайвий простір ] for.
Джонатан Фрех

Я думаю, що fpмає бути f.
Джонатан Фрех


2
Чому я користувався ~16? Трохи затуманення ніколи не може нашкодити вашому гольфу!
Джонатан Фрех

2

Рубін 288

->k{w=17
r=[z=?++?-*w+?+]
(0...w*9).each_slice(w).map{|o|r<<?|+o.map{|x|c=76
q=0
k.split(?:).flat_map{|b|(0..7).map{|i|b.to_i(16)[i]}}.each_slice(2){|h,v|v<1?(c>w&&c-=w):c<w*8&&c+=w
c+=h<1?c%w>0?-1:0:c%w<16?1:0
c==x&&q+=1}
x==76?'S':c==x ?'E':' .o+=*BOX@%&#/^'[q]}.join+?|}
(r+[z]).join'
'}

Спробуйте в Інтернеті: http://ideone.com/QOHAnM

Зчитана версія (та, з якої я почав займатися гольфом), тут: http://ideone.com/XR64km


2

С - 488

Має бути спосіб зробити це меншим….

#include<stdio.h>
#define H ++p;h[i]|=(*p-(*p>58?87:48))<<
#define B ((h[j]>>n*2)&3)
#define L puts("+-----------------+")
#define F(m,s)for(m=0;m<s;m++)
int h[16],m[17][9],i,j,n,x=8,y=4;main(w,v)char**v;{char*p=v[1]-1,c[17]={32,46,111,43,61,42,66,79,88,64,37,38,35,47,94,83,69};for(;*p;p++,i++){H 4;H 0;}F(j,16)F(n,4){if(B&1)x+=!(x==16);else x-=!(x==0);if(B&2)y+=!(y==8);else y-=!(y==0);m[x][y]++;}m[8][4]=15;m[x][y]=16;L;F(i,9){printf("|");F(j,17)printf("%c",c[m[j][i]]);puts("|");}L;}

0

Іржа - 509 байт

fn b(s:&str)->String{let(mut v,mut b)=([[0;11];20],[9,5]);v[19]=[19;11];for i in 0..16{let mut c=usize::from_str_radix(&s[i*3..i*3+2],16).unwrap();for k in 0..4{for j in 0..2{v[j*18][i%9+1]=18;v[i+k][j*10]=[17,3][(i+k+17)%18/17];b[j]=match(if c&(j+1)==j+1{b[j]+1}else{b[j]-1},j,){(0,_)=>1,(18,0)=>17,(10,1)=>9,x@_=>x.0 as usize,}}v[b[0]][b[1]]+=1;c>>=2;}}v[9][5]=15;v[b[0]][b[1]]=16;(0..220).fold("\n".to_string(),|s,i|{format!("{}{}",s," .o+=*BOX@%&#/^SE-|\n".chars().nth(v[i%20][i/20] as usize).unwrap())})}

Великий, але ... майже близький до C. Як завжди, багато байтів використовуються завдяки тому, що Руст не автоматично передає типи один одному. Але також, мабуть, є можливість для вдосконалення .... можливо, можна використовувати деякі ідеї з інших рішень.

версія без вогків знаходиться на ігровій майданчику «Іржа» в Інтернеті

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.