으악! 숨겨진 보물에 대한지도!


49

소개

"야! 우리는 자신을"프로그래머 "라고 불렀던 laddie를 숨겨둔 보물로지도를 만들었습니다! 그러나 'tis는 재치만으로도 이상한 숫자'n 글자를 썼어요!"E5, N2, E3 "… "광기 야! 보물지도를 제대로 쓸 수 없어, 쓸모없는 크레 틴. 우리를 고쳐라! 우리는 보물을 나눠 주겠다!"

도전 설명

해적 그룹이 보물지도를 읽는 데 어려움을 겪고 있습니다. 좀 더 ... 해적 형태로 변환하는 프로그램을 작성할 수 있습니까?

입력으로 원래 보물지도를받습니다. 쉼표로 구분 된 문자열의 목록입니다. 각 문자열은 문자 부분 (해적들에게 어느 방향으로 걸어 가야 하는지를 알려줍니다 )과 숫자 부분 (해적에게 그 방향으로 몇 걸음을 걸을 지를 알려줍니다)으로 구성됩니다. 예를 들어, 다음 보물지도 :

E2,N4,E5,S2,W1,S3

"동쪽으로 2 걸음 걷기, 북쪽으로 4 걸음 걷기, 동쪽으로 5 걸음 걷기, 남쪽으로 2 걸음 걷기, 서쪽으로 1 걸음 걷기, 남쪽으로 3 걸음 걷기"를 의미합니다.

출력으로, 그래픽 형태로 출력지도를, 문자를 사용하는거야 당신 >, ^, v, 및 <포인터 등. 위의 입력에 대한 출력은 다음과 같습니다.

  >>>>>v
  ^    v
  ^   v<
  ^   v
>>^   X

우리는 마지막 단계를 남쪽으로 X대신했습니다. 마지막 단계는 보물이있는 곳이며, 우리 모두 알고 있듯이 해적들은 보물지도에 X가 있어야합니다. 그렇지 않으면 보물을 읽는 방법을 모릅니다.

그건 그렇고,지도는 절대로 교차하지 않으므로 겹침 처리에 대해 걱정할 필요가 없습니다. 또한 출력 끝에 새 줄을 추가 할 수 있습니다.

샘플 입력 및 출력

S5,W2

 v
 v
 v
 v
 v
X<

N1,E1,S1,E1,N1,E1,S2

>v>v
^>^X

N1

X

N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2

>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<

E21,S2

>>>>>>>>>>>>>>>>>>>>>v
                     X

N12,E11,S12,W2,N4

>>>>>>>>>>>v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^        X v
^        ^ v
^        ^ v
^        ^<<

1
각 줄에 후행 공백이 허용됩니까? 숫자가 항상 10보다 작습니까?
Downgoat

9
나는 다른 모든 움직임이 계산되는 것처럼 마지막 움직임 이후X 의 단계를 표시해야 한다고 생각합니다 . 마지막 단계는 N3이라고 상상해보십시오. 북쪽으로 3 걸음 걸어서 파고 있지만 여기에는 아무 것도 없습니다. 대신 2 걸음 걸어야했습니다. 기존 규칙을 유지하더라도 처리해야 할 작은 코너 케이스가 추가되므로 걱정하지 않아도됩니다. 그러나 그 래디에게 일어난 일을 기억하십시오.
coredump

6
@coredump 또는 어쩌면 우리는 해적을 잘못 인도하고 싶기 때문에 우리 자신을 위해 보물을 가져갈 수 있습니다.) 아닙니다. 맞습니다. 이미 세 가지 답변이 있으므로 기존 솔루션의 무효화를 피하기 위해 규칙을 유지합니다.
absinthe

4
@ jpmc26 글쎄요,이 해적들은 알파벳을 많이 알지 못합니다 ... 그들은 지난 몇 년 동안 C에서 보냈습니다 :)
absinthe

4
네 번째 예는 해적을 트롤링하는 것입니다.
justhalf

답변:


8

루비, 2132099898186 178

M={};x=0,m=q=0
gets.scan(/.(\d+)/){?1.upto($1){m,y=x
x[d=$&.ord%10%7-2]+=1|($u=M[y]||={})[m]=d
m<q&&q=m}}
$u[m]=2
puts M.sort.map{|_,b|(q..b.max[0]).map{|k|">vX <^"[b[k]||3]}*""}

stdin을 통해 입력을 전달하십시오.

이것은 사용 y -> x -> char모두지도, 구성하기 위해 사전 xy음수가 될 수 있습니다. 입력이 구문 분석되면 x 좌표의 전체 최소값이 추출됩니다. 그런 다음 각 행에 대해 현재 행의 전역 최소값에서 최대 색인까지의 범위를 반복하고 해당 색인의 올바른 문자를 인쇄합니다.

테마를 유지하기 위해 Sp3000답변NESW 에서 적절한 지수로 바뀌는 표현 이 뻔뻔스럽게 해적되었습니다 .

[x,y] -> char사전 을 사용한 원본 버전 :

M={};x=0,0
gets.scan(/.(\d+)/){(?1..$1).map{x[d=$&.ord%10%7-2]+=1|M[$y=x+[]]=d}}
M[$y]=2
a,*q=M.minmax.flatten
M.map{|(x,y),v|($*[y-M.map{|a,|a[1]}.min]||=?\s.*q[2]-a)[x-a]=">vX<^"[v]}
puts$*.map &:rstrip

20

파이썬 2 249 248 244 239 237 바이트

D={}
m=X=Y=0
for s in input().split(","):d=ord(s[0])%10%7;exec"a,b=X,Y;E=D[Y]=D.get(Y,{});E[X]='<^>v'[d];m=min(m,X);%c+=d-2|1;"%(88+d%2)*int(s[1:])
D[b][a]="X"
for Y in sorted(D):print"".join(D[Y].get(n," ")for n in range(m,max(D[Y])+1))

처럼 입력하십시오 "E2,N4,E5,S2,W1,S3".

NSEW[1, 3, 2, 0]의해 매핑 됩니다 d=ord(c)%10%7. 여부는 변경 y또는 x그때까지 결정 d%2, 여부는 증가 또는 감소에 의해 결정됩니다 d-2|1. 첫 번째와 세 번째 표현은 무차별적인 힘으로 발견되었습니다.

그 외에는 형식의 중첩 사전을 간단하게 사용합니다 {y: {x: char}}.

(매핑에 도움을 주신 @joriki에게 감사드립니다)


1
(d + 1 & 2) - 1
joriki

1
@joriki 아 좋은 표현입니다-감사합니다!
Sp3000

2
다음 은 정수 함수에 대한 간단한 표현식을 찾기 위해 다른 컨텍스트에서 작성한 코드 입니다. 나는 이것을 사용하지 않았지만 그것이 당신에게 흥미로울 것이라고 생각했습니다. (관련 코드는 "이것은 내가 인코딩을 최적화하는 데 사용한 코드입니다"라고 시작합니다.)
joriki

3
@joriki Brute forcing은 좋은 생각입니다-방금 나타났습니다 1|d%-3(부정적인 것이지만, 나는 그것이 또한 괜찮다는 것을 깨달았습니다)!
Sp3000

14

자바 스크립트 (ES6), 260

이것은 흥미로운 것이었다 ...

도움을 주신 @ETHproductions, @ edc65 및 @vihan에게 감사드립니다!

s=>{z=o=""
m=[]
q=x=y=2e3
s.split`,`.map(v=>z+=v[0].repeat(+v.slice(1)))
for(i=0;d=z[i];q=x<q?x:q)(m[y]=m[y]||[])[x]=z[++i]?d=="N"&&--y?"^":d=="S"&&++y?"v":d=="W"&&--x?"<":++x?">":o:"X"
m.map(a=>a.map((b,j)=>o+=" ".repeat(-p-1+(p=j))+b,p=q-1,o+=`
`))
return o}

이것은 익명 함수를 정의하므로 f=이름을 지정하기 위해 처음에 추가 합니다.

테스트하려면 : console.log(f("E2,N4,E5,S2,W1,S3"))

설명:

s=>{ //define function w/ parameter s
z=o=""      //z=modified input, o=final output
m=[]        //map of characters
q=x=y=2e3   //q=minimum value of x; x+y=coordinates. These start high to leave room to go backwards
s.split`,`.map(v=>z+=v[0].repeat(+v.slice(1)))    //change "N3,E4" -> "NNNEEEE", and put in z
for(i=0;d=z[i];q=x<q?x:q)   //for each direction d in z, while updating q:
    (m[y]=m[y]||[])[x]=     //in the right place on the map, put:
        z[++i]?                 //if last character of z, "X"
            d=="N"&&--y?"^":    
            d=="S"&&++y?"v":    //otherwise get the right character and change x+y accordingly
            d=="W"&&--x?"<":
            ++x?">":o
        :"X"
m.map(a=>a.map((b,j)=>o+=" ".repeat(-p-1+(p=j))+b,p=q-1,o+=`
`)) //dump map to o, with correct padding
return o}   //return

3
그것은 진술을 분리하는 좋은 방법입니다! 모든 것을 한 줄에 넣고 세미콜론으로 분리하는 것보다 훨씬 더 읽기 쉽습니다. 내 제안을 제공 할 수있는 경우 : 당신은 당신을 이동하여 바이트를 절약 할 수있다 i++으로부터 for이 경우, 사용되는 마지막 장소에 루프 c=i++>r-2?"X":c.
ETHproductions

1
당신이 ES6를 사용하기 때문에, 내가 사용하는 것이 좋습니다 것 v[0].repeat(+v.slice(1))대신에 Array(v.slice(1)- -1).join(v[0]), 그리고 " ".repeat(j-p-1)대신에 Array(j-p).join(" ")전체 11 바이트를 저장. 또한 F='forEach'함수의 시작 부분에 배치 한 다음 각각을 .forEach에서 로 변경 [F]하여 추가로 4를 절약 할 수 있다고 생각합니다 .
ETHproductions

1
.forEach 대신 .map을 사용해보십시오. 너무 짧아서 F로 줄이면 안됩니다
edc65 08/07/15

1
@UndefinedFunction @ ifs에 대한 속기를 사용하고 싶을 때 변수를 동시에
줄이면

1
내 이해가 정확 q=x=y=2e3하다면 내가 말하면 출력이 잘못되었다는 것을 의미 W9999합니까?
Sp3000

7

PHP, 431 417 바이트

$g=explode(',',$argv[1]);$x=$y=$a=$b=$c=$d=$e=$f=0;
foreach($g as$i=>$h){list($k,$l,$m)=
    ['N'=>[-1,0,'^'],'E'=>[0,1,'>'],'S'=>[1,0,'v'],'W'=>[0,-1,'<']][$h[0]];
    for($s=substr($h,1);$s--;){$z[$f=$y][$e=$x]=$m;$y+=$k;$x+=$l;}
    if($i==count($g)-1){$x=$e;$y=$f;}
    $a=min($a,$x);$b=max($b,$x);$c=min($c,$y);$d=max($d,$y);
}$z[$y][$x]='X';for($y=$c;$y<=$d;$y++)
{$o='';for($x=$a;$x<=$b;$x++)$o.=$z[$y][$x]?:' ';echo rtrim($o)."\n";}

파일 ( treasure.php)에 넣고 들여 쓰기를 제거하고 줄을 결합하십시오 (가독성을 위해 여기에 줄 바꿈) <?php. 파일의 시작 부분에 마커를 넣으십시오 (기술적으로 프로그램의 일부가 아니므로 여기에 표시되지 않음).

실행 예 :

$ php -d error_reporting=0 treasure.php E2,N4,E5,S2,W1,S3
  >>>>>v
  ^    v
  ^   v<
  ^   v
>>^   X
$

이 옵션 -d error_reporting=0은의 지정된 지수에서 찾을 수없는 값에 대한 통지를 억제하기 위해 필요합니다 $z.

최신 정보:

게시 할 코드ungolfed 버전을 준비하는 동안 불필요한 두 가지 할당 (12 바이트)과 제거 할 수있는 공백이 포함되어 있음을 발견했습니다 as$i. 또한 whilea for루프 를 대체하고 할당을 압착하여 ( while루프를 사용할 수 없음 ) 다른 바이트를 저장했습니다.


나는 ungolfed 버전을보고 싶습니다.
Lars Ebert

1
@LarsEbert 나는 ungolfed 코드에 대한 링크로 답변을 업데이트했습니다. 귀하의 솔루션을 지금 확인했습니다 (이전에는하지 않았습니다). 우리는 기본적으로 같은 알고리즘을 사용했습니다. 당신은 내 것보다 마지막 단계를 더 잘 처리합니다. 구현하면 25 바이트를 더 스트립 할 수 있습니다 $count --;.
axiac

$argnsave 3 바이트 chopsave 1 "X"X
Byte-

@ JörgHülsermann $argn힌트를 얻지 못했습니다 . 나는 "X"->X트릭을 알고 있지만이 솔루션을 쓸 때 아마 잊어 버렸습니다. 2002 년부터 PHP 코드를 작성했지만 오늘까지 PHP가 chop()함수를 제공한다는 것을 알지 못했습니다 . 이 힌트에 감사드립니다.
axiac

7

702 613 546 474 439 338 260 바이트

그의 도움과 수퍼 골프 버전에 대한 Dom Hastings에게 감사드립니다.
이 코드는 2D 배열을 사용합니다.

Dom Hastings의 버전 :

$x=$y=$a=$b=99;map{/^./;$a=($c=$x)<$a?$x:$a,$A=$x>$A?$x:$A,$b=($C=$y)<$b?$y:$b,$B=$y>$B?$y:$B,$q[$c][$C]={split'','W<E>N^Sv'}->{$&},$x+={W,-1,E,1}->{$&},$y+={N,-1,S,1}->{$&}for 1..$'}split',',pop;$q[$c][$C]=X;for$y($b..$B){print$q[$_][$y]||$"for$a..$A;print$/}

338 바이트의 저급 골프 버전 (참조 용) :

@m=split(',',pop);$x=$y=$a=$b=99;map{($d,$s)=/^(.)(.+)$/;for(1..$s){$c=$x;$C=$y;if($x<$a){$a=$x}if($x>$A){$A=$x}if($y<$b){$b=$y}if($y>$B){$B=$y}if($d eq"W"){$r="<";$x--}if($d eq"E"){$r=">";$x++}if($d eq"N"){$r="^";$y--}if($d eq"S"){$r=v;$y++}$q[$c][$C]=$r}}@m;$q[$c][$C]=X;for$y($b..$B){for$x($a..$A){$t=$q[$x][$y];print$t?$t:$"}print$/}

테스트

$ perl piratemap_golf.pl E4,N3,W6,S10,W1,S1,E5,N1,W2,N6,E6,N5,W10,S1,E2
v<<<<<<<<<<
>Xv<<<<<< ^
  v     ^ ^
  v     ^ ^
  v >>>>^ ^
  v >>>>>>^
  v ^
  v ^
  v ^
  v ^
  v ^
 v< ^<<
 >>>>>^

3
를 사용 use strict;하지 않는 경우 모든을 필요로하지 않으므로 my최소 몇 바이트를 절약 할 수 있습니다. 또한 후자가 공백을 필요로하기 때문에 ==보다 짧습니다 eq.
Alex A.

1
제가 잘못 본게 아니라면, 당신은 단지 전화하는거야 $m한 번, 그래서 오히려 변수로 명령 행 인수를 저장하는 대신에 직접 호출 할 수 있습니다 split즉, @m=split(',',$ARGV[0]).
Alex A.

1
@LukStorms, Perl 골퍼를 더 많이 만나게되어 기쁩니다! 바이트를 절약하는 데 도움이되는 몇 가지 사항! 귀하 $d$s변수는 몇 가지 바이트를 저장하는 정규식을 사용하여 잡고 할 수 있습니다 ($d,$s)=/^(.)(.+)$/, 모두 foreach들 수 있습니다 for그들은 같은이야로 (. 당신은 또한 몇 가지 문자와 이들의 일부를 대체 저장할 수 있습니다 map{... }@x당신은 괄호를 무시할 수 있기를 반복되는 항목 주위에 (다른 루프를 포함 해야하는 경우 잘 작동합니다.) $ARGV[0]사용하는 경우 팝으로 바꿀 perl script.pl <<< "text"수 있지만 <>대신 스크립트를 사용하면 대신 사용할 수 있습니다 !
Dom Hastings

1
args를 사용하여 스크립트를 유지하려면 pop부부를 저장하는 데 사용할 수 있습니다 . 대신에 use Swtichswitch/ case문, 당신은 당신에게 바이트를 저장할 수있는 개별 검사를 할 수 있습니다. 같은 $y-="N"eq$d것이 잘 작동합니다 (참 1과 거짓이이므로 ''). 종종 단어를 베어 워드로 사용할 수 있으므로 $y-=N eq$d작동합니다! 바이트, $/is '\n'$"is 를 저장하는 데 사용할 수있는 몇 가지 마술 변수 가 ' '있지만 때로는 리터럴 개행 문자도 char를 저장하는 데 도움이 될 수 있습니다. 또 다른 (더러운!) 트릭은 에서처럼 몇 개 더 저장하기 위해 여러 번 할당하는 $a=0;$b=0;$a=$b=0입니다.
Dom Hastings

1
조금만 더 약속드립니다. 나는 이것이 당신이 추구하는 일종의 정보이기를 바랍니다! 함수 호출시 괄호가없는 것은 꽤 표준적인 변경이므로 substr($_,0,1)가능합니다 substr$_,0,1. Postfix for loops 및 checks가 for(@c){...}vs와 같이 유용 ...for@c할 수 있지만 ;코드에서 사용할 수없는 경우 대신 쉼표를 분리해야합니다 (함수를 호출 할 때 항상 작동하지는 않습니다). codegolf.stackexchange.com/questions/5105/… 에도 많은 유용한 팁이 있습니다 . 행운을 빕니다!
Dom Hastings

5

파이썬 2, 394 바이트

프로그램을 실행하고 예를 들어 표준 입력에 붙여 넣습니다. "E2,N4,E5,S2,W1,S3"

m=input().split(',')
def f(x,y,h,o,s=[]):
 for c in m:
  for _ in range(int(c[1:])):
   a,b,l={'E':(1,0,'>'),'W':(-1,0,'<'),'N':(0,1,'^'),'S':(0,-1,'v')}[c[0]]
   if o:o[h-y][x]=l
   s+=[(x,y)];x+=a;y+=b
 if o:o[h-y+b][x-a]='X'
 return s
p,q=zip(*f(*[0]*4))
w,h=max(p)-min(p),max(q)-min(q)
o=[[' ']*-~w for _ in range(h+1)]
f(-min(p),-min(q),h,o)
print'\n'.join(["".join(l).rstrip()for l in o])

이것은 매우 최적화되지 않았습니다. 먼저 경로를 기록하기 위해 입력을 통해 실행됩니다. 그런 다음의 올바른 시작 위치와 크기를 결정하기 위해 수학을 수행합니다 o. 그런 다음 다시 통해 실행하고 적절한 항목 설정 o의 하나를 >v<^X. 주된 영리함은이 두 순회에 대해 동일한 기능을 재사용하는 것입니다.


4

XQuery 3.0, 498

declare variable $v external;let $m:=<v>{tokenize($v,',')!(for $j in(1 to xs:int(substring(.,2)))return<c>{translate(substring(.,1,1),'NESW','^>v<')}</c>)}</v>/c!(let $p:=./preceding-sibling::c return<p x="{count($p[.='>'])-count($p[.='<'])}" y="{count($p[.='v'])-count($p[.='^'])}">{if(./following::*)then .else'X'}</p>)for $y in(min(xs:int($m/@y))to max(xs:int($m/@y)))return string-join(for $x in(min(xs:int($m/@x))to max(xs:int($m/@x)))let $d:=$m[@x=$x and @y=$y]return if($d)then$d else' ','')

XQuery는 경쟁이 적지 않기 때문에 재미있었습니다.

언 골프

declare variable $v external;
let $map := <vector>{ tokenize($v,',') ! 
        (for $j in (1 to xs:int(substring(.,2)))
            return <step>{ translate(substring(.,1,1),'NESW','^>v<') }</step> ) 
         }</vector>/step !
            (let $path_so_far := ./preceding-sibling::step
            return <point 
                x="{ count($path_so_far[.='>']) - count($path_so_far[.='<']) }" 
                y="{ count($path_so_far[.='v']) - count($path_so_far[.='^']) }">
                {if(./following::*) then string(.) else 'X'}
            </point>)
for $y in (min(xs:int($map/@y)) to max(xs:int($map/@y)))
return string-join(
    for $x in (min(xs:int($map/@x)) to max(xs:int($map/@x)))
    let $d := $map[@x=$x and @y=$y]
    return if($d) then string($d) else ' '
    ,'')

4

PHP, 496 514 528

PHP에서 행운을 시험해 보았습니다. 결과는 다소 길지만 여전히 재미있게 게시하고 싶습니다.

function a($c){global$a,$b;$a[$b[1]][$b[0]]=$c;}$c=explode(',',$argv[1]);$a=[];$b=[0,0];foreach($c as$d=>$e){$f=substr($e,1);if($d==count($c)-1)$f--;for($i=0;$i++<$f;){if($e[0]==N){a('^');$b[1]--;}elseif($e[0]==E){a('>');$b[0]++;}elseif($e[0]==S){a(v);$b[1]++;}else{a('<');$b[0]--;}}}a(X);$d=$e=$f=$g=0;foreach($a as$y=>$h){$f=min($f,$y);$g=max($g,$y);foreach($h as$x=>$i){$d=min($d,$x);$e=max($e,$x);}}for($y=$f;$y<=$g;$y++){for($x=$d;$x<=$e;$x++)echo isset($a[$y][$x])?$a[$y][$x]:' ';echo "
";}

언 골프

<?php

    function setInMap($char) {
        global $map, $position;
        $map[$position[1]][$position[0]] = $char;
    }

    $instructions = explode(',', $argv[1]);

    $map = [];

    $position = [0, 0];

    foreach($instructions as $index => $instruction) {
        $count = substr($instruction, 1);
        if($index === count($instructions) - 1) {
            $count--;
        }
        for($i = 0; $i < $count; $i++) {
            if($instruction[0] === 'N') {
                setInMap('^');
                $position[1]--;
            } elseif($instruction[0] === 'E') {
                setInMap('>');
                $position[0]++;
            } elseif($instruction[0] === 'S') {
                setInMap('v');
                $position[1]++;
            } else($instruction[0] === 'W') {
                setInMap('<');
                $position[0]--;
            }
        }
    }
    setInMap('X');

    $minX = $maxX = $minY = $maxY = 0;
    foreach($map as $y => $row) {
        $minY = min($minY, $y);
        $maxY = max($maxY, $y);
        foreach($row as $x => $cell) {
            $minX = min($minX, $x);
            $maxX = max($maxX, $x);
        }
    }
    for($y = $minY; $y <= $maxY; $y++) {
        for($x = $minX; $x <= $maxX; $x++) {
            if(isset($map[$y][$x])) {
                echo $map[$y][$x];
            } else {
                echo ' ';
            }
        }
        echo "\n";
    }

?>

1
많이 줄일 수 있습니다. 예를 들어, 쓸 수 있고 for(;$i++<$f;)불필요한 괄호를 제거 N하고 문자열 ( 'N') 대신 정의되지 않은 상수 ( )를 사용할 수 있습니다 .
Blackhole

1
ifs 대신에 trenary operator 또는 logical ands를 사용해보십시오. 또한 PHP4.1을 사용하고 포인트가있는 GET 배열을 사용하면 도움이됩니다.
Ismael Miguel

3

자바 스크립트 (ES6), 244 249 274

조인 호출의 끝 근처에있는 개행을 제외하고 명확하고 추가 된 선행 공백과 개행 은 중요하고 계산됩니다.

스 니펫 실행 테스트 (ECMAScript 6, Firefox 및 Safari 9 만 해당)

F=m=>(
  x=y=0,p=[],
  m.replace(/\w(\d+)/g,(d,z)=>{
    for(d='NWSE'.search(d[0]);
        z--&&(p=~x?~y?p:[y=0,...p]:p.map(r=>' '+r,x=0));
        p[u=y]=(w=r.slice(0,x))+'^<v>'[d]+(v=r.slice(x+1)),
        d&1?x+=d-2:y+=d-1)
      for(r=p[y]||'';!r[x];)r+=' ';
  }),
  p[u]=w+'X'+v,
  p.join`
`
)

// TEST

out=x=>O.innerHTML+=x.replace(/</g,'&lt;')+'\n'

;['S5,W2','N1,E1,S1,E1,N1,E1,S2','N1','N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2','E21,S2','N12,E11,S12,W2,N4']
.forEach(a=>out(a+'\n'+F(a)+'\n'))
<pre id=O></pre>


2

C, 557

main(_,a,minX,maxX,minY,maxY,x,y,v,dir,dist)char**a;char*v;{char o[998][999];for(y=0;y-998;++y){for(x=0;x-998;++x)o[y][x]=32;o[y][998]=0;}y=x=minY=minX=maxY=maxX=499;v=a[1];while(*v){dir=*v++;dist=atoi(v);while(*v&&*v!=44)v++;v+=!!*v;if(dir==78){while(dist--)o[y--][x]=94;if(y<minY)minY=y;y+=!*v;}if(dir==69){while(dist--)o[y][x++]=62;if(x>maxX)maxX=x;x-=!*v;}if(dir==83){while(dist--)o[y++][x]=86;if(y>maxY)maxY=y;y-=!*v;}if(dir==87){while(dist--)o[y][x--]=60;if(x<minX)minX=x;x+=!*v;}}o[y][x]=88;for(y=minY;y<=maxY;++y){o[y][maxX+1]=0;puts(o[y]+minX);}}

언 골프 버전 :

#include <stdio.h>

#define MAX_WIDTH 998
#define MAX_HEIGHT 998

int main(int argc, char *argv[]) {
    int minX,maxX,minY,maxY;
    int x,y;
    char output[MAX_HEIGHT][MAX_WIDTH+1];
    char *v;

    for (y=0; y<MAX_HEIGHT; ++y) {
        for (x=0; x<MAX_WIDTH; ++x) 
            output[y][x] = ' ';
        output[y][MAX_WIDTH] = 0;
    }

    x = minX = maxX = MAX_WIDTH/2;
    y = minY = maxY = MAX_HEIGHT/2;

    v = argv[1];
    while (*v) {
        char dir; int dist;
        dir = *(v++);
        dist = atoi(v);
        while (*v && *v != ',') v++;
        if (*v) v++;

        switch (dir) {
            case 'N':case 'n':
                while (dist--) output[y--][x] = '^';
                if (y < minY) minY = y;
                if (!*v) y++;
                break;
            case 'E':case 'e':
                while (dist--) output[y][x++] = '>';
                if (x > maxX) maxX = x;
                if (!*v) x--;
                break;
            case 'S':case 's':
                while (dist--) output[y++][x] = 'v';
                if (y > maxY) maxY = y;
                if (!*v) y--;
                break;
            case 'W':case 'w':
                while (dist--) output[y][x--] = '<';
                if (x < minX) minX = x;
                if (!*v) x++;
                break;
        }
    }

    output[y][x] = 'x';
    for (y = minY; y <= maxY; ++y) {
        output[y][maxX+1] = 0;
        puts(output[y]+minX);
    }

    return 0;
}

동적 메모리 할당은 그다지 어렵지 않지만 malloc은 코드 골프에 사용하기에는 너무 길다. C에서 골프를하기 위해 법적으로 자동 포함 된 일종의 PCG.h 헤더가 있어야한다고 생각합니다.


1

그루비, 359

c=args[0].split(',').collect{[it[0],it[1..-1]as int]}
m=[[]]
x=y=0
d=["N":["^",0,1],"S":["v",0,-1],"E":[">",1,0],"W":["<",-1,0]]
c.each{z->(1..z[1]).each{if(x<0){m*.add(0," ");x=0};if(y<0){m.add(0,[]);y=0};m[y]=m[y]?:[];m[y][x]=d[z[0]][0];if(c.last()==z&&it==z[1])m[y][x]='X';y+=d[z[0]][2];x+=d[z[0]][1]}}
m.reverse().each{println it.collect{it?:" "}.join()}

1

커먼 리스프-603

(lambda(s)(do((x 0)i(y 0)j(p 0)r(q 0)(g(mapcar(lambda(x)`(,(aref x 0),(parse-integer x :start 1)))(split-sequence:split-sequence #\, s))(cdr g))c)((not g)(setf x 0 y 0)(dolist(e(stable-sort(sort r #'<= :key #'car)#'< :key #'cadr))(dotimes(_(-(cadr e)p y))(terpri)(incf y)(setf x 0))(dotimes(_(-(car e)q x))(princ" ")(incf x))(princ(caddr e))(incf x)))(case(caar g)(#\N(setf i 0 j -1 c #\^))(#\E(setf i 1 j 0 c #\>))(#\W(setf i -1 j 0 c #\<))(#\S(setf i 0 j 1 c #\v)))(dotimes(_(-(cadar g)(if(cdr g)0 1)))(push`(,x,y,c)r)(incf x i)(incf y j))(setf q(min q x)p(min p y))(unless(cdr g)(push`(,x,y #\X)r))))

배열없는 구현 : 왼쪽에서 오른쪽으로 위에서 아래로 인쇄합니다.

  • 방향을 (x y char)요소 추적으로 구문 분석하고 확장 합니다.

    간단한 "N3"입력으로 ((0 0 #\^) (0 -1 #\^) (0 -2 #\X))

  • 또한 최소값을 계산 x하고y
  • 결과 추적을 y먼저 정렬 한 다음 정렬x
  • 커서를 이동하면서 정렬 된 목록을 반복

    1. 줄 바꾸기와 공백을 추가하여 현재 커서를 올바른 위치로 이동
    2. 위치에 때 x - minx, y - miny원하는 문자를 인쇄

(loop for input in  '("N6,E6,S6,W5,N5,E4,S4,W3,N3,E2,S2,W1,N2" 
                      "N1,E1,S1,E1,N1,E1,S2" 
                      "N12,E11,S12,W2,N4")
      do (fresh-line)
         (terpri)
      (funcall *fun* input))

결과:

>>>>>>v
^>>>>vv
^^>>vvv
^^^Xvvv
^^^^<vv
^^^<<<v
^^<<<<<

>v>v
^>^X

>>>>>>>>>>>v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^          v
^        X v
^        ^ v
^        ^ v
^        ^<<

1

CoffeeScript, 303   285 바이트

Y=(s)->o=[];t=l=x=y=0;q='';q+=s[0]for[1..s[1..]]for s in s.split ',';q=q[..-2];(i='NWSE'.search c;(o[y]?=[])[x]='^<v>'[i];j=(i&2)-1;x+=j*(i&1);y+=j*(!(i&1));y<t&&t=y;x<l&&l=x)for c in q;(o[y]?=[])[x]='X';((o[y][x]||' 'for x in[l...o[y].length]).join ''for y in[t...o.length]).join '\n'

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