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}" })