Код Гольф: движение в трех измерениях

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

Луа, 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.")

Выход для х = 12:

0,0,0
0,18,5 // +455 +455 +455
1 ход.

Выход для х = 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.")

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

альтернативный текст

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

Другие вопросы по тегам