보물지도 그리기 봇


14

친구를 위해 보물 찾기를 조직하고 있습니다. 더 쉽게 일을 수행하기 위해 귀중한 물건을 숨긴 모든 위치의지도를 그리려고합니다.

입력

0 0왼쪽 상단에있는 (음수가 아닌) x 및 y 좌표로 구성된 점 목록을 나타내는 모든 형식의 입력 이 허용됩니다 (참고 : 답에 1 기반 색인을 사용할 수도 있습니다. ). 예:

1 2
3 0
0 1

도전

함수 또는 프로그램은 x출력에서 y + 1 행과 x + 1 열에 표시가있는 모든 주어진 위치를 나타내는 맵을 구성 할 수 있어야합니다 . 표시되지 않은 위치는로 표시됩니다 . 맵은 또한 코너는 프레임 구성 +들, 수직선은 |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
출력이 2 차원 문자 배열 일 수 있습니까?
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

::empty그렇게 장황한가? 그게 뭐야? 왜 1 바이트 정도로 단순화 할 수 없습니까? (나는 J에 대한 지식이 없다)
Magic Octopus Urn

나는 :: empty없이 TIO에서 그것을 실행했으며 작동하는 것처럼 보였습니다 (J를 모릅니다)
Quintec

실제로 :: empty는“”입력 사례를 처리하는 것 같습니다
Quintec

@MagicOctopusUrn 실제로 빈 상자를 출력하는 더 짧은 방법을 모르는 경우 기본적으로 1 행 높이입니다.
FrownyFrog

4

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

하스켈 , 127123 바이트

이것은 x 좌표 목록과 해당 y 좌표 (!)목록을 취하는 연산자 를 정의합니다 .

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]

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

언 골프 / 설명

도우미 함수 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

캔버스 , 22 바이트

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

여기 사용해보십시오!

1 인덱스 입력을받습니다.

마침내 나에게 성가신 버그를 고치기로 결정하고 이것을 21 바이트 로 줄였습니다. .

설명 (단일 공간의 경우 절반 -ASCII-fied) :

ø╶{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

파이썬 (2) , 151 (140) 138 바이트

Jo King 덕분에 -2 바이트

입력은 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

@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) 서라운드 얻어 ab의 스택을 생성하고 b+a+b. 그리고 m마지막 대신을 사용 |J하여 행을 반복하고 출력을 생성 할 수 있습니다 . 예를 들어
재귀 적

1
한가지 더 : 당신이 바꿀 수 있습니다 z]n+H%cM%. 이것은 맵 너비를 가져 오는 부분이지만 빈 맵에 대해서는 특별한 경우가 있습니다. 측정하기 전에지도를 바꾸면 특별한 경우가 사라집니다.
재귀 적

@recursive 서라운드와 같은 것을 찾고 있었지만 잘못된 키워드를 검색했습니다
wastl

자연스럽게 그 작업을 무엇이라고 부릅니까? 다음 사람이 찾을 수 있도록 문서에 추가 할 수 있습니다.
재귀

@recursive 나는 그것이 무엇인지 기억하지 못하고 자연스럽게 그것을 서라운드라고 부를 것입니다
wastl

2

R , 133125122 바이트

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

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

1- 색인. 행렬을 인수로 사용합니다. digEmAll 덕분에 8 바이트, Giuseppe 덕분에 3 바이트 절약! 설명 (이전 버전의 코드) :

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 바이트 .
주세페

@ 주세페! 방법이 있어야한다는 것을 알았습니다.
JayCe

1

[y, x] 형식의 좌표

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

자바 스크립트, 180 바이트

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

자바 10, 238223 바이트

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? yh; forwhxxwr. foryyhrxwyh? xwyhcxy? xr.
매직 문어 Urn

@MagicOctopusUrn 모든 변수의 이름과 get/ for를 무엇입니까? : S XD
Kevin Cruijssen

1

C (gcc) , 246234 바이트

제안에 대한 천장 고양이 덕분에.

인덱스가 0입니다. 이 함수는 좌표 및 버퍼 목록을 가져 와서 최대 x 및 y 값을 찾고, 공백으로 버퍼를 채우고, 프레임을 생성 한 다음 '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';}

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


맨 아래 줄 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
별로 많지는 않지만 첫 번째 F를 로 변경하고 Lv제거 NV하고로 변경 Y하여 1 바이트를 절약 할 수 있습니다 y. 41 바이트
Kevin Cruijssen

1
에서 언급 한 바와 같이 @Emigna 채팅에 , εZ}할 수 있습니다 €à.
Kevin Cruijssen

모바일에서 이것을 편집하는 것은 PC 근처에 올 때까지 기다립니다.
매직 문어 Urn

1
@KevinCruijssen Ýv하지 Lv,하지만 여전히 좋은 편집 :).
매직 문어 Urn

아 맞아. Ýv대신에 Lv. 내 잘못이야.
Kevin Cruijssen

0

C (gcc) , 229 (220) 216 바이트

덕분에 -9 바이트 ceilingcat .

인덱스가 0입니다. 짝수는 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(""))
천장 고양이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.