บอทวาดแผนที่ขุมทรัพย์


14

คุณกำลังจัดล่าขุมทรัพย์ให้เพื่อนของคุณ ในการดำเนินการต่างๆได้ง่ายขึ้นคุณต้องการวาดแผนที่ของทุกสถานที่ที่คุณซ่อนวัตถุมีค่า

อินพุต

รูปแบบการป้อนข้อมูลใด ๆ ที่แสดงรายการของจุดที่ประกอบด้วย (ไม่ใช่เชิงลบ) x- และพิกัด y ซึ่ง0 0เป็นมุมบนซ้ายที่ได้รับอนุญาต (หมายเหตุ: คุณอาจใช้การจัดทำดัชนีแบบอิง 1 ข้อในคำตอบของคุณโปรดแสดงความคิดเห็นว่า ) ตัวอย่าง:

1 2
3 0
0 1

ท้าทาย

ฟังก์ชั่นหรือโปรแกรมของคุณควรจะสามารถสร้างแผนที่แสดงตำแหน่งทุกตำแหน่งxที่มีเครื่องหมายที่พบในแถว y + 1 และคอลัมน์ x + 1 ในผลลัพธ์ สถานที่ป้ายจะแสดงด้วย แผนที่ยังประกอบด้วยกรอบที่มุมเป็น+s เส้นแนวตั้งคือ|s และเส้นแนวนอนเป็น-s โซลูชันของคุณควรแสดงเฟรมที่เล็กที่สุดเท่าที่จะเป็นไปได้ แผนที่สำหรับตัวอย่างอินพุตที่ระบุด้านบน:

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

กรณีทดสอบที่เป็นไปได้


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

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

""
=>
++
++

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

แน่นอนว่านี่คือซึ่งหมายความว่าทางออกที่มีจำนวนไบต์ต่ำสุดชนะ! คำอธิบายของการแก้ปัญหาของคุณได้รับการสนับสนุน


ไม่จริง แต่ฉันไม่สามารถคิดถึงรูปแบบอินพุตอื่นได้ แต่ฉันยินดีที่จะเปลี่ยนแปลงว่าถ้ามันเป็นประโยชน์ต่อความท้าทาย
racer290

สามารถมีแผนที่ที่ไม่ใช่สี่เหลี่ยมได้หรือไม่?
FrownyFrog

4
@ racer290 ฉันขอแนะนำให้พูดบางอย่างเช่นthe input is a list of locations (e.g. nested list, list of tuples, space & newline separated, separate inputs, ect.)
dzaima

1
เอาต์พุตสามารถเป็นอักขระ 2d ได้หรือไม่?
OVS

2
ฉันสามารถส่งฟังก์ชั่นที่ใช้พิกัด x และ y- เป็นข้อโต้แย้งแยกกันสองข้อได้หรือไม่?
ბიმო

คำตอบ:


7

J , 37 34 ไบต์

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

ลองออนไลน์!

                       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
ฉันเดาว่าการจัดรูปแบบผลลัพธ์ดีกว่าที่ฉันเสนอ;)
racer290

ทำไม::emptyverbose ดังนั้น? มันทำอะไร เหตุใดจึงไม่สามารถทำให้ง่ายขึ้น 1 ไบต์หรือมากกว่านั้น (ฉันไม่มีความรู้เกี่ยวกับ J)
Magic Octopus Urn

ฉันวิ่งบน TIO โดยไม่ต้อง :: ว่างเปล่าและดูเหมือนว่าจะทำงาน (ไม่รู้ว่า J เหมือนกัน)
Quintec

จริงๆแล้ว :: empty ดูเหมือนว่าจะจัดการกับ "input case"
Quintec

@MagicOctopusUrn ฉันไม่ทราบวิธีที่สั้นกว่าในการแสดงผลช่องว่างเปล่าอย่างแท้จริงพวกเขาจะสูง 1 แถวโดยค่าเริ่มต้น
FrownyFrog

4

JavaScript (ES6) 150 ไบต์

รับอินพุตเป็นรายการของพิกัด 1 ดัชนีใน[x,y]รูปแบบ ส่งคืนสตริง

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

ลองออนไลน์!


4

Haskell , 127 123 ไบต์

สิ่งนี้นิยามโอเปอเรเตอร์(!)ที่รับรายการของx -coordinates และรายการที่เกี่ยวข้อง y -coordinates ที่เกี่ยวข้อง:

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]

ลองออนไลน์!

Ungolfed / คำอธิบาย

ฟังก์ชั่นตัวช่วยmจะคาดหวังรายการและส่งกลับดัชนี (อิง 1) ถึงค่าสูงสุดหากรายการว่างเปล่าฟังก์ชันจะส่งคืน[]:

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

ผู้ประกอบการที่เกิดขึ้นจริง(!)เป็นเพียงความเข้าใจในรายการการข้ามพิกัดทั้งหมดและการเลือกหรือxตัวละครซึ่งได้รับการเข้าร่วมกับการขึ้นบรรทัดใหม่:

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 ไบต์

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

ลองที่นี่!

รับอินพุตที่มีการจัดทำดัชนี 1

ในที่สุดก็ตัดสินใจที่จะแก้ไขข้อผิดพลาดที่สร้างความรำคาญให้ฉันมานานและเล่นกอล์ฟได้ถึง21 ไบต์ไบต์

คำอธิบาย (ครึ่ง ASCII-fied สำหรับ 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 ไบต์

-2 ไบต์ขอบคุณ Jo King

อินพุตถูกทำดัชนี 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)

ลองออนไลน์!


ฉันสงสัยว่าคุณกำลังใช้การจัดทำดัชนีแบบ 1 รายการโปรดทิ้งข้อความไว้ในคำตอบของคุณตามที่ระบุในการท้าทาย
racer290

2

ถ่าน 37 ไบต์

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

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด 1 การจัดทำดัชนี คำอธิบาย:

¿¬LθUR²+«

กรณีพิเศษของการป้อนข้อมูลที่ว่างเปล่าโดยการวาดรูปสี่เหลี่ยม 2x2 ของ+s

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

ย้ายอินพุตใช้ค่าสูงสุดของแต่ละคอลัมน์ (ตอนนี้แถว) และเพิ่ม 2 เพื่อให้ได้ขนาดกล่องในพิกัดถ่าน

B⊟⮌η⊟η

วาดกล่อง

Fθ«

วนรอบแต่ละพิกัด

J⊟⮌ι⊟ι

ข้ามไปยังตำแหน่งของมัน

x

ทำเครื่องหมายด้วยกากบาท


ดูเหมือนจะล้มเหลวสำหรับการป้อนข้อมูลที่ว่างเปล่า: tio.run/…
wastl

@ วาลล์ขอบคุณฉันมาด้วยวิธีแก้ปัญหา
Neil

2

Stax , 32 31 24 ไบต์

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

เรียกใช้และแก้ไขข้อบกพร่อง

รับดัชนีที่ใช้ 0 เป็นอาร์เรย์ของ [y, x]คู่

คำอธิบาย:

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
ทำได้ดีมาก คุณสามารถได้รับไมล์สะสมเพิ่มขึ้นเล็กน้อยจาก|Sคำแนะนำรอบทิศทางและแผนที่จดชวเลข ( m) Surround ใช้เวลาaและจากสแต็คและผลิตb b+a+bและคุณสามารถใช้mแทนสุดท้าย|Jเพื่อวนซ้ำแถวและสร้างเอาต์พุต ตัวอย่างเช่น
เรียกซ้ำ

1
สิ่งหนึ่งที่เพิ่มเติม: คุณสามารถแทนที่ด้วยz]n+H% cM%นี่คือส่วนที่ได้รับความกว้างของแผนที่ แต่มีกรณีพิเศษสำหรับแผนที่ที่ว่างเปล่า หากคุณย้ายแผนที่ก่อนที่จะทำการวัดกรณีพิเศษจะหายไป
เรียกซ้ำ

@recursive ฉันกำลังมองหาสิ่งที่ล้อมรอบ แต่ฉันค้นหาคำหลักที่ผิด
wastl

สิ่งที่คุณจะเรียกการดำเนินการที่เป็นธรรมชาติ? ฉันอาจเพิ่มลงในเอกสารเพื่อให้บุคคลต่อไปสามารถค้นหาได้
เรียกซ้ำ

@ recursive ฉันจำไม่ได้ว่ามันคืออะไรและโดยปกติฉันจะเรียกมันว่าเสียงเซอร์ราวด์ในขณะนี้
เสีย

2

R , 133 125 122 ไบต์

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

ลองออนไลน์!

1 การจัดทำดัชนี รับเมทริกซ์เป็นอาร์กิวเมนต์ บันทึก 8 ไบต์ด้วย digEmAll, 3 ขอบคุณ Giuseppe! คำอธิบาย (รหัสรุ่นก่อนหน้า):

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

ถ้าคุณใช้ตัวอักษรปกติแทนรหัส utf8 คุณประหยัด 8 ตัวอักษร: tio.run/##ZU7NDoIwDL7zFEu9tKEzDONF4UkMhzmGchgYNhKC@uwIaozRpG36/...
digEmAll

122 ไบต์โดยใช้[<-โดยตรงเพื่อลบวงเล็บปีกกา
Giuseppe

@iuseppe แน่นอน! ฉันรู้ว่าต้องมีวิธี
JayCe

1

coords นำรูปแบบ [y, x]

JavaScript (Node.js) , 191 184 ไบต์

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}

ลองออนไลน์!


ฉันคิดว่าคุณตั้งใจสลับ X และ Y พิกัดที่ไหนสักแห่ง ..
racer290

@ racer290 คุณเจาะจงไหม?
DanielIndie

ลองวิธีแก้ปัญหาของคุณฉันพบว่าการเปลี่ยนพิกัด x ในกรณีทดสอบทำให้เกิดการเปลี่ยนแปลงในทิศทางแนวตั้งของพิกัด ฉันเดาว่าข้อผิดพลาดอยู่ในแถวแรก ( a.map(([y,x]))
racer290

แต่ x เป็นพารามิเตอร์ที่ถูกต้องตามที่เห็นได้จากกรณีทดสอบ
DanielIndie

2
ดังนั้นในการแก้ปัญหาของคุณคุณให้พิกัด y เป็นอันดับแรก ฉันคิดว่าคงจะเป็นการดีกว่าถ้าคุณจดบันทึกไว้ในคำตอบของคุณ
racer290


1

Java 10, 238 223 ไบต์

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

พิกัด 1 ดัชนี

ลองออนไลน์

คำอธิบาย:

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? ยงฮวา; forwhxxwr foryyhrxwyh? xwyhcxy? XR
Magic Octopus Urn

@MagicOctopusUrn คุณตั้งชื่อตัวแปรอะไรและget/ forเพื่ออะไร : S XD
Kevin Cruijssen

1

C (gcc) , 246 234 ไบต์

ขอบคุณสำหรับคำแนะนำ

ศูนย์การจัดทำดัชนี ฟังก์ชันรับรายการพิกัดและบัฟเฟอร์ค้นหาค่า x และ y สูงสุดเติมบัฟเฟอร์ด้วยช่องว่างสร้างเฟรมแล้วแปลง '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';}

ลองออนไลน์!


แก้ไขข้อผิดพลาดในแถวล่าง235 ไบต์
ceilingcat

1

05AB1E , 44 42 ไบต์

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

ลองออนไลน์!


 ζε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 และ Y อาจถูกยกเลิกได้ไม่รู้ว่าสำคัญหรือไม่


ฉันคิดว่าฉันมีสิ่งนี้ในไบต์น้อย แต่เราจะเห็น ... ไม่

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

1
มันไม่ได้มาก แต่คุณสามารถบันทึก 1 ไบต์โดยการเปลี่ยนครั้งแรกFในการLvลบNVและการเปลี่ยนแปลงไปY 41 ไบต์y
Kevin Cruijssen

1
ดังกล่าวโดย@Emignaในการสนทนา , สามารถεZ} €à
Kevin Cruijssen

ความเกลียดชังการแก้ไขนี้บนมือถือจะรอจนกระทั่งพีซีใกล้
Magic Octopus Urn

1
@KevinCruijssen Ývไม่ได้Lvแต่ก็ยังแก้ไขได้ดี :)
Magic Octopus Urn

อ่าคุณพูดถูก แทนÝv Lvความผิดฉันเอง.
Kevin Cruijssen

0

C (gcc) , 229 220 216 ไบต์

-9 ไบต์ขอบคุณไปที่แมวป่า ceilingcat

ศูนย์การจัดทำดัชนี ใช้พิกัดเป็นรายการตัวเลขโดยที่ตัวเลขเป็น X และเลขคี่เป็น 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;}

ลองออนไลน์!


@ceilingcat ไชโย!
Gastropner

แนะนำfor(n&&X++-Y++;i<=Y;i+=puts(""))แทนn&&X++-Y++;for(--i;i++<Y;puts(""))
ceilingcat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.