defmodule Main do def main do IO.read(:line) |> String.trim() |> String.split("/") |> Enum.map(&String.to_integer/1) |> solve |> IO.puts() end defp solve([year, month, day]) do [year, month, day + 2] |> fix_day_and_month |> fix_month_and_year |> format_result end defp fix_day_and_month([year, month, day]) when month == 2 do cond do uruh?(year) && day > 29 -> [year, month + 1, day - 29] !uruh?(year) && day > months(month - 1) -> [year, month + 1, day - months(month - 1)] true -> [year, month, day] end end defp fix_day_and_month([year, month, day]) do cond do day > months(month - 1) -> [year, month + 1, day - months(month - 1)] true -> [year, month, day] end end defp fix_month_and_year([year, month, day]) do cond do month > 12 -> [year + 1, month - 12, day] true -> [year, month, day] end end defp uruh?(year) do rem(year, 4) == 0 && (!(year |> rem(100) == 0) || year |> rem(400) == 0) end defp months(month) do [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] |> Enum.at(month) end defp format_result([year, month, day]) do [year, month, day] |> Enum.map(&to_string/1) |> (fn [year, month, day] -> [ year |> String.pad_leading(4, "0"), month |> String.pad_leading(2, "0"), day |> String.pad_leading(2, "0") ] end).() |> Enum.join("/") end end