帮我给鳄梨榨汁


14

在这个挑战中,我有一个鳄梨领域,我想尽可能快速,完整地榨汁。您可以编写一个程序或函数来帮助我确定如何使所有鳄梨完美地榨汁吗?

作为输入,您将得到鳄梨作为mx m正方形网格,其中m是3到6之间的整数。每个正方形恰好包含一个鳄梨。鳄梨有多汁的阶段:

阶段1:鳄梨根本没有榨汁。
阶段2:鳄梨已部分榨汁。
阶段3:鳄梨已完全榨汁。
阶段4:鳄梨因榨汁过多而爆炸。

当您使用榨汁工具时,该榨汁工具作用范围内的鳄梨将移至下一个阶段。爆炸的鳄梨有很大的力量,会破坏整个鳄梨场,因此请确保没有鳄梨爆炸!

这是鳄梨网格的示例。在这些示例中,我使用了0,0左下角的坐标和右上角的坐标2,2,尽管您可以调整坐标系以适合您的语言。

112
221
231

目的是使所有鳄梨完全榨汁(即阶段3)。为此,您拥有三种不同的榨汁工具。每种榨汁工具都有不同的作用范围,但是它们都会使受影响的鳄梨的多汁程度提高1。

这是您可以使用的所有工具。通过指定工具的第一个字母,然后指定要榨汁的坐标来使用榨汁机。例如,要在正方形上使用切片器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索引的坐标系)。
格雷格·马丁

3
@Pavel非常感谢您没有将其发布为答案或问题。
NoOneIsHere

1
我看到了这个问题,已经准备好投票,VTC并将其标记为垃圾邮件。而是+1。
NoOneIsHere

1
@Pavel我很想拿那个标题……
苦艾酒

Answers:


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)处的刨丝器3次”),因为您在这种情况下没有说要做什么。没关系。

说明:

  • 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]} 隐藏等于零的变量,同时还将解决方案以漂亮的字符串形式放置。
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]将类似的字符串"2 G[1, 4]"转换成类似的字符串"2 G 1,4",并在末尾添加换行符。
  • ""<>Cases[...,Except@"0"]删除所有剩余的"0"s并将所有字符串连接在一起。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.