Witam. Mam wykonać projekt na informatykę w języku c, ale kompletnie nie wiem o co chodz w tym poleceniu, ani nie wiem jak mam zacząć. Znam podstawy c. Proszę o jakąkolwiek pomoc.
0
0
No to robisz tak, że masz swoją mróweczkę i liczysz pozycję w układzie kartezjańskim w każdym kolejnym kroku. Na sam koniec jedyne co musisz to policzyć odległość z Pitagorasa (bo taką mamy metrykę).
0
Mógłyś podać przykładowe rozwiązanie?
2
A proszę, oczywiście nie gotowiec, bo to byłoby niefair:
defmodule Ant do
@enforce_keys [:azimuth, :x, :y]
defstruct [:azimuth, :x, :y]
@type t :: %__MODULE__{
azimuth: integer(),
x: float(),
y: float(),
}
@spec walk(t() | nil, binary()) :: t()
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
@spec length(t()) :: float()
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)
|> IO.puts
To liczy dla pojedynczego przykładu. Możesz sobie przełożyć na jaki język chcesz (to jest Elixir jakby co) i dodać opcję parsowania wielu ścieżek, zasada będzie taka sama.
EDIT: Ideone ma starą wersję Elixira, więc daję ASCIIcast
EDIT2: Ok, znalazłem, że wcześniej zamiast Integer.mod/2
trzeba było używać Kernel.rem/2
: https://ideone.com/nN7uFp