이 도전의 목표 는 주어진 과정을 완료하는 데 필요한 최소의 파업을 반환 하는 프로그램이나 기능 을 작성 하는 것 입니다.
입력
- 코스의 레이아웃은 원하는 방식과 형식으로 전달할 수 있습니다. (콘솔에서 읽기, 입력 매개 변수로 전달, 파일 또는 기타 여러 줄 문자열, 문자열 배열, 2 차원 문자 / 바이트 배열에서 읽음)
- 공의 시작 위치와 구멍도 입력으로 전달할 수 있으며 입력에서 파싱 할 필요가 없습니다. 테스트 사례에서는 실제 위치와 혼동되지 않도록 코스에 포함되어 있습니다.
- 입력 문자가 여전히 고유 문자 (예 : 인쇄 가능한 ASCII 문자)로 인식되는 한 입력 문자를 다른 것으로 다시 맵핑 할 수 있습니다.
산출
- 프로그램은 현명한 형식 (결과를 설명하는 문자열, 정수, 부동 또는 하이쿠)으로 입력으로 전달 된 코스에 대해 최저 점수 (홀에 도달하는 데 필요한 최소 스트라이크)를 반환해야합니다.
- 강좌를 이길 수없는 경우 귀국
-1
(또는 선택 가능한 다른 강박 한 가치는 이길 수없는 강좌에 대해서는 반환되지 않음).
예:
이 예제에서 위치는 0 기반, X / Y, 왼쪽에서 오른쪽으로, 위에서 아래로 표기되지만 결과는 형식에 독립적이므로 원하는 형식을 사용할 수 있습니다.
입력:
###########
# ....#
# ...#
# ~ . #
# ~~~ . #
# ~~~~ #
# ~~~~ #
# ~~~~ o #
# ~~~~ #
#@~~~~ #
###########
Ball (Start-Position): 1/9
Hole (End-Position): 8/7
산출:
8
규칙과 필드
이 과정은 다음과 같은 필드로 구성 될 수 있습니다.
'@'
공 -코스 시작'o'
구멍 -코스의 목표'#'
벽 -벽에 닿으면 공이 멈 춥니 다'~'
물 -피해야합니다'.'
모래 -공이 모래 위에서 즉시 멈 춥니 다' '
얼음 -공이 무언가에 닿을 때까지 계속 미끄러집니다.
게임의 기본 규칙 및 제한 사항 :
- 공은 대각선으로, 왼쪽, 오른쪽, 위아래로 움직일 수 없습니다.
- 공은 물 앞에서, 벽 앞에서, 모래 위에서 그리고 구멍에서 멈추지 않습니다.
- 물 속으로의 샷이 유효하지 않거나 불가능합니다
- 공은 얼음 위에있는 것처럼 건너 뛰지 않고 구멍에 남아있게됩니다.
- 코스는 항상 직사각형입니다.
- 이 코스는 항상 물이나 벽으로 둘러싸여 있습니다 (경계 확인 필요 없음).
- 항상 정확히 하나의 공과 하나의 구멍이 있습니다.
- 모든 코스가 이길 수있는 것은 아닙니다.
- 동일한 (가장 낮은) 점수를 얻는 여러 경로가있을 수 있습니다.
허점과 승리 조건
- 표준 허점 은 금지되어 있습니다
- 프로그램은 종료되어야합니다
- 추가 규칙을 구성 할 수 없습니다 (공을 너무 세게 치면 물 위로 건너 뛰거나 벽에서 튀어 나오거나 모래밭 위로 뛰어 오름, 모서리 주위의 곡선 등)
- 이것은 code-golf 이므로 문자 수가 가장 적은 솔루션이 승리합니다.
- 솔루션은 제공된 모든 테스트 사례를 처리 할 수 있어야합니다. 사용 된 언어의 제한으로 인해 이것이 불가능한 경우 답변에이를 지정하십시오.
테스트 사례
코스 # 1 (2 파업)
####
# @#
#o~#
####
코스 # 2 (불가능)
#####
#@ #
# o #
# #
#####
코스 # 3 (3 회)
~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~
코스 # 4 (2 파업)
#########
#~~~~~~~#
#~~~@~~~#
## . ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########
코스 # 5 (불가능)
~~~~~~~
~... ~
~.@.~.~
~... ~
~ ~ ~.~
~ . .o~
~~~~~~~
더 많은 테스트 사례 :
답변
자바 스크립트 (ES6), 174 바이트
curling currying syntax 에서 입력을 받습니다 ([x, y])(a)
. 여기서 x 와 y 는 시작 위치의 0- 인덱스 좌표이고 a [] 는 0
= ice, 1
= wall, 2
= sand, 3
= hole 및 4
= water를 갖는 정수의 행렬입니다.
0
솔루션이없는 경우 반환 합니다.
p=>a=>(r=F=([x,y],n,R=a[y],c=R[x])=>R[c&(R[x]=4)|n>=r||[-1,0,1,2].map(d=>(g=_=>(k=a[v=Y,Y+=d%2][h=X,X+=~-d%2])||g())(X=x,Y=y)>3?0:k>2?r=-~n:F(k>1?[X,Y]:[h,v],-~n)),x]=c)(p)|r
댓글
p => a => ( // given the starting position p[] and the matrix a[]
r = // r = best result, initialized to a non-numeric value
F = ( // F = recursive function taking:
[x, y], // (x, y) = current position
n, // n = number of shots, initially undefined
R = a[y], // R = current row in the matrix
c = R[x] // c = value of the current cell
) => //
R[ // this will update R[x] once the inner code is executed
c & (R[x] = 4) | // set the current cell to 4 (water); abort if it was
n >= r || // already set to 4 or n is greater than or equal to r
[-1, 0, 1, 2].map(d => // otherwise, for each direction d:
(g = _ => ( // g = recursive function performing the shot by
k = a[ // saving a backup (h, v) of (X, Y)
v = Y, Y += d % 2][ // and updating (X, Y) until we reach a cell
h = X, X += ~-d % 2]) // whose value k is not 0 (ice)
|| g() //
)(X = x, Y = y) // initial call to g() with (X, Y) = (x, y)
> 3 ? // if k = 4 (water -> fail):
0 // abort immediately
: // else:
k > 2 ? // if k = 3 (hole -> success):
r = -~n // set r to n + 1
: // else:
F( // do a recursive call to F():
k > 1 ? // if k = 2 (sand):
[X, Y] // start the next shots from the last cell
: // else (wall):
[h, v], // start from the last ice cell
-~n // increment the number of shots
) // end of recursive call
), x // end of map(); x = actual index used to access R[]
] = c // restore the value of the current cell to c
)(p) | r // initial call to F() at the starting position; return r
답변
파이썬 3 , 273 바이트
def p(g,c,d,k=0):
while 1>k:c+=d;k=g.get(c,9)
return-(k==2)or c-d*(k==3)
def f(g):
c={q for q in g if g.get(q,9)>4};I=0;s=[c]
while all(g.get(q,9)-4for q in c):
c={k for k in{p(g,k,1j**q)for k in c for q in range(4)}if-~k}
if c in s:return-1
s+=[c];I+=1
return I
ovs 덕분에 -41 바이트-Jonathan
Frech 덕분에 -1 바이트
답변
C #, 461 418 바이트
이것은이 도전을 (희망적으로) 부활시키기위한 비 경쟁적 참조 구현입니다.
케빈 크루이 센 골프
int P(string[]C){int w=C[0].Length,i=0,l=c.Length;var c=string.Join("",C);var h=new int[l];for(var n=new List<int>();i<l;n.Add(i++))h[i]=c[i]!='@'?int.MaxValue:0;for(i=1;;i++){var t=n;n=new List<int>();foreach(int x in t){foreach(int d in new[]{-1,1,-w,w}){for(int j=x+d;c[j]==' ';j+=d);if(c[j]=='#'&h[j-d]>s){h[j-d]=s;n.Add(j-d);}if(c[j]=='.'&h[j]>s){h[j]=s;n.Add(j);}if(c[j]=='o')return s;}}if(n.Count<1)return -1;}}
언 골프
int IceGolf(string[] course)
{
// Width of the course
int w = course[0].Length;
// Course as single string
var c = string.Join("", course);
// Array of hits per field
var hits = new int[c.Length];
// Fields to continue from
var nextRound = new List<int>();
// Initialize hits
for (int i = 0; i < hits.Length; i++)
{
if (c[i] != '@')
// All fields start with a high value
hits[i] = Int32.MaxValue;
else
{
// Puck field starts with 0
hits[i] = 0;
nextRound.Add(i);
}
}
for (int s = 1; ; s++)
{
// clear the fields that will be used in the next iteration
var thisRound = nextRound;
nextRound = new List<int>();
foreach (int i in thisRound)
{
// test all 4 directions
foreach (int d in new[] { -1, 1, -w, w })
{
int j = i+d;
// ICE - slide along
while (c[j] == ' ')
j += d;
// WALL - stop on previous field
if (c[j] == '#' && hits[j-d] > s)
{
hits[j-d] = s;
nextRound.Add(j-d);
}
// SAND - stop
if (c[j] == '.' && hits[j] > s)
{
hits[j] = s;
nextRound.Add(j);
}
// HOLE return strikes
if (c[j] == 'o')
return s;
}
}
// No possible path found
if (nextRound.Count == 0)
return -1;
}
}