Treasure Map Drawing Bot

14

Anda mengatur perburuan harta untuk teman-teman Anda. Untuk melakukan sesuatu dengan lebih mudah, Anda ingin menggambar peta dari semua lokasi di mana Anda menyembunyikan benda-benda berharga.

Memasukkan

Setiap bentuk input yang menunjukkan daftar poin yang terdiri dari (nonnegatif) koordinat x dan y, 0 0karena sudut kiri atas diizinkan (Catatan: Anda juga dapat menggunakan pengindeksan berbasis 1 dalam jawaban Anda, silakan komentari jika Anda melakukannya. ). Contoh:

1 2
3 0
0 1

Tantangan

Fungsi atau program Anda harus dapat membuat peta yang menunjukkan setiap lokasi tertentu dengan xtanda di mana ditemukan di baris y + 1 dan kolom x +1 pada output. Lokasi yang tidak ditandai diwakili dengan a . Peta juga terdiri dari bingkai di mana sudut +s, garis vertikal |s dan garis horizontal -s. Solusi Anda harus menampilkan kerangka sekecil mungkin. Peta untuk contoh input yang diberikan di atas:

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

Kemungkinan Kasus Uji


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

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

""
=>
++
++

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

Tentu saja, ini adalah , yang berarti bahwa solusi dengan jumlah byte terendah menang! Penjelasan tentang solusi Anda dianjurkan.

racer290
sumber
Tidak juga, tetapi saya tidak bisa memikirkan format input lain. Tapi saya bersedia mengubahnya jika itu menguntungkan tantangan.
racer290
Bisakah ada peta yang tidak berbentuk bujur sangkar?
FrownyFrog
4
@ racer290 Saya sarankan hanya mengatakan sesuatu sepertithe input is a list of locations (e.g. nested list, list of tuples, space & newline separated, separate inputs, ect.)
dzaima
1
Bisakah output menjadi array karakter 2d?
Ovs
2
Bisakah saya mengirimkan fungsi dengan mengambil koordinat x dan y sebagai dua argumen terpisah?
ბიმო

Jawaban:

7

J , 37 34 byte

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

Cobalah online!

                       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
FrownyFrog
sumber
1
Saya kira format output lebih baik daripada yang saya usulkan;)
racer290
Mengapa ::emptybegitu bertele-tele? Apa yang dilakukannya? Mengapa tidak bisa disederhanakan menjadi 1 byte atau lebih? (Saya tidak memiliki pengetahuan tentang J)
Magic Octopus Mm
Saya menjalankannya di TIO tanpa :: kosong dan sepertinya berhasil (tidak tahu J juga)
Quintec
Sebenarnya :: kosong sepertinya menangani "" input case
Quintec
@ MagicOctopusUrn Saya tidak tahu cara yang lebih pendek untuk menampilkan kotak yang benar-benar kosong, mereka 1 baris tinggi secara default.
FrownyFrog
4

JavaScript (ES6), 150 byte

Mengambil input sebagai daftar koordinat 1-indeks dalam [x,y]format. Mengembalikan string.

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

Cobalah online!

Arnauld
sumber
4

Haskell , 127 123 byte

Ini mendefinisikan operator (!)yang mengambil daftar x- koordinat dan daftar y- koordinat yang sesuai :

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]

Cobalah online!

Tidak Terikat / Penjelasan

Fungsi helper mmengharapkan daftar dan mengembalikan indeks (berbasis 1) hingga maksimum, jika daftar kosong itu kembali []:

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

Operator yang sebenarnya (!)hanyalah pemahaman daftar, melintasi semua koordinat dan memilih karakter atau x, yang digabungkan dengan baris baru:

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]
ბიმო
sumber
3

Kanvas , 22 byte

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

Coba di sini!

Mengambil input yang diindeks 1.

Akhirnya memutuskan untuk memperbaiki bug yang telah mengganggu saya sejak lama dan menurunkannya hingga 21 byte .

Penjelasan (setengah ASCII untuk 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
dzaima
sumber
3

Python 2 , 151 140 138 byte

-2 byte terima kasih kepada Jo King.

Input diindeks 1.

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)

Cobalah online!

ovs
sumber
Saya menduga bahwa Anda menggunakan pengindeksan berbasis 1, silakan tinggalkan catatan di jawaban Anda sebagaimana dinyatakan dalam tantangan.
racer290
2

Arang , 37 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. 1-diindeks. Penjelasan:

¿¬LθUR²+«

Input kasus khusus kosong dengan menggambar kotak 2x2 +s.

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

Transposkan input, ambil maksimum setiap kolom (sekarang baris) dan tambahkan 2 untuk mendapatkan ukuran kotak dalam koordinat Charcoal.

B⊟⮌η⊟η

Gambar kotaknya.

Fθ«

Simpulkan setiap koordinasi.

J⊟⮌ι⊟ι

Lompat ke posisinya.

x

Tandai dengan sebuah salib.

Neil
sumber
Tampaknya gagal untuk input kosong: tio.run/…
wastl
@Wastl Terima kasih, saya telah menemukan solusi.
Neil
2

Stax , 32 31 24 byte

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

Jalankan dan debug itu

Mengambil indeks berbasis 0 sebagai array [y, x]pasangan.

Penjelasan:

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
wastl
sumber
1
Bagus sekali. Anda bisa mendapatkan jarak tempuh yang lebih sedikit dari |Sinstruksi surround, dan peta steno singkatan. ( m) Surround mengambil adan bdari stack dan menghasilkan b+a+b. Dan Anda bisa menggunakan mbukan final |Juntuk beralih pada baris dan menghasilkan output. Misalnya
rekursif
1
Satu hal lagi: Anda bisa menggantinya z]n+H%dengan cM%. Ini adalah bagian yang mendapatkan lebar peta, tetapi memiliki kasus khusus untuk peta kosong. Jika Anda mengubah urutan peta sebelum mengukurnya, kasing khusus hilang.
rekursif
@recursive Saya telah mencari sesuatu seperti surround, tapi saya mencari kata kunci yang salah
wastl
Apa yang Anda sebut operasi itu secara alami? Saya dapat menambahkannya ke dokumen sehingga orang berikutnya dapat menemukannya.
rekursif
@recursive Saya tidak ingat apa itu, dan saya akan secara alami menyebutnya surround sekarang
wastl
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="")

Cobalah online!

1-diindeks. Mengambil matriks sebagai argumen. Disimpan 8 byte berkat digEmAll, 3 berkat Giuseppe! Penjelasan (versi kode sebelumnya):

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="")
}
JayCe
sumber
Jika Anda menggunakan karakter normal alih-alih kode utf8, Anda menyimpan 8 karakter: tio.run/##ZU7NDoIwDL7zFEu9tKEzDONF4UkMhzmGchgYNhKC@uwIaozRpG36/…
digEmAll
122 byte dengan menggunakan [<-langsung untuk menghapus kawat gigi.
Giuseppe
@Giuseppe memang! Saya tahu pasti ada jalan.
JayCe
1

coords diambil dari format [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}

Cobalah online!

DanielIndie
sumber
Saya pikir Anda tidak sengaja menukar koordinat x dan y di suatu tempat ..
racer290
@ racer290 dapatkah Anda lebih spesifik?
DanielIndie
Mencoba solusi Anda, saya menemukan bahwa mengubah koordinat x dalam kasus uji menyebabkan perubahan arah vertikal koordinat. Saya kira bug ada di baris pertama ( a.map(([y,x]))
racer290
tetapi x adalah parameter yang tepat seperti yang dapat dilihat oleh kasus uji
DanielIndie
2
Jadi dalam solusi Anda, Anda mengambil koordinat y pertama? Saya pikir akan lebih baik untuk meninggalkan catatan pada jawaban Anda kalau begitu.
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]]))

l4m2
sumber
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;}

Koordinat 1-indeks.

Cobalah online.

Penjelasan:

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
Kevin Cruijssen
sumber
rwhxy; lcwxlgetw? xw; hylgeth? yh; forwhxxwr. foryyhrxwyh? xwyhcxy? xr.
Magic Octopus Mm
@ MagicOctopusUrn Apa yang Anda beri nama semua variabel dan get/ foruntuk? : S XD
Kevin Cruijssen
1

C (gcc) , 246 234 byte

Terima kasih kepada ceilingcat untuk sarannya.

Diindeks nol. Fungsi mengambil daftar koordinat dan buffer, menemukan nilai x dan y maksimum, mengisi buffer dengan spasi, menghasilkan frame, dan kemudian memplot 'x's.

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';}

Cobalah online!

ErikF
sumber
memperbaiki bug di baris bawah 235 byte
ceilingcat
1

05AB1E , 44 42 byte

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

Cobalah online!


 ζε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 dan Y dapat dibalik, tidak tahu apakah itu penting.


Saya pikir saya memiliki ini dalam lebih sedikit byte, tetapi kita akan melihat ... Tidak.

ζεZ}>`D'-×'+.øUð×'|.øs.D)X.ø©svy>`s®sUXès'xsǝXǝ}
Guci Gurita Ajaib
sumber
1
Tidak banyak, tetapi Anda dapat menyimpan 1 byte dengan mengubah dulu Fke Lv, hapus, NVdan ubah Yke y. 41 byte
Kevin Cruijssen
1
Seperti yang disebutkan oleh @Emigna dalam obrolan , εZ}bisa jadi €à.
Kevin Cruijssen
Benci pengeditan ini di ponsel akan menunggu hingga dekat pc.
Magic Gurita Guci
1
@KevinCruijssen Ývtidak Lv, tapi masih hasil edit yang bagus :).
Guci Gurita Ajaib
Ah kamu benar Ývbukannya Lv. Salahku.
Kevin Cruijssen
0

C (gcc) , 229 220 216 byte

-9 byte berkat ceilingcat .

Diindeks nol. Mengambil koordinat sebagai daftar angka, di mana angka genap adalah X dan angka ganjil adalah 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;}

Cobalah online!

gastropner
sumber
@ceilingcat Ceria!
gastropner
Sarankan for(n&&X++-Y++;i<=Y;i+=puts(""))alih-alihn&&X++-Y++;for(--i;i++<Y;puts(""))
ceilingcat