내 아보카도 주스 도와주세요


14

이 도전에서, 나는 아보카도의 필드를 가졌으며 가능한 한 빨리 그리고 완전히 주스를 만들고 싶습니다. 모든 아보카도를 완벽하게 주스하는 방법을 알아내는 데 도움이되는 프로그램이나 기능을 작성할 수 있습니까?

입력으로 아보카도를 mx m정사각형 격자 로 얻을 수 있습니다. 여기서 m3과 6 사이의 정수입니다. 각 정사각형에는 정확히 하나의 아보카도가 포함되어 있습니다. 아보카도에는 여러 단계의 육즙이 있습니다.

1 단계 : 아보카도가 전혀 주스되지 않았습니다.
2 단계 : 아보카도가 부분적으로 즙이되었습니다.
3 단계 : 아보카도가 완전히 즙이되었습니다.
4 단계 : 과즙으로 인해 아보카도가 폭발했습니다.

Juicing Tool을 사용하면 해당 Juicing Tool의 적용 영역에있는 아보카도가 다음 단계로 이동합니다. 폭발 아보카도는 많은 힘을 가지고 있으며 전체 아보카도 필드를 파괴하므로 아보카도가 폭발하지 않도록하십시오!

다음은 아보카도 그리드의 예입니다. 이 예에서는 언어에 맞게 좌표계를 조정할 수 있지만 0,0왼쪽 하단 모서리의 좌표와 2,2오른쪽 상단 모서리 의 좌표 를 사용했습니다.

112
221
231

목표는 모든 아보카도를 완벽하게 주스로 만드는 것입니다 (즉, 3 단계). 이것을 달성하기 위해 당신은 당신의 소유에 세 가지 다른 juicing 도구가 있습니다. 각 juicing 도구는 다른 효과 영역을 갖지만 영향을받는 아보카도의 juiciness를 1 씩 증가시킵니다.

다음은 귀하가 사용할 수있는 모든 도구입니다. 공구의 첫 글자를 지정한 다음 과즙 짜는 좌표를 지정하여 과즙 짜는기구를 사용합니다. 예를 들어, 슬라이서를 square 5,2에서 사용하려면을 출력 S 5,2합니다.

슬라이서 : 대상 좌표와 아보카도를 양쪽에 주스로 만듭니다.

112     112     112
221 --> XXX --> 332
231     231     231

강판 : 대상 좌표와 아보카도를 위아래로 주스로 만듭니다.

112     1X2     122
221 --> 2X1 --> 231 --> kaboom!
231     2X1     241

로켓 발사기 : 목표 좌표와 모든 인접한 아보카도를 주스로 만듭니다.

112     1X2     122
221 --> XXX --> 332
221     2X1     231

샘플 입력 및 출력

323
212
323

G 1,1
S 1,1

3312
3121
1213
2133

R 0,0
R 1,1
R 2,2
R 3,3

22322
22222
22222
33233
33333

G 0,3
G 1,3
G 2,2
G 3,3
G 4,3

222332
333221
222332
333222
222333
333222

S 1,5
S 1,3
S 1,1
S 4,5
S 4,3
S 4,1
G 5,4

명시 적으로 말하지는 않지만 솔루션이 가장 적은 움직임을 취해야합니까?
FryAmTheEggman

1
이것은 샌드 박스의 일부 구성 주석을 무시했습니다. 하나는 다음과 같습니다. 사용자가 유연하게 좌표 시스템을 선택할 수 있도록해야한다고 가정합니다 (예 : 원점이 0- 인덱스 또는 1- 인덱스 인 경우).
Greg Martin

3
@Pavel은 답변이나 질문으로 게시하지 않은 것에 대해 대단히 감사합니다.
NoOneIsHere 여기

1
나는이 질문을보고 다운 보트, VTC 및 스팸으로 플래그를 지정할 준비가되었습니다. 대신 +1.
NoOneIsHere 여기

1
@Pavel 나는 제목을 만들기 위해 너무 유혹 했다 ...
absinthe

답변:


1

Mathematica — 350 바이트

매우 짧은 해결책은 아니지만 전혀 해결책이없는 것보다 낫습니다.

t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}];""<>Cases[StringReplace[(First@Solve[(Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]/.(G|S|R)[___,0|n+1,___]->0)==3-#&&And@@t[#[i,j]>=0&],t[#[i,j]&],Integers])/.{(x_->m_):>ToString[m x]},{"["->" ","]"->"\n",", "->","}],Except@"0"]&

더 읽기 쉬운 버전 (공백과 들여 쓰기 및 추가 공간 포함) :

t[x_] := Flatten@Table[x /@ {G, S, R}, {i, n}, {j, n}]; 
"" <> Cases[
   StringReplace[(First@
       Solve[(Table[
             G[i, j] + G[i - 1, j] + G[i + 1, j] + S[i, j] + 
              S[i, j - 1] + S[i, j + 1] + R[i, j] + R[i - 1, j] + 
              R[i + 1, j] + R[i, j - 1] + R[i, j + 1], {i, 
              n = Length@#}, {j, n}] /. (G | S | R)[___, 
              0 | n + 1, ___] -> 0) == 3 - # && 
         And @@ t[#[i, j] >= 0 &], t[#[i, j] &], 
        Integers]) /. {(x_ -> m_) :> ToString[m x]}, {"[" -> " ", 
     "]" -> "\n", ", " -> ","}], Except@"0"] &

입력은 배열 (예 :) {{3,2,3},{2,2,2},{3,2,3}}이고 출력은 문자열입니다 (마지막 줄 바꿈-허용 할 수없는 경우 StringDrop[...,-1]추가 15 바이트 동안 함수를 묶습니다 ). (1,1)은 왼쪽 위 모서리이고 (n, n)은 오른쪽 아래입니다 (여기서 n은 행렬의 차원 임)라는 좌표계를 사용했습니다. 때로는 솔루션에서 동일한 작업을 여러 번 수행해야하는 경우 출력 3 G 2,2에 "(2,2)에서 강판 사용" 과 같은 내용이 포함 됩니다.이 경우에 수행 할 작업을 말하지 않았기 때문에 괜찮아.

설명:

  • Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}](i, j)에서 강판을 사용하여 영향을받는 각 위치에 변수 G [i, j]가 포함 된 배열을 만들고 S [i, j] 및 R [i, j]에 대해서도 비슷합니다. 이 변수는 해당 위치에서 공구가 사용 된 횟수를 나타냅니다.
  • .../.(G|S|R)[___,0|n+1,___]->0 아보카도 필드 외부에서 도구를 사용하는 효과를 제거합니다.
  • ...==3-# 입력과 완벽하게 주스를 낸 아보카도 필드의 차이와 비교합니다.
  • ...&&And@@t[#[i,j]>=0&]변수 G [i, j], S [i, j], R [i, j]는 속기를 사용하여 음수가 아니어야합니다 (아보카도 주스를 풀 수 없습니다!) t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}].
  • First@Solve[...,t[#[i,j]&],Integers] 변수 G [i, j], S [i, j], R [i, j]의 관점에서 방정식에 대한 첫 번째 정수 솔루션을 찾습니다.
  • /.{(x_->m_):>ToString[m x]} 솔루션을 멋진 문자열 형식으로 만드는 동시에 0과 동일한 변수를 숨 깁니다.
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]문자열을 같은 문자열 "2 G[1, 4]"로 바꾸고 "2 G 1,4"끝에 줄 바꿈을 추가합니다.
  • ""<>Cases[...,Except@"0"]남은 모든을 제거하고 모든 "0"문자열을 결합합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.