【问题标题】:Code Golf: Movement in 3 DimensionsCode Golf:3维运动
【发布时间】:2010-08-20 19:18:27
【问题描述】:

假设一个 3 维不规则矩阵,其中y = 1.5(x) and z = .5(y)

进一步假设一个对象从0,0,0 开始,并且必须至少在两个维度上正向移动,并且必须在所有三个维度上移动(x+1, y+1, z-1 可以,x+1, y+1, z=z 不行)。它可以移动任意数量的“空格”,但必须在所有方向上移动相同的数量。

允许对象环绕(x(max +1) = x(0))

将所述对象从其起始位置移动到(0, max(y), .5(max(z))) 对于z,向上舍入分数(4、6、3 矩阵中的终点变为 0、6、2)

输入是一个整数 (X)。

输出是您将要进行的移动列表(显示您移动的空间数量是额外的功劳)

示例输入/输出:

X = 4
Y = 6 //(4 * 1.5)
Z = 3 // 6 / 2

0, 0, 0 //Start
2, 5, 2 // (+2, -2, +2)
1, 2, 2 // (+4, +4, +4)
3, 4, 0 // (+2, +2, -2)
1, 6, 2 // (-2, +2, +2)
3, 3, 3 // (-3, -3, -3)
1, 5, 1 // (-2, +2, -2)
0, 6, 2 // (-1, +1, -1)
7 Moves.

【问题讨论】:

  • 所以无论步骤有多优化,“赢家”都是最短的来源?
  • 正确。只要答案是正确的,移动的数量无关紧要。我只是想知道花了多少,因为我就是那种人......
  • 这看起来很奇怪而且毫无意义。这个问题有什么背景故事,有什么能引起我们兴趣的吗?
  • 您的一些示例运动矢量似乎违反了“至少在二维中正向移动”规则
  • 矩阵中的x 等于什么?这是否意味着结尾x 组件始终为0?你认真地需要澄清一切是什么。输入是什么,如何获得最大值,如何获得终点?

标签: language-agnostic code-golf


【解决方案1】:

Lua,68 个字符

下面的长版本总是通过搜索将解决问题的第一个所有积极的举动来解决问题。

x=...
y,z=x*3/2,x*3/4
a,b,c=0,y,math.ceil(z/2)
x,y,z=x+1,y+1,z+1
for i=1,math.huge do
  if (x*i)%y==b and (x*i)%z==c then x=x*i break end
end
print("0,0,0\n0,"..b..","..c.."//+"..x..",+"..x..",+"..x.."\n1 move.")

x = 12 的输出:

0,0,0 0,18,5//+455,+455,+455 1个动作。

x = 1000 的输出:

0,0,0 0,1500,375//+557424868,+557424868,+557424868 1个动作。

似乎可以用一些简单的代数方程代替搜索。但为什么要停在那里?打高尔夫球比做实际工作更容易改变规则。

因此,假设始终只有一个 1 步答案,并且我不必透露“您移动的空格数”,这里是 68 个字符的打高尔夫球答案:

x=...print("0,0,0\n0,"..(x*3/2)..","..math.ceil(x*3/8).."\n1 move.")

【讨论】:

  • 有趣...你证明了这个问题毫无价值:)
【解决方案2】:

Mathematica - 不打高尔夫球

只是看看我们是否可以让球滚动

...并试图理解问题....

f[x_] := (
   (* Init code *)
   xmax = x;
   ymax = 3 Round[xmax]/2;
   zmax = Round[ymax]/2;
   xobj = 0;
   yobj = ymax;
   zobj = Ceiling[zmax/2];
   p = Join[Permutations[{1, 1, -1}], {{1, 1, 1}}];
   Print["X = ", xmax, "\nY = ", ymax, "\nZ = ", zmax];

   (* Loop *)
   i = 0; 
   pos = {0, 0, 0}; 
   k = "Start";
   While[
    (npos= {Mod[pos[[1]], xmax+1], Mod[pos[[2]], ymax+1], Mod[pos[[3]], zmax+1]}) 
             != {xobj, yobj, zobj}, 
      i++;
      Print[npos, " // ", k];
      pos= npos+ (k= RandomInteger[{1,xmax}] p[[RandomInteger[{1, Length[p]}]]]);
   ];
   Print[npos, " // ", k];
   Print[i, " Moves"];
   );

调用

 f[4]

样本输出

X = 4
Y = 6
Z = 3
{0,0,0} // Start
{3,4,3} // {3,-3,3}
{0,0,2} // {-3,3,3}
{2,3,1} // {-3,3,3}
{0,6,2} // {3,3,-3}
4 Moves

不确定我是否遵守规则...

【讨论】:

  • 我不确定有人知道规则,甚至不知道 OP
猜你喜欢
  • 2011-03-01
  • 2011-02-11
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-25
  • 2010-11-23
相关资源
最近更新 更多