Uskup Drunken

42

Dalam kriptografi kunci publik, sidik jari kunci publik adalah urutan singkat byte yang digunakan untuk mengidentifikasi kunci publik yang lebih panjang.

Dalam SSH khususnya mereka dapat digunakan untuk memverifikasi bahwa server sebenarnya adalah server yang saya harapkan untuk berkomunikasi dengan dan saya tidak ditargetkan oleh serangan man-in-the-middle.

Mereka biasanya direpresentasikan sebagai rangkaian angka heksadesimal, sehingga bisa agak membosankan dan membosankan untuk membandingkannya dengan sidik jari yang saya harapkan:

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

Untuk membuatnya sedikit lebih mudah, OpenSSH telah memperkenalkan metode untuk memvisualisasikan sidik jari sebagai seni ASCII, yang akan terlihat seperti berikut:

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

Dengan ini, saya bisa mencoba mengingat bentuk kasar seni ASCII dan kemudian (secara teoritis) mengenalinya ketika sidik jari server berubah dan gambar terlihat berbeda.

Bagaimana itu bekerja

Diambil dari Dirk Loss, Tobias Limmer, Alexander von Gernler. 2009. Uskup yang mabuk: Analisis algoritma visualisasi sidik jari OpenSSH .

Kisi memiliki lebar 17 karakter dan tinggi 9 karakter. "Uskup" dimulai pada baris 4 / kolom 8 (tengah). Setiap posisi dapat dilambangkan sebagai [x, y], yaitu [8,4] untuk posisi awal uskup.

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

Uskup menggunakan sidik jari untuk bergerak. Bunyinya byte-bijaksana dari kiri ke kanan dan dari bit paling signifikan ke bit paling signifikan:

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

Uskup akan bergerak dengan rencana berikut:

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

Kasus khusus:

  • Jika uskup ada di sudut dan akan pindah ke sudut lagi, dia tidak bergerak sama sekali. yaitu: Uskup berada di [0,0]dan langkah selanjutnya adalah 00. Dia tetap di[0,0]
  • Jika uskup berada di sudut atau di dinding dan akan pindah ke salah satu dinding, dia bergerak secara horizontal atau vertikal saja. yaitu: Uskup berada di [0,5]dan langkah selanjutnya adalah 01. Dia tidak bisa pergi ke kiri, jadi dia hanya bergerak ke atas, ke [0,4].

Setiap posisi memiliki nilai seberapa sering uskup mengunjungi bidang ini:

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 |

Nilai 15 (S) dan 16 (E) adalah istimewa karena menandai masing-masing posisi awal dan akhir uskup dan menimpa nilai sebenarnya dari posisi yang menghormati.

Tujuan

Buat program, yang mengambil sidik jari alfanumerik sebagai input dan menghasilkan representasi seni ASCII seperti yang ditunjukkan dalam contoh.

Contohnya

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

Aturan

  • Ini adalah . Kode dalam byte paling sedikit menang.
  • Anda tidak dapat menggunakan perpustakaan yang ada yang menghasilkan gambar.
  • Gunakan bahasa apa pun yang Anda suka!
  • Kiriman Anda harus merupakan program yang lengkap
Padarom
sumber
3
Bisakah kita berasumsi bahwa tidak ada sel yang akan dikunjungi lebih dari 14 kali?
Martin Ender
2
Ada beberapa kasus sudut cakupan minimal yang akan mengakibatkan beberapa bidang dikunjungi lebih dari 14 kali. 33:33:33:...:33, cc:cc:cc:...:ccakan menjadi contoh untuk ini. Sidik jari biasanya hash MD5, jadi sangat tidak mungkin Anda mendapatkan hasil seperti itu. Saya belum menemukan sumber yang dapat dipercaya tentang cara menangani ini, jadi untuk sekarang saya akan mengatakan: Asumsikan tidak ada sel yang akan dikunjungi lebih dari 14 kali.
Padarom

Jawaban:

2

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

Cobalah online: Demonstrasi atau Test-Suite

Saya menulis beberapa hari yang lalu, tetapi tidak mempostingnya, karena saya tidak begitu suka.

Penjelasan:

Ide dasarnya adalah sebagai berikut. Saya mulai dengan pasangan (4, 8). Dalam setiap gerakan (m1,m2)saya beralih dari (x, y)ke (x-1+2*m1, y-1+2*m2). Untuk memastikan, bahwa koordinat ini tidak pergi ke luar asrama, saya akan membuat beberapa daftar, semacam mereka dan kembali elemen tengah: (sorted(0,8,newx)[1], sorted(0,16,newy)[1]).

Saya melacak semua posisi. Ke daftar posisi ini saya menambahkan daftar semua posisi yang mungkin, urutkan dan jalankan-panjang-encode mereka. Yang memberi saya nomor untuk setiap posisi. Dengan nomor ini saya dapat memilih char coorect, dan pada akhirnya menimpa karakter awal dan posisi akhir.

Jakube
sumber
9

Dyalog 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'}¨⍵⊂⍨':'≠⍵}

Ini adalah fungsi yang mengambil string sebagai argumen yang benar, dan mengembalikan matriks karakter yang berisi representasi seni ASCII, misalnya:

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

Penjelasan:

  • ⎕ML←3: diatur ⎕MLke 3. Ini membuat lebih berguna untuk memisahkan string.

  • F←9 17⍴0: membuat 17-by-9 matriks nol. Fmewakili berapa kali setiap posisi telah dikunjungi.

  • ⍵⊂⍨':'≠⍵: split pada :karakter.

  • {... : untuk setiap grup:
    • ¯1+⍵⍳⍨⎕D,'abcdef': temukan indeks setiap karakter dalam string '01234567890abcdef'. Kurangi 1, karena APL diindeks 1 secara default.
    • (4/2)⊤: konversikan nilai-nilai ke representasi 4-bit mereka (sekarang harus ada 2-by-4 matrix).
    • ↓⊖4 2⍴⍉: memutar matriks, gunakan elemen untuk mengisi matriks 2-oleh-4 sebagai gantinya, mirror matriks itu secara horizontal, dan kemudian dapatkan setiap baris secara terpisah. Ini memberi kita 4 nilai 2-bit yang kita butuhkan.
  • ⊃,/: bergabung dengan daftar yang dihasilkan bersama, memberikan daftar langkah 2-bit.
  • 5 9{... }: diberi daftar langkah, dan mulai dari posisi [9,5]:
    • (⍺⌷F)+←1: increment posisi saat ini di F.
    • ×⍴⍵:: jika daftar langkah tidak kosong:
      • ↑⍵: ambil langkah pertama dari daftar
      • ⍺-1 1-2×: dapatkan delta untuk langkah itu, dan kurangi dari posisi saat ini
      • 1 1⌈9 17⌊: batasi gerakan di dalam bidang
      • (... )∇1↓⍵: lanjutkan dengan posisi baru dan sisa langkah
    • Jika adalah kosong:
      • (⍺⌷F)←16: diatur Fke 16 di posisi akhir
      • F[5;9]←15: diatur Fke 15 di posisi awal
      • ' .o+=*BOX@%&#/^SE'[1+F]: memetakan setiap posisi ke karakter yang sesuai
      • K⍪(M,... ,M←'|')⍪K←'+','+',⍨17⍴'-': bungkus hasilnya dalam garis
marinus
sumber
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'

Jawaban ini menjijikkan, tetapi ini juga yang pertama untuk teka-teki ini, jadi akan berlaku untuk sekarang.

-nuntuk mengambil jalur input pada STDIN dan mengisi $_.

# 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
Eric Wastl
sumber
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)}

Dengan lekukan dan baris baru:

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

Pemakaian:

> 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      |
+-----------------+
plannapus
sumber
Tidak bisakah kamu memainkan fungsi 'matriks' dengan mendefinisikannya sekali sebagai 'm'? Sama untuk 'fungsi'?
CousinCocaine
Saya pikir Anda tidak perlu 'sep =' dalam fungsi 'kucing'
CousinCocaine
default untuk sep adalah spasi, jadi saya harus menimpanya, tapi memang saya bisa alias matriks.
plannapus
Selain itu, sejauh yang saya tahu, Anda tidak bisa alias function.
plannapus
5

Oktaf, 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]

Penjelasan:

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

Contoh dijalankan:

>> 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.|
+-----------------+
gelas kimia
sumber
3

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

Cobalah online.

Pyth tidak benar-benar pandai dalam tantangan dengan iterasi. Saya mengharapkan CJam untuk mengalahkannya dengan mudah.

PurkkaKoodari
sumber
3

JavaScript (ES6) 249 208

Edit penambahan batas yang hilang

Tes menjalankan cuplikan di bawah ini di peramban apa pun yang mendukung 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>

edc65
sumber
Kode golf Anda sendiri harus mampu mencetak batas juga. Saat ini hanya kasus uji Anda yang mencetak batas atas dan bawah di forEach, batas vertikal masih hilang.
Padarom
@Padarom Saya salah mengerti komentar "masuk akal" Anda, berpikir bahwa perbatasan tidak diminta
edc65
Maksud saya masuk akal untuk metode input dan output yang Anda gunakan. Saya minta maaf jika itu menyesatkan, saya akan mengeditnya
Padarom
3

Python, 381 328

-51 terima kasih kepada @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)

Sedikit ungolfed demi penjelasan:

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)

Kekacauan garis ini:

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

Secara fungsional setara dengan ini:

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

tapi sarang semua persyaratan dalam gaya jalan pintas golf ini: (false_value,true_value)[condition] Semoga sisanya cukup jelas

Tes

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          |
|                 |
|                 |
|                 |
+-----------------+
```
senox13
sumber
Halo dan selamat datang di PPCG. Anda dapat memasukkan kode Anda dengan menggunakan nama variabel satu huruf dan meletakkan satu baris untuk loop dalam satu baris. (1,0)[p%17==16]adalah +(p%17!=16), atau mungkin bahkan p%17!=16.
Jonathan Frech
Selain itu, ada ruang berlebihan di ] for.
Jonathan Frech
Saya pikir fpseharusnya begitu f.
Jonathan Frech
330 byte .
Jonathan Frech
2
Kenapa saya menggunakan ~16? Sedikit kebingungan tidak pernah bisa melukai golf Anda!
Jonathan Frech
2

Ruby 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'
'}

Cobalah online: http://ideone.com/QOHAnM

Versi yang dapat dibaca (yang saya mulai main golf) ada di sini: http://ideone.com/XR64km

Cristian Lupascu
sumber
2

C - 488

Pasti ada cara untuk membuat ini lebih kecil ....

#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;}
Jerry Jeremiah
sumber
0

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

Besar tapi ... hampir mendekati C. Seperti biasa ada banyak byte yang digunakan karena cara Rust tidak secara otomatis saling melemparkan tipe. Tetapi mungkin juga ada ruang untuk perbaikan .... mungkin bisa menggunakan beberapa ide dari solusi lain.

versi ungolfed ada di Rust Playground online

jangan cerah
sumber