Skip to content

Instantly share code, notes, and snippets.

@curegit
Created October 19, 2021 08:57
Show Gist options
  • Save curegit/166a7f96a7b8f83f9ca2a84cc3b1ca00 to your computer and use it in GitHub Desktop.
Save curegit/166a7f96a7b8f83f9ca2a84cc3b1ca00 to your computer and use it in GitHub Desktop.
組合せゲーム Forklift の定義 (CGSuite)
class Forklift extends Game
var boxes;
method Forklift(List boxes)
end
method MakeLeftOptions(Number left, Number left2, List right)
if left == 0 then
return Forklift([left2, right].Flatten);
else
return Forklift([left, left2, right].Flatten);
end;
end
method MakeRightOptions(List left, Number right2, Number right)
if right == 0 then
return Forklift([left, right2].Flatten);
else
return Forklift([left, right2, right].Flatten);
end;
end
override method Options(Player player)
n := boxes.Length;
if n <= 1 then
return { };
else
if player == Player.Left then
ops := setof(k for k from 1 to boxes[1] where boxes[1] - k < boxes[2]);
return setof(MakeLeftOptions(boxes[1] - k, boxes[2] + k, listof(boxes[i] for i from 3 to n)) for k in ops);
else
ops := setof(k for k from 1 to boxes[n] where boxes[n - 1] > boxes[n] - k);
return setof(MakeRightOptions(listof(boxes[i] for i from 1 to n - 2), boxes[n - 1] + k, boxes[n] - k) for k in ops);
end;
end;
end
override property ToString.get
return "Forklift(" + boxes.ToString + ")";
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment