Sarhoş Piskopos


42

Genel anahtar şifrelemesinde, genel anahtar parmak izi daha uzun bir genel anahtarı tanımlamak için kullanılan kısa bayt dizisidir.

Özellikle SSH'de, bir sunucunun aslında iletişim kurmayı beklediğim ve ortadaki bir saldırıyla hedef almadığım sunucu olduğunu doğrulamak için kullanılabilirler.

Genellikle onaltılık basamak dizesi olarak temsil edilir, bu nedenle beklediğim parmak izi ile karşılaştırmak oldukça sıkıcı ve sıkıcı olabilir:

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

Biraz daha kolaylaştırmak için OpenSSH, parmak izlerini ASCII sanatı olarak görselleştirmek için aşağıdaki gibi görünen bir yöntem getirdi:

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

Bununla, ASCII sanatının kaba şeklini hatırlamaya çalışabilirim ve ardından sunucunun parmak izi değiştiğinde ve görüntü farklı göründüğünde (teorik olarak) tanıyabilirdim.

Nasıl çalışır

Alındığı Dirk kaybı, Tobias Limmer, Alexander von Gernler. 2009. Sarhoş piskopos: OpenSSH parmak izi görselleştirme algoritmasının analizi .

Izgara, 17 karakter genişliğinde ve 9 karakter yüksekliğindedir. "Piskopos" sıra 4 / sütun 8'de (ortada) başlar. Her pozisyon, filin başlangıç ​​pozisyonu için [x, y], yani [8,4] olarak belirtilebilir.

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

Piskopos dolaşmak için parmak izini kullanıyor. Soldan sağa ve en az önemli olan bitden en anlamlı bit olana kadar bayt şeklinde okur:

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

Piskopos aşağıdaki plana göre hareket edecektir:

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

Özel durumlar:

  • Piskopos bir köşede ise ve tekrar köşeye giderse, hiç hareket etmez. yani: Piskopos at [0,0]ve bir sonraki adımı olacak 00. O kalır[0,0]
  • Piskopos bir köşede ya da bir duvardaysa ve duvarlardan birine girerse, yalnızca yatay ya da dikey olarak hareket eder. yani: Piskopos at [0,5]ve bir sonraki adımı olacak 01. Sola gidemez, bu yüzden sadece yukarı hareket eder [0,4].

Her pozisyonda, piskoposun bu alanı ne sıklıkta ziyaret ettiğinin bir değeri vardır:

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) ve 16 (E) değerleri, piskoposun sırasıyla başlangıç ​​ve bitiş pozisyonunu işaretlemelerinde ve saygı duyulan pozisyonun gerçek değerinin üzerine yazılmasında özeldir.

Hedef

Girdi olarak alfa nümerik parmak izini alan ve örneklerinde gösterildiği gibi ASCII sanat gösterimini üreten bir program oluşturun.

Örnekler

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

kurallar

  • Bu . En az bayttaki kod kazanır.
  • Sen olabilir değil görüntü üretir varolan kitaplığı kullanın.
  • Tercih ettiğiniz dili kullanın!
  • Gönderiniz tam bir program olmalı

3
Hiçbir hücrenin 14 kezden fazla ziyaret edilmeyeceğini varsayabilir miyiz?
Martin Ender

2
Birkaç alanın 14 kereden daha fazla ziyaret edilmesine yol açacak birkaç köşe minimal vaka söz konusudur. 33:33:33:...:33, cc:cc:cc:...:ccbunun için örnekler olurdu. Parmak izi genellikle bir MD5 özetidir, bu nedenle böyle bir sonuç elde etmeniz pek olası değildir. Bunlarla nasıl başa çıkılacağı konusunda güvenilir bir kaynak bulamadım, bu yüzden şimdilik şunu söyleyebilirim: Hiçbir hücrenin 14 kezden fazla ziyaret edilmeyeceğini varsayın.
Padarom

Yanıtlar:


2

Pyth, 125 bayt

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

Çevrimiçi deneyin: Gösteri veya Test Takımı

Birkaç gün önce yazdım ama göndermedim, çünkü gerçekten mutlu değildim.

Açıklama:

Temel fikir şudur. Ben çift ile başlıyorum (4, 8). Her hareketle (m1,m2)ben gitmek (x, y)için (x-1+2*m1, y-1+2*m2). Bu koordinatlar pansiyoner dışarı çıkmıyoruz ki, emin olmak için, onları sıralama, bazı listeleri yapabilir ve orta eleman dönersiniz: (sorted(0,8,newx)[1], sorted(0,16,newy)[1]).

Tüm pozisyonları takip ediyorum. Bu konum listesine, olası tüm konumların bir listesini ekliyorum, sıralıyorum ve uzunlukları kodlayın. Bu bana her pozisyon için bir numara verir. Bu sayı ile coorect karakterini seçebilirim ve sonunda başlangıç ​​ve bitiş konumu karakterlerinin üzerine yazabilirim.


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

Bu, dizeyi doğru argümanı olarak alan ve ASCII sanat gösterimini içeren bir karakter matrisi döndüren bir işlevdir, örneğin:

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

Açıklama:

  • ⎕ML←3: Set ⎕MLiçin 3. Bu, dizeleri bölmek için daha kullanışlı hale getirir .

  • F←9 17⍴0: 17'ye 9'luk bir matris sıfırını yap. Fher bir pozisyonun kaç kez ziyaret edildiğini gösterir.

  • ⍵⊂⍨':'≠⍵: Bölünmüş üzerine :karakterler.

  • {... : her grup için:
    • ¯1+⍵⍳⍨⎕D,'abcdef': dizedeki her karakterin dizinini bulur '01234567890abcdef'. APL varsayılan olarak 1 dizinli olduğundan 1'i çıkarın.
    • (4/2)⊤: değerleri 4 bitlik gösterimlerine dönüştürün (artık 2'ye 4 matris olmalı).
    • ↓⊖4 2⍴⍉: matrisi döndürün, 2'ye 4'lük bir matrisi doldurmak için öğeleri kullanın, bunun yerine matrisi yatay olarak yansıtın ve sonra her satırı ayrı ayrı alın. Bu bize ihtiyacımız olan 4 2 bitlik değeri verir.
  • ⊃,/: 2-bit adımların bir listesini vererek sonuç listelerini bir araya getirin.
  • 5 9{... }: adımların listesi verilen ve [9,5] konumundan başlayan:
    • (⍺⌷F)+←1: şu anki pozisyonunu arttır F.
    • ×⍴⍵:: eğer adımların listesi boş değilse:
      • ↑⍵: listeden ilk adımı atın
      • ⍺-1 1-2×: o adıma ait deltayı alın ve mevcut konumdan çıkarın
      • 1 1⌈9 17⌊: alan içindeki hareketi kısıtla
      • (... )∇1↓⍵: yeni pozisyona ve adımların geri kalanına devam edin
    • O takdirde ise boş:
      • (⍺⌷F)←16: Fson konumda 16’ya ayarlanmış
      • F[5;9]←15: Fbaşlangıç ​​konumunda 15'e ayarlayın
      • ' .o+=*BOX@%&#/^SE'[1+F]: her pozisyonu ilgili karakterle eşleştir
      • K⍪(M,... ,M←'|')⍪K←'+','+',⍨17⍴'-': sonucu satırlara sar

8

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

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'

Bu cevap iğrenç, ama aynı zamanda bu yapboz için ilk, o yüzden şimdilik yapacağım.

-nSTDIN'de bir giriş satırı almak ve doldurmak için $_.

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

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

Girinti ve yeni satırlarla:

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

Kullanımı:

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

'Matrix' işlevini bir kez 'm' olarak tanımlayarak golf kuramaz mısınız? 'Fonksiyon' için aynı mı?
Kuzen Kokain

Sanırım 'kedi' işlevinde 'sep =' gerekli değil
CousinCocaine

sep için varsayılan değer bir boşluktur, bu yüzden onu geçersiz kılmam gerekiyor, ama gerçekten de takma matris yapabilirim.
plannapus

Ek olarak, bildiğim kadarıyla, takma ad olamazsınız function.
plannapus

5

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

Açıklama:

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

Örnek çalışma:

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

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

Çevrimiçi deneyin.

Pyth, yinelemeyle mücadelede gerçekten iyi değil. CJam'ı kolayca yenmesini bekliyorum.


3

JavaScript (ES6) 249 208

Düzenle Eklenen eksik kenarlık

Aşağıdaki snippet'i çalışan herhangi bir EcmaScript 6 uyumlu tarayıcıda test edin

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>


Golf kodunuzun kendisi de sınırları yazdırabilmelidir. Şu anda yalnızca test durumunuz, üst ve alt sınırları yazdırıyor forEach, dikey kenarlıklar hala eksik.
Padarom

@Padarom, sınırın talep edilmediğini düşünerek "makul olun" yorumunuzu yanlış anladım
edc65

Hangi giriş ve çıkış yöntemini kullandığınız konusunda makul olmak istedim. Bu yanıltıcı olsaydı özür dilerim, düzenleyeceğim
Padarom

3

Python, 381 328

-51 @JonathanFrech sayesinde

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)

Açıklama uğruna biraz ungolfed:

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)

Bu satırdaki karışıklık:

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

İşlevsel olarak buna eşittir:

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

ancak tüm şartlı koşullan bu golf kısayol stiline ev sahipliği yapar: (false_value,true_value)[condition] Umarım geri kalanı oldukça açıklayıcıdır.

Testler

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

Merhaba ve PPCG'ye hoş geldiniz. Tek harfli değişken adları kullanarak ve döngü için tek satırlık bir satıra koyarak kodunuzu golf yapabilirsiniz. (1,0)[p%17==16]olan +(p%17!=16)ya da muhtemelen daha da p%17!=16.
Jonathan Frech

Ayrıca, içinde gereksiz bir alan var ] for.
Jonathan Frech

Bence fpolmalı f.
Jonathan Frech


2
Neden kullandı ~16? Biraz şaşkınlık golfünüzü asla incitemez!
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'
'}

Çevrimiçi deneyin: http://ideone.com/QOHAnM

Okunabilir versiyon (golf oynamaya başladığım sürüm) burada: http://ideone.com/XR64km


2

C - 488

Bunu küçültmenin bir yolu olmalı ...

#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

Pas - 509 bayt

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

Büyük ama ... neredeyse C'ye yakın. Her zaman olduğu gibi, Rust'un birbirine otomatik olarak türleri dökmemesi nedeniyle kullanılan birçok bayt var. Ancak, muhtemelen iyileştirmeye de yer var ... muhtemelen başka çözümlerden gelen bazı fikirleri kullanabilir.

ungolfed versiyonu Rust Oyun Alanı'nda çevrimiçi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.