fork download
  1. defmodule Ant do
  2. @enforce_keys [:azimuth, :x, :y]
  3. defstruct [:azimuth, :x, :y]
  4.  
  5. def walk(_current, "PREPARE"), do: %__MODULE__{azimuth: 0, x: 0, y: 0}
  6.  
  7. def walk(%__MODULE__{azimuth: az} = old, "TURN " <> num) do
  8. {rot, ""} = Integer.parse(num)
  9.  
  10. %{old | azimuth: rem(az + rot, 360)}
  11. end
  12.  
  13. def walk(%__MODULE__{azimuth: az, x: x, y: y}, "MOVE " <> num) do
  14. {steps, ""} = Integer.parse(num)
  15. a = az / 180.0 * :math.pi()
  16. dx = :math.sin(a) * steps
  17. dy = :math.cos(a) * steps
  18.  
  19. %__MODULE__{azimuth: az, x: x + dx, y: y + dy}
  20. end
  21.  
  22. def length(%__MODULE__{x: x, y: y}), do: :math.sqrt(x * x + y * y)
  23. end
  24.  
  25. :stdio
  26. |> IO.stream(:line)
  27. |> Stream.map(&String.trim/1)
  28. |> Enum.reduce(nil, &Ant.walk(&2, &1))
  29. |> Ant.length
  30. |> Float.round(2)
  31. |> IO.puts
Success #stdin #stdout 0.36s 31716KB
stdin
PREPARE
MOVE 100
TURN 270
MOVE 100
stdout
141.42