Bot vẽ bản đồ kho báu


14

Bạn đang tổ chức một cuộc săn tìm kho báu cho bạn bè của bạn. Để tiến hành mọi thứ dễ dàng hơn, bạn muốn vẽ bản đồ của tất cả các vị trí nơi bạn giấu các vật thể quý giá.

Đầu vào

Bất kỳ hình thức đầu vào nào biểu thị danh sách các điểm bao gồm (không âm) tọa độ x và y, 0 0là góc trên bên trái đều được phép (Lưu ý: Bạn cũng có thể sử dụng lập chỉ mục dựa trên 1 trong câu trả lời của mình, vui lòng nhận xét về điều đó nếu bạn làm ). Thí dụ:

1 2
3 0
0 1

Thử thách

Chức năng hoặc chương trình của bạn sẽ có thể tạo bản đồ biểu thị mọi vị trí đã cho với vị trí xtìm thấy dấu ở hàng y + 1 và cột x + 1 ở đầu ra. Vị trí không được đánh dấu được đại diện với a . Bản đồ cũng bao gồm một khung trong đó các góc là +s, các đường thẳng đứng là |s và các đường ngang là -s. Giải pháp của bạn sẽ xuất ra khung nhỏ nhất có thể. Bản đồ cho ví dụ đầu vào được đưa ra ở trên:

+----+
|   x|
|x   |
| x  |
+----+

Các trường hợp thử nghiệm có thể


"0 0"
=>
+-+
|x|
+-+

"0 10
 5 5
 10 0"
=>
+-----------+
|          x|
|           |
|           |
|           |
|           |
|     x     |
|           |
|           |
|           |
|           |
|x          |
+-----------+

""
=>
++
++

"0 0
 0 2
 2 0"
=>
+---+
|x x|
|   |
|x  |
+---+

Tất nhiên, đây là , nghĩa là giải pháp có số byte thấp nhất sẽ thắng! Giải thích về giải pháp của bạn được khuyến khích.


Không thực sự, nhưng tôi thực sự không thể nghĩ về một định dạng đầu vào khác. Nhưng tôi sẵn sàng thay đổi điều đó nếu nó mang lại lợi ích cho thử thách.
racer290

Có thể có bản đồ không vuông?
FrownyFrog

4
@ racer290 Tôi khuyên bạn chỉ nên nói điều gì đó nhưthe input is a list of locations (e.g. nested list, list of tuples, space & newline separated, separate inputs, ect.)
dzaima

1
Đầu ra có thể là một mảng 2d ký tự không?
trứng

2
Tôi có thể gửi một hàm lấy tọa độ x và y làm hai đối số riêng biệt không?
ბიმო

Câu trả lời:


7

J , 37 34 byte

0<@|:' x'{~((i.@]e.#.~)1+>./) ::#:

Hãy thử trực tuyến!

                       1+>./          maximum for each coordinate + 1
             i.@]                     make an array with these dimensions filled with 0..x*y
                                      /* if the input is empty, 
                                         1+>./ is negative infinity
                                         and i.@] throws an error  */
                   #.~                mixed base conversion of input
                 e.                   replace the elements of i.@]
                                        with 1 if it's present in the
                                        converted input, 0 otherwise
           (                ) ::      if there's an error do the other thing instead
                                #:    "to binary", for empty input this returns a 0x0 matrix
0<@|:' x'{~                           index into character string, transpose and put in a box

1
Tôi đoán rằng định dạng đầu ra tốt hơn định dạng tôi đề xuất;)
racer290

Tại sao lại ::emptydài dòng như vậy? Nó làm gì Tại sao nó không thể được đơn giản hóa thành 1 byte hoặc hơn? (Tôi không có kiến ​​thức về J)
Bạch tuộc ma thuật Urn

Tôi đã chạy nó trên TIO mà không có :: trống và nó dường như hoạt động (cũng không biết J)
Quintec

Trên thực tế :: dường như trống để xử lý trường hợp đầu vào của
Điên

@MagicOctopusUrn Tôi không biết một cách ngắn hơn để xuất ra một hộp thực sự trống, chúng cao 1 hàng theo mặc định.
FrownyFrog

4

JavaScript (ES6), 150 byte

Đưa đầu vào dưới dạng danh sách tọa độ 1 chỉ mục theo [x,y]định dạng. Trả về một chuỗi.

a=>(g=w=>y<h?' |-+x'[4*a.some(a=>a+''==[x,y])|2*(-~y%h<2)|++x%w<2]+[`
`[x=x<w?x:+!++y]]+g(w):'')((M=i=>Math.max(2,...a.map(a=>a[i]+2)))(x=y=0),h=M(1))

Hãy thử trực tuyến!


4

Haskell , 127 123 byte

Điều này xác định toán tử (!)lấy danh sách x -ordord và danh sách các y -ordord tương ứng :

x!y|l<-'+':('-'<$m x)++"+"=unlines$l:['|':[last$' ':['x'|(i,j)`elem`zip x y]|i<-m x]++"|"|j<-m y]++[l];m x=[1..maximum$0:x]

Hãy thử trực tuyến!

Ungolfed / Giải thích

Hàm trợ giúp mmong đợi một danh sách và trả về các chỉ số (dựa trên 1) tối đa, nếu danh sách trống, nó trả về []:

m x | null x    = []
    | otherwise = [1 .. maximum x]

Toán tử thực tế (!)chỉ là một sự hiểu biết danh sách, đi qua tất cả các tọa độ và chọn một hoặc xký tự, được nối với các dòng mới:

x ! y
  -- construct the top and bottom line
  | l <- "+" ++ replicate (maximum (0:x)) '-' ++ "+"
  -- join the list-comprehension with new-lines
  = unlines $ 
  -- prepend the top line
      [l]
  -- the actual map:
    -- begin the line with | and add the correct chars for each coordinate
      ++ [ "|" ++ [ if (i,j) `elem` zip x y then 'x' else ' '
    -- "loop" over all x-coordinates
                 | i <- m x
                 ]
    -- end the line with a |
           ++ "|"
    -- "loop" over all y-coordinates
         | j <- m y
         ]
  -- append the bottom line
      ++ [l]

3

Canvas , 22 byte

ø╶{X;┤╋}l|*eL┤-×+e:└∔∔

Hãy thử nó ở đây!

Có 1 đầu vào được lập chỉ mục.

Cuối cùng đã quyết định sửa một lỗi gây khó chịu cho tôi từ lâu và đã khắc phục lỗi này xuống còn 21 byte .

Giải thích (nửa-ASCII-fied cho monospace):

ø╶{X;┤╋}l|*eL┤-×+e:└++  full program, implicitly outputting ToS at the end
ø                       push an empty Canvas - the map
 ╶{    }                for each array in the input array
   X                      push "X"
    ;┤                    and push the two coordinates separately on the stack
      ╋                   and overlap the "X" there in the map
        l               get the vertical length of the map
         |*             repeat "|" vertically that many times
           e            encase the map in two of those vertical bars
            L           get the horizontal length of the map
             ┤          subtract 2 (leave place for the "+"es)
              -×        repeat "-" that many times
                +e      encase that line in "+"es
                  :└    push a copy of that below the map
                    ++  and join the 3 items vertically

3

Python 2 , 151 140 138 byte

-2 byte nhờ Jo King.

Đầu vào là 1 chỉ mục.

m=input()
w,h=map(max,zip((0,0),*m))
b=['+'+'-'*w+'+']
M=b+['|'+' '*w+'|']*h+b
for x,y in m:M[y]=M[y][:x]+'x'+M[y][x+1:]
print'\n'.join(M)

Hãy thử trực tuyến!


Tôi nghi ngờ rằng bạn đang sử dụng lập chỉ mục dựa trên 1, vui lòng để lại ghi chú trong câu trả lời của bạn như đã nêu trong thử thách.
racer290

2

Than , 37 byte

≔E²⁺²⌈Eθ§λιηB⊟⮌η⊟ηFθ«J⊟⮌ι⊟ιx

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. 1 chỉ mục. Giải trình:

¿¬LθUR²+«

Trường hợp đặc biệt đầu vào trống bằng cách vẽ một hình chữ nhật 2x2 của +s.

≔E²⁺²⌈Eθ§λιη

Chuyển đổi đầu vào, lấy tối đa của mỗi cột (bây giờ là hàng) và thêm 2 để có kích thước hộp trong tọa độ Than.

B⊟⮌η⊟η

Vẽ hộp.

Fθ«

Lặp lại trên mỗi phối hợp.

J⊟⮌ι⊟ι

Nhảy đến vị trí của nó.

x

Đánh dấu bằng một chữ thập.


Có vẻ thất bại cho đầu vào trống: tio.run/ từ
Wastel

@wastl Cảm ơn, tôi đã đưa ra một cách giải quyết.
Neil

2

Stax , 32 31 24 byte

╩╠ee%╙æM■↓^⌐╧ΩΓ¡c¥èf¢○ [

Chạy và gỡ lỗi nó

Lấy các chỉ số dựa trên 0 làm mảng của [y, x] cặp.

Giải trình:

zs'X&|<cM%'-*'+|S]s{'||Smn++m Unpacked program, implicit input
zs                            Tuck empty array under input
  'X                          Push "X"
    &                         Assign element at all indices (create map)
                                As the indexing arrays are an array of arrays, treat them as a path to navigate a multidimensional array.
                                Extend array if needed.
     |<                       Left-align all to the length of the longest.
       cM%                    Copy, transpose, length (width)
          '-*                 Repeat "-"
             '+|S             Surround with "+"
                 ]s           Make a singleton and tuck it below the map
                   {    m     Map:
                    '||S        Surround with "|"
                         n++  Surround with the above/below border (built above)
                            m Map:
                                Implicit output

1
Làm rất tốt Bạn có thể nhận được một ít dặm hơn từ |Shướng dẫn xung quanh và bản đồ tốc ký kéo dài. ( m) Surround lấy abtừ ngăn xếp và sản xuất b+a+b. Và bạn có thể sử dụng mthay vì cuối cùng |Jđể lặp qua các hàng và tạo đầu ra. Ví dụ
đệ quy

1
Một điều nữa: bạn có thể thay thế z]n+H%bằng cM%. Đây là mảnh có chiều rộng bản đồ, nhưng có trường hợp đặc biệt cho bản đồ trống. Nếu bạn hoán chuyển bản đồ trước khi đo nó, trường hợp đặc biệt sẽ biến mất.
đệ quy

@recursive Tôi đã tìm kiếm một cái gì đó như vòm, nhưng tôi đã tìm kiếm các từ khóa sai
lãng phí

Những gì bạn sẽ tự nhiên gọi hoạt động đó? Tôi có thể thêm nó vào tài liệu để người tiếp theo có thể tìm thấy nó.
đệ quy

@recursive Tôi không nhớ nó là gì và tôi sẽ tự nhiên gọi nó là bao quanh ngay bây giờ
lãng phí

2

R , 133 125 122 byte

function(m)cat(z<-c("+",rep("-",u<-max(m[,1])),"+","
"),rbind("|",`[<-`(matrix(" ",u,max(m[,2])),m,"x"),"|","
"),z,sep="")

Hãy thử trực tuyến!

1 chỉ mục. Lấy một ma trận làm đối số. Đã lưu 8 byte nhờ digEmAll, 3 nhờ Giuseppe! Giải thích (phiên bản trước của mã):

function(m){                           #x and y are the 1st and 2nd col of m
s=matrix(32,u<-max(m[,1]),max(m[,2]))  #s (treasure map) has dim max(x), max(y) 
s[m]=120                               #place the X's on the map
cat(                                   #print:
    z<-c("+",rep("-",u),"+","\n"),     #the top line
    intToUtf8(rbind(124,s,124,13)),    #the map
    z,                                 #the bottom line.
    sep="")
}

Nếu bạn sử dụng ký tự bình thường thay vì mã utf8 giúp bạn tiết kiệm 8 ký tự: tio.run/##ZU7NDoIwDL7zFEu9tKEzDONF4UkMhzmGchgYNhKC@uwIaozRpG36/...
digEmAll

122 byte bằng cách sử dụng [<-trực tiếp để loại bỏ các dấu ngoặc nhọn.
Giuseppe

@Giuseppe thật! Tôi biết phải có một cách.
JayCe

1

coords lấy định dạng [y, x]

JavaScript (Node.js) , 191 184 byte

c=f=a=>{a.map(([y,x])=>(c[M<++y?M=y:y]=c[y]||[])[m<++x?m=x:x]="x",M=m=0)
m++
M++
s=""
for(i=0;i<=M;s+=`
`,i++)for(j=0;j<=m;j++)s+=(c[i]||0)[j]||(j%m?i%M?" ":"-":i%M?"|":"+") 
return s}

Hãy thử trực tuyến!


Tôi nghĩ rằng bạn đã vô tình hoán đổi tọa độ x và y ở đâu đó ..
racer290

@ racer290 bạn có thể cụ thể hơn?
DanielIndie

Thử giải pháp của bạn, tôi thấy rằng việc thay đổi tọa độ x trong các trường hợp thử nghiệm đã dẫn đến thay đổi hướng dọc của tọa độ. Tôi đoán lỗi nằm ở hàng đầu tiên ( a.map(([y,x]))
racer290

nhưng x là thông số đúng có thể được nhìn thấy bởi các trường hợp thử nghiệm
DanielIndie

2
Vì vậy, trong giải pháp của bạn, bạn có tọa độ y đầu tiên? Tôi nghĩ sẽ tốt hơn nếu để lại một ghi chú trong câu trả lời của bạn.
racer290

1

JavaScript, 180 byte

F = 

s=>s.map(([x,y])=>(t[y]=t[Y<y?Y=y:y]||[])[X<x?X=x:x]='x',t=[X=Y=0])&&[...t,0].map((_,y)=>[...Array(X+2)].map((_,x)=>[(t[y]||0)[x]||' ',...'-|+'][!(y%~Y)+2*!(x%~X)]).join``).join`
`


console.log(F([[1,11],[6,6],[11,1]]))


1

Java 10, 238 223 byte

c->{var r="";int w=0,h=0,x,y;for(var l:c){w=(x=l.get(0))>w?x:w;h=(y=l.get(1))>h?y:h;}for(w++,h++,x=-1;++x<=w;r+="\n")for(y=-1;++y<=h;)r+=x%w+y%h<1?"+":x%w<1?"-":y%h<1?"|":(c+"").contains("["+x+", "+y+"]")?"x":" ";return r;}

Tọa độ 1 chỉ số.

Hãy thử trực tuyến.

Giải trình:

c->{                      // Method with 2D Lists as parameter and String return-type
  var r="";               //  Result-String, starting empty
  int w=0,h=0,            //  Width and height, starting at 0
      x,y;                //  Temp x,y coordinates
  for(var l:c){           //  Loop over the Inner Lists containing the coordinates
    w=(x=l.get(0))>w?x:w; //   Determine width based on max x-coordinate
    h=(y=l.get(1))>h?y:h;}//   Determine height based on max y-coordinate
  for(w++,h++,            //  Increase both the width and height by 1
      x=-1;++x<=w;        //  Loop `x` in the range [0, width]
      r+="\n")            //    After every iteration: append a new-line to the result
    for(y=-1;++y<=h;)     //   Inner loop `y` in the range [0, height]
      r+=                 //    Append the following character to the result-String:
        x%w+y%h<1?        //    If it's one of the corners:
          "+"             //     Append "+"
        :x%w<1?           //    Else-if it's the top or bottom row:
          "-"             //     Append "-"
        :y%h<1?           //    Else-if it's the right or left column:
          "|"             //     Append "|"
        :(c+"").contains("["+x+", "+y+"]")? 
                          //    Else-if the current `x,y` is part of the input-coordinates
          "x"             //     Append "x"
        :                 //    Else:
          " ";            //     Append " "
  return r;}              //  Return the result-String

rwhxy; lcwxlgetw? xw; hylgeth? yh; forwhxxwr. foryyhrxwyh? xwyhcxy? xr.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn Bạn đặt tên cho tất cả các biến và get/ forcho là gì? : S XD
Kevin Cruijssen

1

C (gcc) , 246 234 byte

Cảm ơn trần nhà cho lời đề nghị.

Không có chỉ mục. Hàm lấy danh sách tọa độ và bộ đệm, tìm giá trị x và y tối đa, lấp đầy bộ đệm bằng khoảng trắng, tạo khung và sau đó vẽ đồ thị của 'x'.

f(int*a,char*c){int*b=a,x,y=x=-1,i=0;for(;~*b;*++b>y?y=*b:0,++b)*b>x?x=*b:0;for(x+=4,y+=3,memset(c,32,x*y);++i<x;c[i]=c[y*x-i]=45);for(i=0;i<y;c[x*++i-1]=10*(i<=y))c[x*i]=c[x*i+x-2]=i&&y/i?124:43;for(b=a;~*b;b+=2)c[*b+1-~b[1]*x]='x';}

Hãy thử trực tuyến!


sửa lỗi ở hàng dưới cùng 235 byte
trần nhà

1

05AB1E , 44 42 byte

ζεZ}>`UX'-×'+.ø©,F'|NVXF¹YN‚.å„ xè}'|J,}®,

Hãy thử trực tuyến!


 ζεZ}>`                                     # Push the max of X and Y to the stack +1.
       UX                                   # Store the max X.
         '-×'+.ø©,                          # Print the top border.
                  F                     }   # From 0 to Y...
                   '|                       # Push left border.
                     NV                     # Store current Y in Y.
                       XF          }        # From 0 to X...
                         ¹                  # Push input.
                          YN‚               # Group current X and Y.
                             .å             # Exists in original input ? 1 : 0
                               „ xè         # Exists ? 'X' : ' '
                                    '|J,    # Right border, join, print.
                                         ®, # Print bottom border.

X và Y có thể bị đảo ngược, không biết điều đó có quan trọng không.


Tôi nghĩ rằng tôi có cái này trong ít byte hơn, nhưng chúng ta sẽ thấy ... Không.

ζεZ}>`D'-×'+.øUð×'|.øs.D)X.ø©svy>`s®sUXès'xsǝXǝ}

1
Nó không nhiều, nhưng bạn có thể tiết kiệm 1 byte bằng cách thay đổi cái đầu tiên Fthành Lv, loại bỏ NVvà thay đổi Ythành y. 41 byte
Kevin Cruijssen

1
Như @Emigna đã đề cập trong cuộc trò chuyện , εZ}có thể €à.
Kevin Cruijssen

Ghét chỉnh sửa này trên điện thoại di động sẽ đợi cho đến khi gần pc.
Bạch tuộc ma thuật Urn

1
@KevinCruijssen thì Ývkhông Lv, nhưng vẫn là một bản chỉnh sửa tốt :).
Bạch tuộc ma thuật Urn

À, bạn nói đúng. Ývthay vì Lv. Lỗi của tôi.
Kevin Cruijssen

0

C (gcc) , 229 220 216 byte

-9 byte nhờ vào trần nhà .

Không có chỉ mục. Lấy tọa độ là danh sách các số, trong đó số chẵn là X và số lẻ là Y.

X,Y,i,j,k,x,z;f(l,n)int*l;{for(X=Y=0,i=n*=2;i--;X=fmax(l[i],X))Y=fmax(l[i--],Y);n&&X++-Y++;for(--i;i++<Y;puts(""))for(j=-1;j<=X;z=i<0|i==Y,putchar(j++<0|j>X?z?43:'|':x?z?45:32:'x'))for(x=k=n;k--;)x*=l[k--]-i|l[k]-j;}

Hãy thử trực tuyến!


@ceilingcat Chúc mừng!
dạ dày 19/10/18

Đề xuất for(n&&X++-Y++;i<=Y;i+=puts(""))thay vìn&&X++-Y++;for(--i;i++<Y;puts(""))
trần mèo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.