aboutsummaryrefslogtreecommitdiffhomepage
path: root/samples/rosetta
diff options
context:
space:
mode:
authorMarvin Borner2024-03-02 16:16:51 +0100
committerMarvin Borner2024-03-02 19:30:59 +0100
commitca3907431bfde5aa0715945222ce777d72e6b411 (patch)
tree5399b72899c5d66f94782892ba9dbf29839aca22 /samples/rosetta
parent46cc8f5b0da07d8c7cb354c7b7a281b8d0f3d7bf (diff)
Docs & samples
Diffstat (limited to 'samples/rosetta')
-rw-r--r--samples/rosetta/function_composition.bruijn21
-rw-r--r--samples/rosetta/hailstone.bruijn21
-rw-r--r--samples/rosetta/levenshtein_distance.bruijn10
-rw-r--r--samples/rosetta/ternary_logic.bruijn71
4 files changed, 123 insertions, 0 deletions
diff --git a/samples/rosetta/function_composition.bruijn b/samples/rosetta/function_composition.bruijn
new file mode 100644
index 0000000..3415c5e
--- /dev/null
+++ b/samples/rosetta/function_composition.bruijn
@@ -0,0 +1,21 @@
+:import std/Number .
+
+# composition, bluebird combinator
+…∘… [[[2 (1 0)]]]
+
+:test (((inc ∘ (mul (+2))) (+3)) =? (+7)) ([[1]])
+
+# 2x composition, blackbird combinator
+…∘∘… [[[[3 (2 1 0)]]]]
+
+:test (((inc ∘∘ mul) (+2) (+3)) =? (+7)) ([[1]])
+
+# 3x composition, bunting combinator
+…∘∘∘… [[[[[4 (3 2 1 0)]]]]]
+
+:test (((inc ∘∘∘ (add ∘∘ mul)) (+1) (+2) (+4)) =? (+7)) ([[1]])
+
+# reverse composition, queer bird combinator
+…→… [[[1 (2 0)]]]
+
+:test ((((mul (+2)) → inc) (+3)) =? (+7)) ([[1]])
diff --git a/samples/rosetta/hailstone.bruijn b/samples/rosetta/hailstone.bruijn
new file mode 100644
index 0000000..46cf8a2
--- /dev/null
+++ b/samples/rosetta/hailstone.bruijn
@@ -0,0 +1,21 @@
+:import std/Combinator .
+:import std/List .
+:import std/Math M
+:import std/Number/Binary .
+
+# hailstone sequence using binary shifts
+hailstone y [[(0 =? (+1b)) {}0 go]]
+ go 0 : (=²?0 (1 /²0) (1 (↑¹0 + 0)))
+
+# --- tests ---
+
+seq-27 hailstone (+27b)
+
+:test (∀seq-27) ((+112))
+:test (take (+4) seq-27) ((+27b) : ((+82b) : ((+41b) : {}(+124b))))
+:test (take (+4) <~>seq-27) ((+1b) : ((+2b) : ((+4b) : {}(+8b))))
+
+all-below-100000 [0 : ∀(hailstone 0)] <$> seq
+ seq take (+1000) (iterate ++‣ (+1b))
+
+main [head (max-by (M.compare ⋔ tail) all-below-100000)]
diff --git a/samples/rosetta/levenshtein_distance.bruijn b/samples/rosetta/levenshtein_distance.bruijn
new file mode 100644
index 0000000..2111ade
--- /dev/null
+++ b/samples/rosetta/levenshtein_distance.bruijn
@@ -0,0 +1,10 @@
+:import std/Combinator .
+:import std/Char C
+:import std/List .
+:import std/Math .
+
+levenshtein y [[[∅?1 ∀0 (∅?0 ∀1 (0 (1 [[[[go]]]])))]]]
+ go (C.eq? 3 1) (6 2 0) ++(lmin ((6 2 0) : ((6 5 0) : {}(6 2 4))))
+
+:test ((levenshtein "rosettacode" "raisethysword") =? (+8)) ([[1]])
+:test ((levenshtein "kitten" "sitting") =? (+3)) ([[1]])
diff --git a/samples/rosetta/ternary_logic.bruijn b/samples/rosetta/ternary_logic.bruijn
new file mode 100644
index 0000000..037ac41
--- /dev/null
+++ b/samples/rosetta/ternary_logic.bruijn
@@ -0,0 +1,71 @@
+true [[[0]]]
+
+maybe [[[1]]]
+
+false [[[2]]]
+
+¬‣ [0 true maybe false]
+
+:test (¬true) (false)
+:test (¬maybe) (maybe)
+:test (¬false) (true)
+
+…⋀… [[1 (0 1 1 1) (0 0 0 1) (0 0 0 0)]]
+
+:test (true ⋀ true) (true)
+:test (true ⋀ maybe) (maybe)
+:test (true ⋀ false) (false)
+:test (maybe ⋀ true) (maybe)
+:test (maybe ⋀ maybe) (maybe)
+:test (maybe ⋀ false) (false)
+:test (false ⋀ true) (false)
+:test (false ⋀ maybe) (false)
+:test (false ⋀ false) (false)
+
+…⋁… [[1 (0 0 0 0) (0 1 0 0) (0 1 1 1)]]
+
+:test (true ⋁ true) (true)
+:test (true ⋁ maybe) (true)
+:test (true ⋁ false) (true)
+:test (maybe ⋁ true) (true)
+:test (maybe ⋁ maybe) (maybe)
+:test (maybe ⋁ false) (maybe)
+:test (false ⋁ true) (true)
+:test (false ⋁ maybe) (maybe)
+:test (false ⋁ false) (false)
+
+…⊃… [[1 (0 true 0 1) (0 true 1 1) (0 1 1 1)]]
+
+:test (true ⊃ true) (true)
+:test (true ⊃ maybe) (true)
+:test (true ⊃ false) (true)
+:test (maybe ⊃ true) (maybe)
+:test (maybe ⊃ maybe) (maybe)
+:test (maybe ⊃ false) (true)
+:test (false ⊃ true) (false)
+:test (false ⊃ maybe) (maybe)
+:test (false ⊃ false) (true)
+
+…≡… [[1 (0 true 0 1) (0 1 1 1) (0 0 0 0)]]
+
+:test (true ≡ true) (true)
+:test (true ≡ maybe) (maybe)
+:test (true ≡ false) (false)
+:test (maybe ≡ true) (maybe)
+:test (maybe ≡ maybe) (maybe)
+:test (maybe ≡ false) (maybe)
+:test (false ≡ true) (false)
+:test (false ≡ maybe) (maybe)
+:test (false ≡ false) (true)
+
+# --- result samples ---
+
+:import std/List .
+
+main [[inp <> "=" <> !res ++ "\n"] <++> (cross3 ops trits trits)]
+ !‣ [0 "false" "maybe" "true"]
+ …<>… [[1 ++ " " ++ 0]]
+ inp 0 [[~1 <> (0 [[!1 <> (0 [[!1]])]])]]
+ res ^(^0) ^(~0) ^(~(~0))
+ ops (…⋀… : "and") : ((…⋁… : "or") : ((…⊃… : "if") : {}(…≡… : "equiv")))
+ trits true : (maybe : {}false)