Il vescovo ubriaco


42

Nella crittografia a chiave pubblica, un'impronta digitale della chiave pubblica è una breve sequenza di byte utilizzata per identificare una chiave pubblica più lunga.

In SSH, in particolare, possono essere utilizzati per verificare che un server sia in realtà il server con cui mi aspetto di comunicare e non sono preso di mira da un attacco man-in-the-middle.

Di solito sono rappresentati come una stringa di cifre esadecimali, quindi può essere piuttosto noioso e noioso confrontarlo con l'impronta digitale che mi aspetterei:

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

Per renderlo un po 'più semplice, OpenSSH ha introdotto un metodo per visualizzare le impronte digitali come arte ASCII, che sarebbe simile al seguente:

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

Con questo, potrei provare a ricordare la forma approssimativa dell'arte ASCII e quindi riconoscerla (teoricamente) quando l'impronta digitale del server cambia e l'immagine appare diversa.

Come funziona

Tratto da Dirk Loss, Tobias Limmer, Alexander von Gernler. 2009. Il vescovo ubriaco: un'analisi dell'algoritmo di visualizzazione delle impronte digitali OpenSSH .

La griglia ha una larghezza di 17 caratteri e un'altezza di 9 caratteri. Il "vescovo" inizia alla riga 4 / colonna 8 (al centro). Ogni posizione può essere indicata come [x, y], ovvero [8,4] per la posizione iniziale del vescovo.

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

Il vescovo usa l'impronta digitale per muoversi. Lo legge in byte byte da sinistra a destra e dal bit meno significativo al bit più significativo:

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

Il vescovo si muoverà secondo il seguente piano:

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

Casi speciali:

  • Se il vescovo è in un angolo e si sposta di nuovo in un angolo, non si muove affatto. cioè: il vescovo è a [0,0]e il suo prossimo passo sarebbe 00. Lui rimane a[0,0]
  • Se il vescovo si trova in un angolo o su un muro e si sposta in uno dei muri, si sposta solo in orizzontale o in verticale. cioè: il vescovo è a [0,5]e il suo prossimo passo sarebbe 01. Non può andare a sinistra, quindi si sposta verso l'alto [0,4].

Ogni posizione ha un valore di quanto spesso il vescovo ha visitato questo campo:

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 |

I valori 15 (S) e 16 (E) sono speciali in quanto segnano rispettivamente la posizione iniziale e finale del vescovo e sovrascrivono il valore reale della posizione rispettosa.

Obbiettivo

Crea un programma, che prende un'impronta alfanumerica come input e produce la sua rappresentazione di arte ASCII come mostrato negli esempi.

Esempi

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

Regole

  • Questo è . Vince il codice nel minor numero di byte.
  • È possibile non utilizzare una libreria esistente che produce l'immagine.
  • Usa la lingua che preferisci!
  • La tua richiesta deve essere un programma completo

3
Possiamo supporre che nessuna cella sarà visitata più di 14 volte?
Martin Ender,

2
Vi sono alcuni casi angolari di copertura minima che comporterebbero la visita di alcuni campi più di 14 volte. 33:33:33:...:33, cc:cc:cc:...:ccsarebbero esempi per questo. L'impronta digitale di solito è un hash MD5, quindi è altamente improbabile che tu ottenga un tale risultato. Non ho trovato fonti affidabili su come gestirli, quindi per ora direi: supponiamo che nessuna cellula verrà visitata più di 14 volte.
Padarom,

Risposte:


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

Provalo online: dimostrazione o Test-Suite

Ho scritto qualche giorno fa, ma non l'ho pubblicato, perché non ne ero davvero contento.

Spiegazione:

L'idea di base è la seguente. Comincio con la coppia (4, 8). In ogni mossa (m1,m2)vado dal (x, y)a (x-1+2*m1, y-1+2*m2). Per assicurarsi che queste coordinate non vanno al di fuori dei confini, farò alcune liste, sorta di loro e tornare l'elemento centrale: (sorted(0,8,newx)[1], sorted(0,16,newy)[1]).

Tengo traccia di tutte le posizioni. A questo elenco di posizioni aggiungo un elenco di tutte le posizioni possibili, le ordino e le codifico per la lunghezza della corsa. Il che mi dà un numero per ogni posizione. Con questo numero posso scegliere il carattere coorect e alla fine sovrascrivere i caratteri della posizione iniziale e finale.


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

Questa è una funzione che accetta la stringa come argomento corretto e restituisce una matrice di caratteri contenente la rappresentazione artistica ASCII, ad esempio:

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

Spiegazione:

  • ⎕ML←3: impostato ⎕MLsu 3. Questo rende più utile per dividere le stringhe.

  • F←9 17⍴0: crea una matrice di zero 17 per 9. Frappresenta quante volte ogni posizione è stata visitata.

  • ⍵⊂⍨':'≠⍵: diviso sui :personaggi.

  • {... : per ogni gruppo:
    • ¯1+⍵⍳⍨⎕D,'abcdef': trova l'indice di ogni carattere nella stringa '01234567890abcdef'. Sottrai 1, poiché APL è 1 indicizzato per impostazione predefinita.
    • (4/2)⊤: converti i valori nelle loro rappresentazioni a 4 bit (ora dovrebbe esserci una matrice 2 per 4).
    • ↓⊖4 2⍴⍉: ruota la matrice, usa invece gli elementi per riempire una matrice 2 per 4, rispecchia quella matrice in orizzontale e quindi ottieni ogni riga separatamente. Questo ci dà i 4 valori a 2 bit di cui abbiamo bisogno.
  • ⊃,/: unisce gli elenchi risultanti insieme, fornendo un elenco di passaggi a 2 bit.
  • 5 9{...} : dato l'elenco dei passi, e partendo dalla posizione [9,5]:
    • (⍺⌷F)+←1: incrementa la posizione corrente in F .
    • ×⍴⍵:: se l'elenco dei passaggi non è vuoto:
      • ↑⍵: fai il primo passo dall'elenco
      • ⍺-1 1-2×: ottieni il delta per quel passaggio e sottralo dalla posizione corrente
      • 1 1⌈9 17⌊: limita i movimenti all'interno del campo
      • (... )∇1↓⍵: continua con la nuova posizione e il resto dei passaggi
    • Se lo è vuoto:
      • (⍺⌷F)←16: impostato F su 16 nella posizione finale
      • F[5;9]←15: impostato F su 15 nella posizione iniziale
      • ' .o+=*BOX@%&#/^SE'[1+F]: mappa ogni posizione sul personaggio corrispondente
      • K⍪(M,... ,M←'|')⍪K←'+','+',⍨17⍴'-': avvolge il risultato in righe

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'

Questa risposta è disgustosa, ma è anche la prima di questo enigma, quindi lo farà per ora.

-nper prendere una riga di input su STDIN e riempire $_.

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

Con rientri e newline:

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

Uso:

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

Non riesci a giocare a golf la funzione "matrice" definendola una volta come "m"? Lo stesso per 'funzione'?
CousinCocaine,

Penso che non sia necessario 'sep =' nella funzione 'cat'
CousinCocaine

il valore predefinito per sep è uno spazio, quindi ho bisogno di sovrascriverlo, ma in effetti potrei alias matrice.
plannapus,

Inoltre, per quanto ne so, non puoi alias function.
plannapus,

5

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

Spiegazione:

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

Esecuzione di esempio:

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

Provalo online.

Pyth non è davvero bravo nelle sfide con l'iterazione. Mi aspetto che CJam lo batta facilmente.


3

JavaScript (ES6) 249 208

modificare Aggiunto bordo mancante

Prova a eseguire lo snippet di seguito in qualsiasi browser compatibile con 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>


Il codice golf stesso dovrebbe essere in grado di stampare anche i bordi. Attualmente solo il tuo test case stampa i bordi superiore e inferiore in forEach, i bordi verticali sono ancora mancanti.
Padarom,

@Padarom Ho frainteso il tuo commento "sii ragionevole", pensando che il confine non fosse richiesto
edc65

Intendevo essere ragionevole riguardo al metodo di input e output che usi. Mi scuso se è stato fuorviante, lo modificherò
Padarom il

3

Python, 381 328

-51 grazie a @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)

Leggermente ungolf per motivi di spiegazione:

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)

Questo casino di una linea:

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

È funzionalmente equivalente a questo:

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

ma nidifica tutti i condizionali in questo stile di scorciatoia da golf: si (false_value,true_value)[condition] spera che il resto sia abbastanza autoesplicativo

test

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

Ciao e benvenuto in PPCG. Puoi giocare a golf il tuo codice usando nomi di variabili di una lettera e inserendo una riga per ciclo in una riga. (1,0)[p%17==16]è +(p%17!=16), o forse anche p%17!=16.
Jonathan Frech,

Inoltre, c'è uno spazio superfluo in ] for.
Jonathan Frech,

Penso che fpdovrebbe essere f.
Jonathan Frech,


2
Perché l'ho usato ~16? Un po 'di offuscamento non può mai danneggiare il tuo golf!
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'
'}

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

La versione leggibile (quella da cui ho iniziato a giocare a golf) è qui: http://ideone.com/XR64km


2

C - 488

Ci deve essere un modo per ridurlo ...

#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

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

Grande ma ... quasi vicino a C. Come al solito ci sono molti byte usati a causa del modo in cui Rust non si fonde automagicamente tra loro. Ma probabilmente c'è anche spazio per miglioramenti ... probabilmente potrebbero usare alcune idee di altre soluzioni.

la versione ungolf è sul Rust Playground online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.