ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

to Gigasecond in the Elixir Track

Published at Mar 29 2021 · 0 comments
Instructions
Test suite
Solution

Calculate the moment when someone has lived for 10^9 seconds.

A gigasecond is 10^9 (1,000,000,000) seconds.

Running tests

Execute the tests with:

``````\$ mix test
``````

Pending tests

In the test suites, all but the first test have been skipped.

Once you get a test passing, you can unskip the next one by commenting out the relevant `@tag :pending` with a `#` symbol.

For example:

``````# @tag :pending
test "shouting" do
assert Bob.hey("WATCH OUT!") == "Whoa, chill out!"
end
``````

Or, you can enable all the tests by commenting out the `ExUnit.configure` line in the test suite.

``````# ExUnit.configure exclude: :pending, trace: true
``````

If you're stuck on something, it may help to look at some of the available resources out there where answers might be found.

Source

Chapter 9 in Chris Pine's online Learn to Program tutorial. http://pine.fm/LearnToProgram/?Chapter=09

Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

gigasecond_test.exs

``````defmodule GigasecondTest do
use ExUnit.Case

# @tag :pending
test "from 4/25/2011" do
assert Gigasecond.from({{2011, 4, 25}, {0, 0, 0}}) == {{2043, 1, 1}, {1, 46, 40}}
end

@tag :pending
test "from 6/13/1977" do
assert Gigasecond.from({{1977, 6, 13}, {0, 0, 0}}) == {{2009, 2, 19}, {1, 46, 40}}
end

@tag :pending
test "from 7/19/1959" do
assert Gigasecond.from({{1959, 7, 19}, {0, 0, 0}}) == {{1991, 3, 27}, {1, 46, 40}}
end

@tag :pending
test "yourself" do
# customize these values for yourself
# your_birthday = {{year1, month1, day1}, {0, 0, 0}}
# assert Gigasecond.from(your_birthday) == {{year2, month2, day2}, {hours, minutes, seconds}}
end
end``````

test_helper.exs

``````ExUnit.start()
ExUnit.configure(exclude: :pending, trace: true)``````
``````defmodule Gigasecond do
@doc """
Calculate a date one billion seconds after an input date.
"""
@spec from({{pos_integer, pos_integer, pos_integer}, {pos_integer, pos_integer, pos_integer}}) ::
:calendar.datetime()

def from({{year, month, day}, {hours, minutes, seconds}}) do

one_gigasecond = 1000000000

{:ok, start_date} = Date.new(year, month, day)
{:ok, start_time} = Time.new(hours, minutes, seconds)

{:ok, start_date_time} = DateTime.new(start_date, start_time, "Etc/UTC")

end_date = DateTime.to_date(end_date_time)
end_time = DateTime.to_time(end_date_time)

{{end_date.year, end_date.month, end_date.day}, {end_time.hour, end_time.minute, end_time.second}}

end
end``````