작은 탐험가


34

당신은 탐험가이며, 알려지지 않은 세계를 매핑합니다. 당신의 배는 바람에 운반됩니다. 어디로 가는지 누가 알 겠어요?

매일 망원경에서 북쪽, 남쪽, 동쪽 및 서쪽에 지형지 물이 보입니다. 기본 방향에 해당하는 네 가지 기능이 항상 표시됩니다. 망원경은 다음과 같이 ASCII 기호를보고합니다.

~~.*, ~~~~, ~.^^,~#~#

기호는 순서대로 (북쪽, 남쪽, 동쪽, 서쪽)입니다.

~= 바다, .= 해안, ^= 산, *= 나무, #= 유효하지 않은 기호입니다. 관찰 할 수 없습니다. 이것은 세계의 가장자리를 보거나 안개에 의해 풍경이 가려 질 때마다 발생합니다. 망원경은 모든 방향에서 정확히 하나의 유닛을 봅니다.

매일 밤, 당신은 얼마나 멀리 여행했는지 확인하기 위해 별을 봅니다. 별을 보면 다음과 같은 ASCII 기호가 표시됩니다.

n, s, e,w

각각 북쪽, 남쪽, 동쪽 및 서쪽에 해당합니다. 매일 밤마다 정확히 하나의 단위를 북쪽, 남쪽, 동쪽 또는 서쪽으로 이동합니다. 따라서 탐험가는 끝없는 기호 스트림을 받게됩니다.

~~.*n~~~~s~~.*s~.**

당신의 임무는 세계의 2D지도를 출력하는 것입니다 (지도의 ?알 수없는 부분, 북쪽은 위, 동쪽은 오른쪽) :

?~~~??????
?~~~??????
?~~~.^^.??
?~~.***.~~
~~.*^^*.~~
~~~..~~~~~
~~~~~~~~~~
~~~~~~~~~~

간단하게하기 위해지도의 왼쪽 하단에서 시작한다고 가정 해 보겠습니다. 모든 맵이 8x8이라고 가정하십시오.

다음은 간단한 3x3 예제입니다. 지도가 다음과 같다고 가정합니다.

~.~
~^~
~.~

다음 입력으로 : ~#.#n~~^#s

이 출력을 얻을 수 있습니다 :

~??
~^?
~.?

더 많은 입력 및 출력 예 :

입력 ~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w.#~~

산출

~~~~~~~~ 
~....~~~ 
~.????~~ 
~~????~~ 
~~????.~ 
~~????~~ 
~~?.^.~~ 
~~~~~~~~

입력:

~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s

산출:

?~~~~~?? 
?....~?? 
?.**.~?? 
?~..~~?? 
?~~~~~?? 
?~~..~?? 
~~~.^.?? 
~~~~~~?? 

7
프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다! 이것은 좋은 첫 번째 도전입니다. 그래도 몇 가지 분명하지 않습니다. 출력의 모든 기호가 공백으로 분리되어야합니까? 예제 출력의 경우처럼 보이지만 어디서나 명시 적으로 언급되지 않았습니다. 또한 별 방향은 어떤 용도로 사용됩니까? 지도에서 기호의 위치를 ​​제어 할 수 있다고 생각했지만 예제를 따르고 왼쪽 하단에서 시작하면 그렇지 않은 것 같습니다. 그것에 대해 자세히 설명해 주시겠습니까?
Alex A.

출력을 공백으로 분리 할 필요는 없습니다. 제 부분의 오류입니다. "#"는 "관찰 없음"을 나타냅니다. 지도의 경계에있을 때마다 발생하지만 무작위로 발생할 수도 있습니다.
user52676

4
우수한. Alex가 말했듯이, 이것은 첫 번째 큰 도전입니다. 앞으로 더 많은 것을보고 싶습니다! :) (참고로의 샌드 박스는 미래의 도전 과제에 대한 피드백을 얻을 수있는 좋은 장소입니다.)
El'endia Starman

1
내가 처음 예를 의심 (입력이 어디 ~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w) 잘못이며, 출력은해야 ??어디 말한다?.
새는 수녀

3
그것은 마법의 비행선이다 .)
user52676

답변:


8

MATL , 68 59 58 바이트

'?'7XJQtX"'s'jh5e"@2#1)t35>)-1l8t_4$h9M)b'nsew'=8M*sJ+XJ+(

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

설명

지도는 스택의 맨 아래에 유지되고 점차 채워집니다. 탐색기의 현재 위치는 클립 보드 J에 저장됩니다.

지도는 행렬 좌표를 사용하므로 (1,1)은 왼쪽 위입니다. 또한 열 주요 선형 인덱싱이 사용됩니다. 이것은 맵을 나타내는 8 × 8 행렬의 요소가 다음과 같이 단일 인덱스 로 액세스됨을 의미 합니다.

1  9 17 25 33 41 49 57
2 10 18 26 34 42 50 58
3 11 19 27 35 43 51 59
4 12 20 28 36 44 52 60
5 13 21 29 37 45 53 61
6 14 22 30 38 46 54 62
7 15 23 31 39 47 55 63
8 16 24 32 40 48 56 64

예를 들어 행렬의 요소 (3,2)는 선형 인덱스 11을 갖는 요소입니다. 북쪽, 남쪽, 동쪽 및 서쪽으로의 움직임은 선형 인덱스에 -1, 1, 8 또는 -8을 더한 것과 같습니다. 배열 [-1 1 8 -8]은 두 가지 다른 것을 인코딩하는 역할을합니다.

  • 탐험가의 가능한 변위.
  • 망원경으로 감지 된 특징의 상대적 위치. 이 위치는 탐색기의 현재 위치를 기준으로합니다.

입력 문자열은 여러 5문자 로 배열됩니다 . 첫 번째 청크에는 첫 번째 문자 (이동을 나타내는 문자) s가 없으므로 모든 청크를 동일한 크기로 만들기 위해 이니셜 이 임의로 포함됩니다. 이를 보완하기 위해 탐색기는 8이 아닌 위치 7에서 시작하므로 남쪽으로의 초기 변위 (선형 인덱스에 1 추가)는 위치 8에있게됩니다.

5 문자 청크는 루프로 처리됩니다. 첫 번째 문자는 위치를 업데이트하고 나머지 4 개는과 다른 경우 #맵을 나타내는 행렬의 적절한 항목에 기록됩니다.

'?'          % push '?'. The map will initially be filled with this
7XJ          % push 7: initial position of the explorer. Copy into clipboard J
Qt           % add 1. Duplicate
X"           % 8x8 matrix containing '?'
'n'jh        % take input string. Prepend 'n'
5e           % reshape into a 5-column matrix
"            % for each column (chunk)
  @          %   push current chunk
  2#1)       %   split chunk into its first char and an array with the other 4
  t35>       %   duplicate. Logical index of chars different than #
  )          %   apply that index to keep characters different than #
  -1l8t_4$h  %   array [-1 1 8 -8]
  9M         %   push logical index again
  )          %   apply that index to keep only relevant relative positions
  b          %   bubble up in stack: move first char of chunk to top
  'nsew'=    %   logical index that tells if that char is 'n', 's', 'e' or 'w'
  8M         %   push array [-1 1 8 -8] again
  *          %   multiply element-wise. Only one of the four results will be nonzero
  s          %   sum of the array. Gives displacement of the explorer
  J+         %   push position of the explorer and add to compute new position
  XJ         %   update position in clipboard J
  +          %   add updated position of explorer to relative positions of features
  (          %   write those fearttures into the indexed entries of the map
             % end for each. Implicitly display

그것은 영리한 트릭입니다! 나는 몇 가지지도에 대해 귀하의 프로그램을 테스트하여 내가 기대하는 것을 수행하는지 확인합니다.
user52676

3

C, 210 (208) 207 바이트

이것은 printf와 scanf를 사용하여 입력을 읽고 x, y 대신 선형 배열을 사용합니다. 그래서 나는 그것이 밀리 바이트와 충분히 다르다고 생각합니다 .

골프 :

 main(p){char*i,*j,m[80];for(p=73,i=m+p;p--;m[p]=63);for(p=8;scanf("%5s",i)>0;p+=*j=='n'?8:*j=='s'?-8:*j=='e'?1:-1)for(j=i;j-i<4;j++)if(*j^35)m[p+"qajh"[j-i]-'i']=*j;for(p=72;m[p]=0,p-=8;)printf("%s\n",m+p);}

언 ung 프 :

main(p){
    char*i,*j,m[80];
    for(p=73,i=m+p;p--;m[p]=63);                   // fill with ?
    for(p=8;scanf("%5s",i)>0;
            p+=*j=='n'?8:*j=='s'?-8:*j=='e'?1:-1)  // read 5-at-a-time
        for(j=i;j-i<4;j++)
            if(*j^35)m[p+"qajh"[j-i]-'i']=*j;      // update map positions
    for(p=72;m[p]=0,p-=8;)printf("%s\n",m+p);      // output line-by-line
}

대표:

  // board: (vertically reversed when printed)
    0  1  2  3  4  5  6  7
    8  9  10 ...
    16 18 19 ...
    ...
    56 57 58 59 60 61 62 63

  // offsets and offset order, or why "qajh": 
    s2      -8       a
  w4  e3  -1 0+1   h i j
    n1      +8       q   <- offset by +'i'

또한 8 번 위치에서 시작하면 인쇄 루프에서 문자가 줄어 듭니다.


2

포트란 263 251 247 235 234 216 바이트

1D 버전 (Don Muesli의 버전과 유사) :

#define R read(*,'(a)',advance='no',eor=1)c
#define F(x)R;if(c/='#')a(x+i)=c
program t
character::a(64)='?',c
integer::k(4)=[8,-8,1,-1],i=57
do
F(-8)
F(8)
F(1)
F(-1)
R
i=i+k(index('snew',c))
enddo
1 print'(8a)',a
end

2D 버전 :

#define R read(*,'(a)',advance='no',eor=1)c
#define F(x,y)R;if(c/='#')a(x+m,y+l)=c
#define G(x,y)j=index(x,c);if(j==2)j=-1;y=y+j
program t
character::a(8,8)='?',c
l=8;m=1
do
F(,-1)
F(,1)
F(1,)
F(-1,)
R
G('sn',l)
G('ew',m)
enddo
1 print'(8a)',a
end

자유 형식 및 사전 처리를 활성화하려면 파일 확장자가 필요합니다 ( .F90예 :) explorer.F90. 입력은 STDIN에서 읽습니다.

echo "~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s" | ./a.out 
?~~~~~??
?....~??
?.**.~??
?~..~~??
?~~~~~??
??~..~??
~~~.^.??
~~~~~~??

Fortran도 선형 인덱싱이 있습니까?
Luis Mendo

@DonMuesli 아니요, 실제로는 아닙니다. 1D 배열에서 직접 작동하고 있습니다. 문자 배열을 인쇄하기 위해 배열이 메모리에 연속적으로 저장되어 있다는 사실을 사용하고 있습니다.
Alexander Vogt

2

C, 265 (226) 224 바이트

a[8][8];x;y;i;main(c){for(;c=getchar(),c+1;y+=(c=='n')-(c=='s'),x+=(c=='e')-(c=='w'))for(i=5;--i;c=getchar())i&&c-35&&(a[x+(i==2)-(i==1)][y-(i==3)+(i==4)]=c);for(y=8;y--;putchar(10))for(x=0;x<8;)putchar((i=a[x++][y])?i:63);}

지도는 8x8입니다. 전에는 눈치 채지 못했습니다. 그리고 다음은 가변 크기의 맵에서 작동하는 265 바이트 솔루션입니다.

a[99][99];c;x;X;y;i;k;p;main(Y){for(;c=getchar(),c+1;y+=(c=='n')-(c=='s'),x+=(c=='e')-(c=='w'))for(i=5;--i;c=getchar())i&&c-35&&(a[k=x+(i==2)-(i==1),X=X<k?k:X,k][p=y-(i==3)+(i==4),Y=Y<p?p:Y,p]=c);for(y=Y+1;y--;putchar(10))for(x=0;x<=X;)putchar((i=a[x++][y])?i:63);}

a[8][8]충분 하지 않아야합니까?
Alexander Vogt

@Alexander Vogt-아, 맞아! 감사합니다. 두 바이트가 더 줄어 듭니다.
mIllIbyte

x와 y의 증분 / 감소를 계산하는 방법이 정말 좋습니다. C 코드를 비교하면 static int a[8][8]은 무료 맵 초기화를 제공하며 char을 사용 m[64]하면 맵 출력을 크게 할인받을 수 있습니다. 그럼에도 불구하고 정말 가까운 수
tucuxi

당신이 반대하는 경우 ew지도 표현에, 당신은 사용할 수있는 for(x=8;x--;)putchar((i=a[x][y])?i:63)출력에 2 바이트를 면도.
tucuxi

c=getchar(),c+1되지는 동등 getchar(),c++또는 관련된 몇 가지 속임수가?
Jonathan Frech

2

루비, 169147 바이트

전체 프로그램. STDIN에서 입력 문자열을 가져와 (후행 줄 바꿈이 엉망이되는 것을 막기 위해 파일에서 입력해야 함) 결과 맵을 STDOUT으로 출력합니다.

모든 줄을 하나로 묶은 다음 나중에 분리하여 톤을 다듬 었습니다.

m=??*64
d=0
x=56
gets.each_char{|c|d<4?(w=x+(d>2?-1:d>1?1:d<1?-8:d<2?8:0)
m[w]=c if c>?$):x+=c>?v?-1:c<?f?1:c>?q?8:-8
d+=1;d%=5}
puts m.scan /.{8}/

언 골프 드 :

m = ?? * 64                 # 64 "?" symbols
                            # y axis counts downwards; 0-7 is top row
d = 0                       # Keep track of which direction we're looking
x = 56                      # Position, bottom left corner (0,7)
gets.each_char do |c|       # For each character from first line of STDIN
    if d < 4                # Looking in a direction
        if    d > 2         # d == 3; looking west
            w = x - 1
        elsif d > 1         # d == 2; looking east
            w = x + 1
        elsif d < 1         # d == 0; looking north
            w = x - 8
        else                # d == 1; looking south
            w = x + 8
        end
        m[w] = c if c > ?$  # Only '#' gets rejected by this step
    else                    # Moving in a direction
        if    c > ?v        # c == 'w'
            x -= 1
        elsif c < ?f        # c == 'e'
            x += 1
        elsif c > ?q        # c == 's'
            x += 8
        else                # c == 'n'
            x -= 8
        end
    end
    d = (d + 1) % 5         # Look in the next direction
end
puts m.scan /.{8}/          # Split map into rows of 8

1

루아, 354 바이트 ( 온라인 시도 )

골프 :

n=(...)r={}y=8x=1q="?"for i=1,8 do r[i]={q,q,q,q,q,q,q,q}end for u in n:gsub("#",q):gmatch(".....")do a,b,c,d,e=u:match("(.)(.)(.)(.)(.)")if a~=q then r[y-1][x]=a end if b~=q then r[y+1][x]=b end if c~=q then r[y][x+1]=c end if d~=q then r[y][x-1]=d end y=y+(("n s"):find(e)or 2)-2x=x+(("w e"):find(e)or 2)-2 end for i=1,8 do print(table.concat(r[i]))end

약간 골퍼되지 않음 :

n = "~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s"

r={} y=8 x=1 q="?"
for i=1,8 do r[i]={q,q,q,q,q,q,q,q} end
for u in n:gsub("#",q):gmatch(".....") do
  a,b,c,d,e=u:match("(.)(.)(.)(.)(.)")
  if a~=q then r[y-1][x]=a end
  if b~=q then r[y+1][x]=b end
  if c~=q then r[y][x+1]=c end
  if d~=q then r[y][x-1]=d end
  y=y+(("n s"):find(e)or 2)-2
  x=x+(("w e"):find(e)or 2)-2
end
for i=1,8 do print(table.concat(r[i])) end

x=x+(("w e"):find(e)or 2)-2 endx=x-2+(("w e"):find(e)or 2)end없습니까?
Jonathan Frech

1

코 틀린, 242 바이트

{val m=Array(8){Array(8){'?'}}
var d=7
var i=0
for(c in it)(mapOf('n' to{d--},'s' to{d++},'w' to{d-=8},'e' to{d+=8},'#' to{i++})[c]?:{m[d%8+listOf(-1,1,0,0)[i%4]][d/8+listOf(0,0,1,-1)[i%4]]=c
i++})()
m.forEach{for(c in it)print(c);println()}}

원하는 경우 줄 바꿈을 세미콜론으로 바꿀 수 있습니다.

여기를보십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.