Код Гольф: движение в 3-х измерениях - PullRequest
0 голосов
/ 20 августа 2010

Предполагая трехмерную нерегулярную матрицу, где 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.

Ответы [ 2 ]

2 голосов
/ 23 августа 2010

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 move.

Вывод для x = 1000:

0,0,0
0,1500,375//+557424868,+557424868,+557424868
1 move.

Похоже, что поиск можно заменить некоторым простым алгебраическим уравнением.Но зачем останавливаться на достигнутом?Правила в гольфе легче сгибать, чем выполнять реальную работу.

Итак, при условии, что всегда есть один ответ на один ход, и мне не нужно раскрывать «количество мест, которые вы переместили», здесьэто 68-символьный гольф-ответ:

x=...print("0,0,0\n0,"..(x*3/2)..","..math.ceil(x*3/8).."\n1 move.")
0 голосов
/ 22 августа 2010

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

alt text

Не уверен, что я следую правилам ...

...