บิชอปเมา


42

ในการเข้ารหัสคีย์สาธารณะลายนิ้วมือกุญแจสาธารณะนั้นเป็นลำดับไบต์สั้น ๆ ที่ใช้เพื่อระบุคีย์สาธารณะที่ยาวขึ้น

โดยเฉพาะใน SSH พวกเขาสามารถใช้เพื่อตรวจสอบว่าเซิร์ฟเวอร์เป็นเซิร์ฟเวอร์ที่ฉันคาดหวังว่าจะสื่อสารด้วยและฉันไม่ได้ตกเป็นเป้าหมายของการโจมตีจากคนกลาง

พวกเขามักจะแสดงเป็นสตริงของตัวเลขฐานสิบหกดังนั้นจึงค่อนข้างน่าเบื่อและน่าเบื่อเมื่อเปรียบเทียบกับลายนิ้วมือที่ฉันคาดหวัง:

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 art และจากนั้น (ในทางทฤษฎี) จะจดจำเมื่อลายนิ้วมือของเซิร์ฟเวอร์เปลี่ยนไปและภาพจะดูแตกต่างกัน

มันทำงานอย่างไร

นำมาจากDirk Loss, Tobias Limmer, Alexander von Gernler 2009 บิชอปเมา: การวิเคราะห์ OpenSSH ขั้นตอนวิธีการสร้างภาพลายนิ้วมือ

ตารางมีความกว้าง 17 ตัวอักษรและความสูง 9 ตัว "อธิการ" เริ่มต้นที่แถว 4 / คอลัมน์ 8 (ตรงกลาง) แต่ละตำแหน่งสามารถแสดงเป็น [x, y], [8,4] สำหรับตำแหน่งเริ่มต้นของอธิการ

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

อธิการใช้ลายนิ้วมือเพื่อเลื่อนดู มันอ่านมัน byte-wise จากซ้ายไปขวาและจากบิตที่สำคัญน้อยที่สุดไปยังบิตที่สำคัญที่สุด:

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 art art ดังแสดงในตัวอย่าง

ตัวอย่าง

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 ครั้ง?
Martin Ender

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

ฉันติดตามทุกตำแหน่ง ในรายการของตำแหน่งนี้ฉันเพิ่มรายการของตำแหน่งที่เป็นไปได้ทั้งหมดเรียงลำดับและเข้ารหัสความยาวรัน ซึ่งทำให้ฉันมีจำนวนสำหรับแต่ละตำแหน่ง ด้วยหมายเลขนี้ฉันสามารถเลือกถ่านของแขกและท้ายที่สุดจะเขียนทับตัวอักษรของตำแหน่งเริ่มต้นและตำแหน่งสุดท้าย


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

นี่คือฟังก์ชันที่รับสตริงเป็นอาร์กิวเมนต์ที่ถูกต้องและส่งกลับเมทริกซ์อักขระที่มีการแทนค่า ASCII art เช่น:

      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: สร้างเมทริกซ์ 17-9 ของศูนย์ Fแสดงจำนวนครั้งที่มีการเยี่ยมชมแต่ละตำแหน่ง

  • ⍵⊂⍨':'≠⍵: แยกใน:ตัวละคร

  • {... : สำหรับแต่ละกลุ่ม:
    • ¯1+⍵⍳⍨⎕D,'abcdef': '01234567890abcdef'พบว่าดัชนีของตัวละครแต่ละตัวในสตริง ลบ 1 เนื่องจาก APL ได้รับการจัดทำดัชนี 1 ตามค่าเริ่มต้น
    • (4/2)⊤: แปลงค่าเป็นการแทนค่าแบบ 4 บิต (ตอนนี้ควรจะเป็นเมทริกซ์ขนาด 2 คูณ 4)
    • ↓⊖4 2⍴⍉: หมุนเมทริกซ์ใช้องค์ประกอบเพื่อเติมเมทริกซ์ขนาด 2 คูณ 4 แทนมิเรอร์นั้นในแนวนอนแล้วแยกแต่ละบรรทัดออกจากกัน สิ่งนี้ทำให้เรามีค่า 4 บิตที่เราต้องการ
  • ⊃,/: เข้าร่วมรายการผลลัพธ์พร้อมกันโดยระบุรายการขั้นตอน 2 บิต
  • 5 9{... }: ให้รายการของขั้นตอนและเริ่มต้นที่ตำแหน่ง [9,5]:
    • (⍺⌷F)+←1: เพิ่มตำแหน่งปัจจุบันFเป็น
    • ×⍴⍵:: หากรายการขั้นตอนไม่ว่างเปล่า:
      • ↑⍵: ทำตามขั้นตอนแรกจากรายการ
      • ⍺-1 1-2×: รับ delta สำหรับขั้นตอนนั้นและลบออกจากตำแหน่งปัจจุบัน
      • 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'

คำตอบนี้น่าขยะแขยง แต่ก็เป็นปริศนาแรกสำหรับปริศนานี้ดังนั้นมันจะทำเพื่อตอนนี้

-nที่จะใช้เส้นของการป้อนข้อมูลบน STDIN $_และปฏิบัติ

# 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

ฉันคิดว่าคุณไม่ต้องการ 'sep =' ในฟังก์ชั่น 'cat'
CousinCocaine

ค่าเริ่มต้นสำหรับ sep คือช่องว่างดังนั้นฉันต้องแทนที่มัน แต่แน่นอนว่าฉันสามารถใช้นามแฝงเมทริกซ์ได้
plannapus

Additionnaly 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

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


รหัส golfed ของคุณเองควรจะสามารถพิมพ์เส้นขอบได้เช่นกัน ปัจจุบันเฉพาะกรณีทดสอบของคุณพิมพ์ขอบบนและล่างในforEach, เส้นขอบแนวตั้งยังคงหายไป
Padarom

@ Padarom ฉันเข้าใจผิดความคิดเห็น "มีเหตุผล" ของคุณโดยคิดว่าไม่ได้มีการร้องขอชายแดน
edc65

ฉันหมายถึงสมเหตุสมผลว่าวิธีการอินพุตและเอาต์พุตที่คุณใช้ ฉันขอโทษถ้านั่นทำให้เข้าใจผิดฉันจะแก้ไขมันออกมา
Padarom

3

Python, 381 328

-51 ขอบคุณ @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)

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

330 ไบต์
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 อยู่ในสนามเด็กเล่นสนิมออนไลน์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.