모험가 모험


12

도전

당신의 임무는 소름 끼치는 (예 : 할로윈) 미로를 통해 모험가를 움직여 애니메이션을 만드는 것입니다. Adve는 ; 그는 성격이 유동적이기 때문에 다른 인물로 대표되는 것을 신경 쓰지 않습니다.

Adve를 애니메이션하기 위해 각 프레임을 인쇄합니다. 프레임은 현재 위치가있는지도입니다. Adve는 매 턴마다 한 칸 앞으로 움직이며 역 추적하지 않습니다. 그는 첫 번째 줄에서 시작하여 마지막 줄에서 끝납니다.

입력

구분 기호 또는 문자열 배열이있는 문자열과 같은 합리적인 형식입니다. 입력이 가능한 경로가 하나만 포함 된 3 * 3보다 큰 맵이라고 가정 할 수 있습니다. 존재하는 유일한 문자는 #입니다.

산출

프레임.

미로 예 ( ok ... 미로 )

여기에 Adve가없는지도가 있습니다. 첫 번째 프레임과 마지막 프레임은이 빈 맵입니다 (이 맵은 9x15입니다).

### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!

이에 대한 정확한 출력은 여기 (37 프레임) 에서 확인할 수 있습니다 .

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다!


첫 번째 행과 마지막 행에 항상 하나의 빈 셀이 있습니까? 항상 가능한 단일 경로가 있습니까 (분기 없음)?
Luis Mendo

@LuisMendo, 그렇습니다. "하나의 가능한 경로"가 있습니다
Daniel

1
입구는 항상 상단에 있습니까?
Destructible Lemon

@DestructibleWatermelon, 예, 출구는 바닥에 있습니다.
Daniel

4
그의 진짜 이름은 Dave이지만, 그는 모두 혼란스러워합니다.
mbomb007

답변:


4

펄, 84 바이트

30 바이트 정도 골프를 즐길 수있는 올바른 방향으로 안내해 주신 @Ton Hospel 에게 감사드립니다 !

바이트 수에는 82 바이트의 코드와 -0p플래그가 포함됩니다.

/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  

마지막 공백은 두 개이며 마지막 줄 바꿈은 없습니다 (그렇지 않으면 작동하지 않습니다).

Adve가 나가는 데 필요한 모든 프레임을 출력으로 미로를 입력으로 가져옵니다. 후자는 utf8이 아니므로 펄은 기본적으로 utf8을 사용하지 않기 때문에 Adve는 a &대신에 있습니다. -0pE플래그로 실행하십시오 :

perl -0pE '/.*/;say y/A/ /r;s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:y;A&;  ' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

눈을 위해 , 나는 또한이 애니메이션 버전을 만들었습니다. 약간 더 길지만 각 인쇄와 수면 사이의 터미널을 0.15 초간 지우면 Adve가 실제로 움직이는 것처럼 보일 것입니다.

perl -0nE 'system(clear);/.*/;say y/A/ /r;select($,,$,,$,,0.15);s/&(.{@{+}})? /A$1&/s||s/ (.{@{+}})?&/&$1A/s||s/ /&/?redo:say"\e[H",y/A&/  /r' <<< "### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###"

나는 그것이 최고의 알고리즘이라고 생각하지만 여전히 20 바이트 이상으로 다운 될 수있다.
Ton Hospel

@TonHospel -9 바이트 (지금까지는 제거했지만 성공적인 정규 표현식이 발생 하는 경우에만 변경되며 1 또는 2 바이트 를 저장하는 대신 변경됨)를 $s="@+"알지 못했습니다 . 골프를 더 잘하는 방법에 대한 힌트가 있습니까? 나는 어떻게 든 그것들을 제거 하거나 더 짧게 만들어야한다고 생각합니다. @+redowhiley///s///
Dada

@TonHospel (그러나 당신이 해결책을 연구하고 그것을 게시하고 싶다면, 같은 알고리즘이거나 무언가이기 때문에 그것을 잡지 마십시오.) 전혀 신경 쓰지 않을 것입니다;))
Dada

정규 표현식 변수가 루프에 유지되거나 유지되지 않는 방법은 매우 미묘합니다. 은 y///당신이 방향을 표시하는 뭔가가 필요하기 때문에 괜찮 그러나 주요 개선이 결합 대체에서 올 것이다 (그러나 당신이 선택할 수가 통지하는 측)
톤 Hospel

@TonHospel 실제로, 나는 그것을 보았지만, 결합하기 위해 정규 표현식이 아닌 것을 알기 위해 결합 s/ &/&A/하고 s/& /A&/함께 (그리고 다음 옆에) 너무 열심히 노력했습니다 ! 고마워요! (골프 방법을 알려 주셔서 감사합니다!)
Dada

3

자바 스크립트 (ES6), 137

(1 바이트 절약 @ETHproductions)

m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`
`)||[...r,m]

덜 골프

m=>{
  d = o = 1+m.search`\n`; // offset to next row and starting direction
  p = m.search` `-o; // starting position, 1 row above the first
  for( r=[m]; // r is the output array, start with empty maze
       // try moving in 3 directions (no back)
       // if no empty cell found, we have exit the maze
       [d,o/d,-o/d].some(q => 1/m[d=q,q+=p]? p=q : 0);
       r.push(q.join``) // add current frame
     )
     q=[...m], q[p] = 0; // build frame, '0' used to mark Adve position
  return [...r,m] // add last frame with maze empty again
}

테스트

F=
m=>(o=>{for(p=m.search` `-o,r=[m];[d,o/d,-o/d].some(q=>1/m[d=q,q+=p]?p=q:0);r.push(q.join``))(q=[...m])[p]=0})(d=1+m.search`\n`)||[...r,m]

function go() {
  var i=I.value,r=F(i),
      frame=x=>(x=r.shift())&&(O.textContent=x,setTimeout(frame,100))
  frame()
}

go()
#I { width:10em; height: 19em; font-size:10px}
#O { white-space:pre; font-family: monospace; font-size:10px; vertical-align: top; padding: 4px}
<table><tr><td>
<textarea id=I>### #####
##  #####
## ######
##      #
####### #
#   ### #
# # #   #
# #   ###
# #######
#    ####
#### ####
####  ###
##### ###
##### ###
##### ###
</textarea><button onclick='go()'>go</button></td><td id=O></td></tr></table>


어리 석아, 감사합니다 @ETHproductions
edc65

훌륭한 일. 아마 약 160 바이트가되었을 것입니다.
ETHproductions
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.