Skip to content

Commit

Permalink
Add collatz-conjecture
Browse files Browse the repository at this point in the history
  • Loading branch information
BNAndras committed Apr 6, 2024
1 parent f134c7e commit aa2f940
Show file tree
Hide file tree
Showing 12 changed files with 202 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,14 @@
"prerequisites": [],
"difficulty": 1
},
{
"slug": "collatz-conjecture",
"name": "Collatz Conjecture",
"uuid": "3796230e-f37e-464c-bb22-8dc3d1664aec",
"practices": [],
"prerequisites": [],
"difficulty": 2
},
{
"slug": "difference-of-squares",
"name": "Difference of Squares",
Expand Down
29 changes: 29 additions & 0 deletions exercises/practice/collatz-conjecture/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# 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.
11 changes: 11 additions & 0 deletions exercises/practice/collatz-conjecture/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
## -*- conf -*-
.rebar3
_build/
ebin/
erl_crash.dump
rebar3.crashdump

tmp
bin/configlet
bin/configlet.exe
CHECKLIST
19 changes: 19 additions & 0 deletions exercises/practice/collatz-conjecture/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"BNAndras"
],
"files": {
"solution": [
"src/collatz-conjecture.lfe"
],
"test": [
"test/collatz-conjecture-tests.lfe"
],
"example": [
".meta/example.lfe"
]
},
"blurb": "Calculate the number of steps to reach 1 using the Collatz conjecture.",
"source": "An unsolved problem in mathematics named after mathematician Lothar Collatz",
"source_url": "https://en.wikipedia.org/wiki/3x_%2B_1_problem"
}
19 changes: 19 additions & 0 deletions exercises/practice/collatz-conjecture/.meta/example.lfe
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
(defmodule collatz-conjecture
(export (steps 1)))

(defun add1 (n) (+ n 1))

(defun zerop (n) (=:= (rem n 2)))

(defun steps (start)
(do-steps start 0))

(defun do-steps
((n _) (when (< n 1))
(error "Only positive integers are allowed"))
((1 acc)
acc)
((n acc) (when (=:= (rem n 2) 0))
(do-steps (div n 2) (add1 acc)))
((n acc)
(do-steps (add1 (* 3 n)) (add1 acc))))
38 changes: 38 additions & 0 deletions exercises/practice/collatz-conjecture/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.

[540a3d51-e7a6-47a5-92a3-4ad1838f0bfd]
description = "zero steps for one"

[3d76a0a6-ea84-444a-821a-f7857c2c1859]
description = "divide if even"

[754dea81-123c-429e-b8bc-db20b05a87b9]
description = "even and odd steps"

[ecfd0210-6f85-44f6-8280-f65534892ff6]
description = "large number of even and odd steps"

[7d4750e6-def9-4b86-aec7-9f7eb44f95a3]
description = "zero is an error"
include = false

[2187673d-77d6-4543-975e-66df6c50e2da]
description = "zero is an error"
reimplements = "7d4750e6-def9-4b86-aec7-9f7eb44f95a3"

[c6c795bf-a288-45e9-86a1-841359ad426d]
description = "negative value is an error"
include = false

[ec11f479-56bc-47fd-a434-bcd7a31a7a2e]
description = "negative value is an error"
reimplements = "c6c795bf-a288-45e9-86a1-841359ad426d"
21 changes: 21 additions & 0 deletions exercises/practice/collatz-conjecture/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
ERL := $(shell which erl)
REBAR3 := $(shell which rebar3)

null :=
space := $(null) #
comma := ,

ifeq ($(ERL),)
$(error Can't find Erlang executable 'erl')
else ifeq ($(REBAR3),)
$(error Can't find rebar3)
endif

compile: ; $(REBAR3) compile

clean: ; $(REBAR3) clean

.PHONY: test
test:
$(REBAR3) eunit \
-m $(subst $(space),$(comma),$(basename $(notdir $(wildcard test/*.lfe))))
11 changes: 11 additions & 0 deletions exercises/practice/collatz-conjecture/rebar.config
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{plugins, [{rebar3_lfe, "0.4.3"}]}.

{provider_hooks, [{post, [{compile, {lfe, compile}}]}]}.

{deps, [{lfe, "2.1.1"}]}.

{profiles,
[{test,
[{eunit_compile_opts, [{src_dirs, ["src", "test"]}]},
{deps,
[{ltest, "0.13.3"}]}]}]}.
8 changes: 8 additions & 0 deletions exercises/practice/collatz-conjecture/rebar.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{"1.2.0",
[{<<"lfe">>,{pkg,<<"lfe">>,<<"2.1.1">>},0}]}.
[
{pkg_hash,[
{<<"lfe">>, <<"4A888B26172D198DC7A5AFEB897E8248AF7D56E1638D9C8249AAF933AE811B96">>}]},
{pkg_hash_ext,[
{<<"lfe">>, <<"C484D3B655D40DED58BC41B17B22F173711C681BF36063A234A9BAA9506947E1">>}]}
].
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
%% -*- erlang -*-
{application, 'collatz-conjecture',
[{description, ""},
{vsn, "0.0.1"},
{modules,
['collatz-conjecture']},
{registered, []},
{applications,
[kernel, stdlib]},
{included_applications, []},
{env, []}]}.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
(defmodule collatz-conjecture
(export (steps 1)))

; Please implement the steps function.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
(defmodule collatz-conjecture-tests
(behaviour ltest-unit)
(export all))

(include-lib "ltest/include/ltest-macros.lfe")

(deftest zero-steps-for-one
(is-equal (collatz-conjecture:steps 1) 0))

(deftest divide-if-even
(is-equal (collatz-conjecture:steps 16) 4))

(deftest even-and-odd-steps
(is-equal (collatz-conjecture:steps 12) 9))

(deftest large-number-of-even-and-odd-steps
(is-equal (collatz-conjecture:steps 1000000) 152))

(deftest zero-is-an-error
(is-error _ (collatz-conjecture:steps 0)))

(deftest negative-value-is-an-error
(is-error _ (collatz-conjecture:steps -1)))

0 comments on commit aa2f940

Please sign in to comment.