defmodule Ant do
@enforce_keys [:azimuth, :x, :y]
defstruct [:azimuth, :x, :y]
def walk(_current, "PREPARE"), do: %__MODULE__{azimuth: 0, x: 0, y: 0}
def walk(%__MODULE__{azimuth: az} = old, "TURN " <> num) do
{rot, ""} = Integer.parse(num)
%{old | azimuth: rem(az + rot, 360)}
end
def walk(%__MODULE__{azimuth: az, x: x, y: y}, "MOVE " <> num) do
{steps, ""} = Integer.parse(num)
a = az / 180.0 * :math.pi()
dx
= :math.
sin(a
) * steps
dy
= :math.
cos(a
) * steps
%__MODULE__{azimuth: az, x: x + dx, y: y + dy}
end
def length
(%__MODULE__
{x
: x
, y
: y
}), do: :math.
sqrt(x
* x
+ y
* y
)end
:stdio
|> IO.stream(:line)
|> Stream.map(&String.trim/1)
|> Enum.reduce(nil, &Ant.walk(&2, &1))
|> Ant.length
|> Float.round(2)
ZGVmbW9kdWxlIEFudCBkbwogIEBlbmZvcmNlX2tleXMgWzphemltdXRoLCA6eCwgOnldCiAgZGVmc3RydWN0IFs6YXppbXV0aCwgOngsIDp5XQoKICBkZWYgd2FsayhfY3VycmVudCwgIlBSRVBBUkUiKSwgZG86ICVfX01PRFVMRV9fe2F6aW11dGg6IDAsIHg6IDAsIHk6IDB9CiAgCiAgZGVmIHdhbGsoJV9fTU9EVUxFX197YXppbXV0aDogYXp9ID0gb2xkLCAiVFVSTiAiIDw+IG51bSkgZG8KICAgIHtyb3QsICIifSA9IEludGVnZXIucGFyc2UobnVtKQoKICAgICV7b2xkIHwgYXppbXV0aDogcmVtKGF6ICsgcm90LCAzNjApfQogIGVuZAogIAogIGRlZiB3YWxrKCVfX01PRFVMRV9fe2F6aW11dGg6IGF6LCB4OiB4LCB5OiB5fSwgIk1PVkUgIiA8PiBudW0pIGRvCiAgICB7c3RlcHMsICIifSA9IEludGVnZXIucGFyc2UobnVtKQogICAgYSA9IGF6IC8gMTgwLjAgKiA6bWF0aC5waSgpCiAgICBkeCA9IDptYXRoLnNpbihhKSAqIHN0ZXBzCiAgICBkeSA9IDptYXRoLmNvcyhhKSAqIHN0ZXBzCgogICAgJV9fTU9EVUxFX197YXppbXV0aDogYXosIHg6IHggKyBkeCwgeTogeSArIGR5fQogIGVuZAoKICBkZWYgbGVuZ3RoKCVfX01PRFVMRV9fe3g6IHgsIHk6IHl9KSwgZG86IDptYXRoLnNxcnQoeCAqIHggKyB5ICogeSkKZW5kCgo6c3RkaW8KfD4gSU8uc3RyZWFtKDpsaW5lKQp8PiBTdHJlYW0ubWFwKCZTdHJpbmcudHJpbS8xKQp8PiBFbnVtLnJlZHVjZShuaWwsICZBbnQud2FsaygmMiwgJjEpKQp8PiBBbnQubGVuZ3RoCnw+IEZsb2F0LnJvdW5kKDIpCnw+IElPLnB1dHM=