Julio Biason
3 years ago
9 changed files with 200 additions and 1 deletions
@ -0,0 +1,27 @@
|
||||
{ |
||||
"blurb": "Calculate the number of steps to reach 1 using the Collatz conjecture", |
||||
"authors": [ |
||||
"NobbZ" |
||||
], |
||||
"contributors": [ |
||||
"ErikSchierboom", |
||||
"iHiD", |
||||
"JordanAdams", |
||||
"juhlig", |
||||
"kytrinyx", |
||||
"wojtii" |
||||
], |
||||
"files": { |
||||
"solution": [ |
||||
"src/collatz_conjecture.erl" |
||||
], |
||||
"test": [ |
||||
"test/collatz_conjecture_tests.erl" |
||||
], |
||||
"example": [ |
||||
".meta/example.erl" |
||||
] |
||||
}, |
||||
"source": "An unsolved problem in mathematics named after mathematician Lothar Collatz", |
||||
"source_url": "https://en.wikipedia.org/wiki/3x_%2B_1_problem" |
||||
} |
@ -0,0 +1 @@
|
||||
{"track":"erlang","exercise":"collatz-conjecture","id":"6258a251cb6e4d80b70d021f2052b335","url":"https://exercism.org/tracks/erlang/exercises/collatz-conjecture","handle":"JBiason","is_requester":true,"auto_approve":false} |
@ -0,0 +1,36 @@
|
||||
# Help |
||||
|
||||
## Running the tests |
||||
|
||||
You can run the tests by running the following command from the exercise directory. |
||||
|
||||
```bash |
||||
$ rebar3 eunit |
||||
``` |
||||
|
||||
## Submitting your solution |
||||
|
||||
You can submit your solution using the `exercism submit src/collatz_conjecture.erl` command. |
||||
This command will upload your solution to the Exercism website and print the solution page's URL. |
||||
|
||||
It's possible to submit an incomplete solution which allows you to: |
||||
|
||||
- See how others have completed the exercise |
||||
- Request help from a mentor |
||||
|
||||
## Need to get help? |
||||
|
||||
If you'd like help solving the exercise, check the following pages: |
||||
|
||||
- The [Erlang track's documentation](https://exercism.org/docs/tracks/erlang) |
||||
- [Exercism's support channel on gitter](https://gitter.im/exercism/support) |
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs) |
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring. |
||||
|
||||
To get help if you're having trouble, you can use one of the following resources: |
||||
|
||||
- [Exercism related BEAM support channel on gitter](https://gitter.im/exercism/xerlang) |
||||
- [Erlang Documentation](http://www.erlang.org/doc.html) |
||||
- [Learn You Some Erlang for Great Good](http://learnyousomeerlang.com) |
||||
- [StackOverflow](http://stackoverflow.com/) |
@ -0,0 +1,51 @@
|
||||
# Collatz Conjecture |
||||
|
||||
Welcome to Collatz Conjecture on Exercism's Erlang Track. |
||||
If you need help running the tests or submitting your code, check out `HELP.md`. |
||||
|
||||
## Instructions |
||||
|
||||
The Collatz Conjecture or 3x+1 problem can be summarized as follows: |
||||
|
||||
Take any positive integer n. If n is even, divide n by 2 to get n / 2. If n is |
||||
odd, multiply n by 3 and add 1 to get 3n + 1. Repeat the process indefinitely. |
||||
The conjecture states that no matter which number you start with, you will |
||||
always reach 1 eventually. |
||||
|
||||
Given a number n, return the number of steps required to reach 1. |
||||
|
||||
## Examples |
||||
|
||||
Starting with n = 12, the steps would be as follows: |
||||
|
||||
0. 12 |
||||
1. 6 |
||||
2. 3 |
||||
3. 10 |
||||
4. 5 |
||||
5. 16 |
||||
6. 8 |
||||
7. 4 |
||||
8. 2 |
||||
9. 1 |
||||
|
||||
Resulting in 9 steps. So for input n = 12, the return value would be 9. |
||||
|
||||
## Source |
||||
|
||||
### Created by |
||||
|
||||
- @NobbZ |
||||
|
||||
### Contributed to by |
||||
|
||||
- @ErikSchierboom |
||||
- @iHiD |
||||
- @JordanAdams |
||||
- @juhlig |
||||
- @kytrinyx |
||||
- @wojtii |
||||
|
||||
### Based on |
||||
|
||||
An unsolved problem in mathematics named after mathematician Lothar Collatz - https://en.wikipedia.org/wiki/3x_%2B_1_problem |
@ -0,0 +1,30 @@
|
||||
%% Erlang compiler options |
||||
{erl_opts, [debug_info, warnings_as_errors]}. |
||||
|
||||
{deps, [{erl_exercism, "0.1.2"}]}. |
||||
|
||||
{dialyzer, [ |
||||
{warnings, [underspecs, no_return]}, |
||||
{get_warnings, true}, |
||||
{plt_apps, top_level_deps}, % top_level_deps | all_deps |
||||
{plt_extra_apps, []}, |
||||
{plt_location, local}, % local | "/my/file/name" |
||||
{plt_prefix, "rebar3"}, |
||||
{base_plt_apps, [stdlib, kernel, crypto]}, |
||||
{base_plt_location, global}, % global | "/my/file/name" |
||||
{base_plt_prefix, "rebar3"} |
||||
]}. |
||||
|
||||
%% eunit:test(Tests) |
||||
{eunit_tests, []}. |
||||
%% Options for eunit:test(Tests, Opts) |
||||
{eunit_opts, [verbose]}. |
||||
|
||||
%% == xref == |
||||
|
||||
{xref_warnings, true}. |
||||
|
||||
%% xref checks to run |
||||
{xref_checks, [undefined_function_calls, undefined_functions, |
||||
locals_not_used, exports_not_used, |
||||
deprecated_function_calls, deprecated_functions]}. |
@ -0,0 +1,9 @@
|
||||
{application, collatz_conjecture, |
||||
[{description, "exercism.io - collatz-conjecture"}, |
||||
{vsn, "0.0.1"}, |
||||
{modules, []}, |
||||
{registered, []}, |
||||
{applications, [kernel, |
||||
stdlib]}, |
||||
{env, []} |
||||
]}. |
@ -0,0 +1,9 @@
|
||||
-module(collatz_conjecture). |
||||
|
||||
-export([steps/1]). |
||||
|
||||
|
||||
steps(1) -> 0; |
||||
steps(N) when N =< 0 -> error(badarg); |
||||
steps(N) when (N rem 2 == 0) -> 1 + steps(N div 2); |
||||
steps(N) -> 1 + steps(3*N+1). |
@ -0,0 +1,36 @@
|
||||
%% Generated with 'testgen v0.2.0' |
||||
%% Revision 2 of the exercises generator was used |
||||
%% https://github.com/exercism/problem-specifications/raw/42dd0cea20498fd544b152c4e2c0a419bb7e266a/exercises/collatz-conjecture/canonical-data.json |
||||
%% This file is automatically generated from the exercises canonical data. |
||||
|
||||
-module(collatz_conjecture_tests). |
||||
|
||||
-include_lib("erl_exercism/include/exercism.hrl"). |
||||
-include_lib("eunit/include/eunit.hrl"). |
||||
|
||||
|
||||
|
||||
|
||||
'1_zero_steps_for_one_test_'() -> |
||||
{"zero steps for one", |
||||
?_assertMatch(0, collatz_conjecture:steps(1))}. |
||||
|
||||
'2_divide_if_even_test_'() -> |
||||
{"divide if even", |
||||
?_assertMatch(4, collatz_conjecture:steps(16))}. |
||||
|
||||
'3_even_and_odd_steps_test_'() -> |
||||
{"even and odd steps", |
||||
?_assertMatch(9, collatz_conjecture:steps(12))}. |
||||
|
||||
'4_large_number_of_even_and_odd_steps_test_'() -> |
||||
{"large number of even and odd steps", |
||||
?_assertMatch(152, collatz_conjecture:steps(1000000))}. |
||||
|
||||
'5_zero_is_an_error_test_'() -> |
||||
{"zero is an error", |
||||
?_assertError(badarg, collatz_conjecture:steps(0))}. |
||||
|
||||
'6_negative_value_is_an_error_test_'() -> |
||||
{"negative value is an error", |
||||
?_assertError(badarg, collatz_conjecture:steps(-15))}. |
Loading…
Reference in new issue