commit c528829
Artur Manuel
·
2025-07-07 15:34:06 +0000 UTC
parent 5e8eee3
feat(crystal): add crystal
6 files changed,
+80,
-0
+9,
-0
1@@ -0,0 +1,9 @@
2+root = true
3+
4+[*.cr]
5+charset = utf-8
6+end_of_line = lf
7+insert_final_newline = true
8+indent_style = space
9+indent_size = 2
10+trim_trailing_whitespace = true
+6,
-0
1@@ -0,0 +1,6 @@
2+/docs/
3+/lib/
4+/bin/
5+/.shards/
6+*.dwarf
7+rosetta_collatz
+13,
-0
1@@ -0,0 +1,13 @@
2+name: rosetta_collatz
3+version: 0.1.0
4+
5+authors:
6+ - Artur Manuel <amad@atl.tools>
7+
8+targets:
9+ rosetta_collatz:
10+ main: src/rosetta_collatz.cr
11+
12+crystal: '>= 1.16.3'
13+
14+license: BSD-2-Clause
+16,
-0
1@@ -0,0 +1,16 @@
2+require "./spec_helper"
3+require "../src/collatz.cr"
4+
5+describe RosettaCollatz do
6+ # TODO: Write tests
7+
8+ it "does math correctly" do
9+ Collatz.collatz(7).should eq(22)
10+ Collatz.collatz(14).should eq(7)
11+ end
12+
13+ it "prints the sequence" do
14+ Collatz.collatz_sequence(2).should eq("2: 2, 1")
15+ Collatz.collatz_sequence(3).should eq("3: 3, 10, 5, 16, 8, 4, 2, 1")
16+ end
17+end
+2,
-0
1@@ -0,0 +1,2 @@
2+require "spec"
3+require "../src/rosetta_collatz"
+34,
-0
1@@ -0,0 +1,34 @@
2+# The module for the Collatz conjecture needed functions
3+module RosettaCollatz
4+ VERSION = "0.1.0"
5+
6+ # Returns the collatz number of `a`
7+ #
8+ # If `a` is even, divide it by 2. Otherwise, multiply 3 by `a`, and
9+ # add 1.
10+ def self.collatz(a)
11+ if a % 2 == 0
12+ a // 2
13+ else
14+ 3 * a + 1
15+ end
16+ end
17+
18+ # Returns a sequence of collatz integers starting from a.
19+ def self.collatz_sequence(a)
20+ result = "#{a}: "
21+ i = a
22+ while i >= 1
23+ if i == 1
24+ result = result + "1"
25+ break
26+ end
27+ result = result + "#{i}, "
28+ i = collatz(i)
29+ end
30+ result
31+ end
32+end
33+
34+sequence = Array.new(10000) { |i| Collatz.collatz_sequence(i + 1) }
35+puts (sequence.reduce("") { |acc, i| "#{acc}\n" + "#{i}" })