aboutsummaryrefslogtreecommitdiff
path: root/entries/lilylin/fractran/src/core.rs
diff options
context:
space:
mode:
Diffstat (limited to 'entries/lilylin/fractran/src/core.rs')
-rw-r--r--entries/lilylin/fractran/src/core.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/entries/lilylin/fractran/src/core.rs b/entries/lilylin/fractran/src/core.rs
new file mode 100644
index 0000000..26e1a67
--- /dev/null
+++ b/entries/lilylin/fractran/src/core.rs
@@ -0,0 +1,44 @@
+use num_traits::Pow;
+
+pub type FracSize = u16;
+
+#[derive(Debug)]
+pub struct Program {
+ pub fractions: Vec<(FracSize, FracSize)>,
+ pub initial: u64,
+}
+
+impl Program {
+ // http://lomont.org/posts/2017/fractran/
+ // A lesser known Conway FRACTRAN program is FIBONACCIGAME:
+ // `{17/65, 133/34, 17/19, 23/17, 2233/69, 23/29, 31/23, 74/341, 31/37, 41/31, 129/287, 41/43, 13/41, 1/13, 1/3}`
+ // Starting with `78*5^(n-1)`, it halts on `2^Fn` where Fn is the nth [Fibonacci number]
+ pub fn fibonacci(i: u32) -> Program {
+ Program {
+ fractions: vec![
+ (17, 65),
+ (133, 34),
+ (17, 19),
+ (23, 17),
+ (2233, 69),
+ (23, 29),
+ (31, 23),
+ (74, 341),
+ (31, 37),
+ (41, 31),
+ (129, 287),
+ (41, 43),
+ (13, 41),
+ (1, 13),
+ (1, 3),
+ ],
+ initial: 78 * 5u64.pow(i),
+ }
+ }
+}
+
+pub trait FractranEngine<Value>: IntoIterator<Item = Value>
+where
+ Value: From<u64>,
+{
+}