술취한 주교


42

공개 키 암호화에서 공개 키 지문은 더 긴 공개 키를 식별하는 데 사용되는 짧은 바이트 시퀀스입니다.

특히 SSH에서는 서버가 실제로 통신하려는 서버이고 중간자 공격의 대상이 아닌 서버인지 확인하는 데 사용할 수 있습니다.

그들은 일반적으로 16 진수 문자열로 표시되므로 예상되는 지문과 비교하는 것이 지루하고 지루할 수 있습니다.

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 아트의 거친 모양을 기억하려고 시도하고 서버의 지문이 변경되고 이미지가 다르게 보일 때 (이론적으로) 인식합니다.

작동 원리

에서 촬영 더크 손실, 토비아스 LIMMER, 알렉산더 폰 Gernler. 술취한 주교 : 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 번 이상 셀을 방문하지 않을
Padarom

답변:


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]).

나는 모든 위치를 추적합니다. 이 위치 목록에 가능한 모든 위치 목록을 추가하고 정렬하고 길이를 인코딩합니다. 각 위치마다 번호를 제공합니다. 이 숫자를 사용하여 coorect 문자를 선택할 수 있으며 결국 시작 및 끝 위치의 문자를 덮어 씁니다.


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: 0으로 구성된 17x9 행렬을 만듭니다. F각 위치를 방문한 횟수를 나타냅니다.

  • ⍵⊂⍨':'≠⍵: 분할 :문자.

  • {... : 각 그룹마다 :
    • ¯1+⍵⍳⍨⎕D,'abcdef': 문자열에서 각 문자의 색인을 찾으십시오 '01234567890abcdef'. APL은 기본적으로 1- 인덱싱되므로 1을 뺍니다.
    • (4/2)⊤: 값을 4 비트 표현으로 변환합니다 (이제 2x4 행렬이 있어야 함).
    • ↓⊖4 2⍴⍉: 행렬을 회전하고 요소를 사용하여 2x4 행렬을 채우고 해당 행렬을 가로로 대칭 한 다음 각 선을 개별적으로 가져옵니다. 이것은 우리에게 필요한 4 개의 2 비트 값을 제공합니다.
  • ⊃,/: 결과 목록을 결합하여 2 비트 단계 목록을 제공합니다.
  • 5 9{... }: 단계 목록이 주어지고 위치 [9,5]에서 시작합니다.
    • (⍺⌷F)+←1:에서 현재 위치를 증가시킵니다 F.
    • ×⍴⍵:: 단계 목록이 비어 있지 않은 경우 :
      • ↑⍵: 목록에서 첫 번째 단계를 수행하십시오.
      • ⍺-1 1-2×: 해당 단계의 델타를 가져 와서 현재 위치에서 빼기
      • 1 1⌈9 17⌊: 필드 내로 움직임을 제한
      • (... )∇1↓⍵: 새로운 위치와 나머지 단계를 계속합니다
    • 이 경우, 이다 빈 :
      • (⍺⌷F)←16: F최종 위치에서 16으로 설정
      • F[5;9]←15: F시작 위치에서 15로 설정
      • ' .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'

이 답변은 혐오 스럽지만이 퍼즐의 첫 번째 답변이므로 지금 당장 할 것입니다.

-nSTDIN에 입력 줄을 채우고 채 웁니다 $_.

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

'매트릭스'기능을 한 번 'm'으로 정의하여 골프를 칠 수 있습니까? '기능'과 동일합니까?
CousinCocaine

'cat'함수에서 'sep ='가 필요하지 않다고 생각합니다
CousinCocaine

sep의 기본값은 공백이므로 재정의해야하지만 실제로 행렬의 별칭을 지정할 수 있습니다.
plannapus

또한 내가 아는 한 별칭을 사용할 수 없습니다 function.
plannapus

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

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

온라인으로 사용해보십시오.

Pyth는 반복 문제에 실제로 좋지 않습니다. CJam이 쉽게 이길 것으로 기대합니다.


3

자바 스크립트 (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

@Padarom 나는 국경이 요청되지 않았다고 생각하면서 "합리적"이라는 의견을 잘못 이해했습니다
edc65

사용하는 입력 및 출력 방법에 대해 합리적이었습니다. 사과가 잘못 되었다면 사과하겠습니다. 편집하겠습니다
Padarom

3

파이썬, 381 328

@JonathanFrech 덕분에 -51

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)

설명을 위해 약간 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)

이 엉망진창 :

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.
Jonathan Frech

또한에 불필요한 공간이 ] for있습니다.
Jonathan Frech

나는 fp해야 한다고 생각 합니다 f.
Jonathan Frech


2
왜 사용 ~16했습니까? 약간의 난독 화는 결코 골프를 해칠 수 없습니다!
Jonathan Frech

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

C-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에 가깝습니다. Rust가 자동으로 유형을 서로 캐스트하지 않는 방식으로 인해 많은 바이트가 사용됩니다. 그러나 아마도 개선의 여지가있을 것입니다. 아마도 다른 솔루션의 아이디어를 사용할 수도 있습니다.

ungolfed 버전은 온라인 Rust Playground에 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.