Giám mục say rượu


42

Trong mật mã khóa công khai, dấu vân tay khóa công khai là một chuỗi byte ngắn được sử dụng để xác định khóa công khai dài hơn.

Đặc biệt, trong SSH, chúng có thể được sử dụng để xác minh rằng máy chủ thực tế là máy chủ mà tôi muốn liên lạc và tôi không bị tấn công bởi một cuộc tấn công trung gian.

Chúng thường được biểu diễn dưới dạng một chuỗi các chữ số thập lục phân, do đó có thể khá nhàm chán và tẻ nhạt khi so sánh nó với dấu vân tay mà tôi mong đợi:

37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e

Để làm cho nó dễ dàng hơn một chút, OpenSSH đã giới thiệu một phương pháp trực quan hóa dấu vân tay như nghệ thuật ASCII, trông giống như sau:

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

Với điều này, tôi có thể cố gắng nhớ hình dạng thô của nghệ thuật ASCII và sau đó (về mặt lý thuyết) sẽ nhận ra nó khi dấu vân tay của máy chủ thay đổi và hình ảnh trông khác nhau.

Làm thế nào nó hoạt động

Lấy từ Dirk Mất, Tobias Limmer, Alexander von Gernler. 2009. Giám mục say rượu: Một phân tích về thuật toán hình ảnh vân tay OpenSSH .

Lưới có chiều rộng 17 ký tự và chiều cao 9 ký tự. "Giám mục" bắt đầu ở hàng 4 / cột 8 (giữa). Mỗi vị trí có thể được ký hiệu là [x, y], tức là [8.4] cho vị trí bắt đầu của giám mục.

            1111111
  01234567890123456
 +-----------------+
0|                 |
1|                 |
2|                 |
3|                 |
4|        S        |
5|                 |
6|                 |
7|                 |
8|                 |
 +-----------------+

Giám mục sử dụng dấu vân tay để di chuyển xung quanh. Nó đọc nó theo từng byte từ trái sang phải và từ bit quan trọng nhất đến bit quan trọng nhất:

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

Giám mục sẽ di chuyển theo kế hoạch sau:

Bits   Direction
-----------------
00     Up/Left
01     Up/Right
10     Down/Left
11     Down/Right

Trường hợp đặc biệt:

  • Nếu giám mục ở trong một góc và sẽ di chuyển vào góc một lần nữa, anh ta sẽ không di chuyển chút nào. tức là: Giám mục đang ở [0,0]và bước tiếp theo của ông sẽ là 00. Anh ấy vẫn ở[0,0]
  • Nếu giám mục ở trong một góc hoặc tại một bức tường và sẽ di chuyển vào một trong những bức tường, anh ta chỉ di chuyển theo chiều ngang hoặc chiều dọc. tức là: Giám mục đang ở [0,5]và bước tiếp theo của ông sẽ là 01. Anh ta không thể đi bên trái, vì vậy anh ta chỉ cần di chuyển lên [0,4].

Mỗi vị trí giữ một giá trị về tần suất mà giám mục đã đến thăm lĩnh vực này:

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 |

Các giá trị 15 (S) và 16 (E) đặc biệt ở chỗ chúng đánh dấu vị trí bắt đầu và kết thúc của giám mục tương ứng và ghi đè lên giá trị thực của vị trí tôn trọng.

Mục tiêu

Tạo một chương trình, lấy dấu vân tay chữ và số làm đầu vào và tạo ra biểu diễn nghệ thuật ASCII của nó như trong các ví dụ.

Ví dụ

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          |
|                 |
|                 |
|                 |
+-----------------+

Quy tắc

  • Đây là . Mã trong ít byte nhất sẽ thắng.
  • Bạn không thể sử dụng một thư viện hiện có tạo ra hình ảnh.
  • Sử dụng ngôn ngữ nào bạn thích!
  • Trình của bạn phải là một chương trình hoàn chỉnh

3
Chúng ta có thể cho rằng không có tế bào sẽ được truy cập hơn 14 lần?
Martin Ender

2
Có một vài trường hợp góc bảo hiểm tối thiểu sẽ dẫn đến một vài trường được truy cập hơn 14 lần. 33:33:33:...:33, cc:cc:cc:...:ccsẽ là ví dụ cho điều này. Dấu vân tay thường là hàm băm MD5, do đó rất khó có khả năng bạn nhận được kết quả như vậy. Tôi chưa tìm thấy bất kỳ nguồn đáng tin cậy nào về cách đối phó với những điều này, vì vậy bây giờ tôi nói: Giả sử không có tế bào nào sẽ được truy cập hơn 14 lần.
Padarom

Câu trả lời:


2

Bình thường, 125 byte

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

Dùng thử trực tuyến: Trình diễn hoặc Test-Suite

Tôi đã viết một vài ngày trước, nhưng không đăng nó, vì tôi không thực sự hài lòng về nó.

Giải trình:

Ý tưởng cơ bản là như sau. Tôi bắt đầu với cặp (4, 8). Trong mỗi lần di chuyển (m1,m2)tôi đi từ (x, y)đến (x-1+2*m1, y-1+2*m2). Để chắc chắn, các tọa độ này không đi ra ngoài nội trú, tôi sẽ tạo một số danh sách, sắp xếp chúng và trả về phần tử ở giữa : (sorted(0,8,newx)[1], sorted(0,16,newy)[1]).

Tôi theo dõi tất cả các vị trí. Trong danh sách các vị trí này, tôi thêm một danh sách tất cả các vị trí có thể, sắp xếp chúng và mã hóa độ dài chạy. Mà cho tôi một số cho mỗi vị trí. Với số này, tôi có thể chọn char coorect, và ở cuối ghi đè lên các ký tự của vị trí bắt đầu và kết thúc.


9

Thuốc nhuộm 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'}¨⍵⊂⍨':'≠⍵}

Đây là một hàm lấy chuỗi làm đối số đúng của nó và trả về một ma trận ký tự chứa biểu diễn nghệ thuật ASCII, ví dụ:

      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.|
+-----------------+

Giải trình:

  • ⎕ML←3: đặt ⎕MLthành 3. Điều này làm cho hữu ích hơn để chia chuỗi.

  • F←9 17⍴0: tạo ma trận 17 nhân 9 số 0. Fđại diện cho bao nhiêu lần mỗi vị trí đã được truy cập.

  • ⍵⊂⍨':'≠⍵: Chia trên :ký tự.

  • {... : cho mỗi nhóm:
    • ¯1+⍵⍳⍨⎕D,'abcdef': tìm chỉ mục của từng ký tự trong chuỗi '01234567890abcdef'. Trừ 1, vì APL được lập chỉ mục 1 theo mặc định.
    • (4/2)⊤: chuyển đổi các giá trị thành các biểu diễn 4 bit của chúng (bây giờ sẽ có ma trận 2 nhân 4).
    • ↓⊖4 2⍴⍉: xoay ma trận, sử dụng các phần tử để điền vào ma trận 2 nhân 4, thay vào đó, phản chiếu ma trận theo chiều ngang và sau đó lấy từng dòng riêng biệt. Điều này cung cấp cho chúng tôi 4 giá trị 2 bit mà chúng tôi cần.
  • ⊃,/: nối các danh sách kết quả lại với nhau, đưa ra danh sách các bước 2 bit.
  • 5 9{... }: đưa ra danh sách các bước và bắt đầu tại vị trí [9,5]:
    • (⍺⌷F)+←1: tăng vị trí hiện tại trong F.
    • ×⍴⍵:: nếu danh sách các bước không trống:
      • ↑⍵: thực hiện bước đầu tiên từ danh sách
      • ⍺-1 1-2×: lấy delta cho bước đó và trừ nó khỏi vị trí hiện tại
      • 1 1⌈9 17⌊: hạn chế di chuyển trong phạm vi trường
      • (... )∇1↓⍵: tiếp tục với vị trí mới và các bước còn lại
    • Nếu nó rỗng:
      • (⍺⌷F)←16: đặt Fthành 16 ở vị trí cuối cùng
      • F[5;9]←15: đặt Fthành 15 ở vị trí bắt đầu
      • ' .o+=*BOX@%&#/^SE'[1+F]: ánh xạ từng vị trí vào ký tự tương ứng
      • K⍪(M,... ,M←'|')⍪K←'+','+',⍨17⍴'-': bọc kết quả theo dòng

8

Perl, 300 + 1 (-n) = 301 byte

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'

Câu trả lời này thật kinh tởm, nhưng đây cũng là câu trả lời đầu tiên cho câu đố này, vì vậy nó sẽ làm ngay bây giờ.

-nđể có một dòng đầu vào trên STDIN và điền vào $_.

# 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 byte

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)}

Với các vết lõm và dòng mới:

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)
}

Sử dụng:

> 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      |
+-----------------+

Bạn có thể chơi golf chức năng 'ma trận' bằng cách xác định nó một lần là 'm' không? Tương tự cho 'chức năng'?
CousinCocaine

Tôi nghĩ rằng bạn không cần 'sep =' trong chức năng 'mèo'
CousinCocaine

Mặc định cho sep là một khoảng trắng, vì vậy tôi cần ghi đè lên nó, nhưng thực sự tôi có thể bí danh ma trận.
plannapus

Ngoài ra, theo như tôi biết, bạn không thể bí danh function.
plannapus

5

Tháng mười, 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]

Giải trình:

%// 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]

Chạy mẫu:

>> 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

Bình dương, 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

Hãy thử trực tuyến.

Pyth không thực sự giỏi trong các thử thách với phép lặp. Tôi đang mong đợi CJam sẽ đánh bại nó một cách dễ dàng.


3

JavaScript (ES6) 249 208

Chỉnh sửa Đã thêm viền bị thiếu

Kiểm tra chạy đoạn mã dưới đây trong bất kỳ trình duyệt tuân thủ EcmaScript 6 nào

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>


Bản thân mã golf của bạn cũng có khả năng in các đường viền. Hiện tại chỉ có trường hợp thử nghiệm của bạn in các viền trên và dưới trong forEach, các viền dọc vẫn bị thiếu.
Padarom

@Padarom Tôi đã hiểu nhầm nhận xét "hợp lý" của bạn, vì nghĩ rằng đường viền không được yêu cầu
edc65

Tôi có nghĩa là hợp lý như phương pháp đầu vào và đầu ra mà bạn sử dụng. Tôi xin lỗi nếu đó là sai lệch, tôi sẽ chỉnh sửa nó
Padarom

3

Python, 381 328

-51 cảm ơn @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)

Hơi vô duyên vì lời giải thích:

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)

Mớ hỗn độn này của một dòng:

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

Là chức năng tương đương với điều này:

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

nhưng lồng tất cả các điều kiện theo kiểu lối tắt golf này: (false_value,true_value)[condition] Hy vọng phần còn lại khá tự giải thích

Xét nghiệm

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          |
|                 |
|                 |
|                 |
+-----------------+
```

Xin chào và chào mừng đến với PPCG. Bạn có thể đánh mã mã của mình bằng cách sử dụng tên biến một chữ cái và đặt một dòng đơn cho vòng lặp thành một dòng. (1,0)[p%17==16]+(p%17!=16), hoặc thậm chí có thể p%17!=16.
Jonathan Frech

Hơn nữa, có một không gian thừa trong ] for.
Jonathan Frech

Tôi nghĩ fpnên được f.
Jonathan Frech


2
Tại sao tôi lại sử dụng ~16? Một chút obfuscation không bao giờ có thể làm tổn thương golf của bạn!
Jonathan Frech

2

Hồng 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'
'}

Dùng thử trực tuyến: http://ideone.com/QOHAnM

Phiên bản có thể đọc được (phiên bản tôi bắt đầu chơi gôn) có tại đây: http://ideone.com/XR64km


2

C - 488

Phải có một cách để làm cho nó nhỏ hơn ....

#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

Rust - 509 byte

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())})}

Lớn nhưng ... gần bằng C. Như thường lệ, có rất nhiều byte được sử dụng do cách Rust không tự động truyền các loại vào nhau. Nhưng cũng có thể có chỗ để cải thiện .... có thể sử dụng một số ý tưởng từ các giải pháp khác.

phiên bản chưa được phát hành trên Rust Playground trực tuyến

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.