Код Гольф: движение в трех измерениях
Предполагая трехмерную нерегулярную матрицу, где 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
Не уверен, что я следую правилам...