summaryrefslogtreecommitdiff
path: root/miralib/ex/hamming.m
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2022-03-04 12:32:20 -0500
committerJakob Kaivo <jkk@ung.org>2022-03-04 12:32:20 -0500
commit55f277e77428d7423ae906a8e1f1324d35b07a7d (patch)
tree5c1c04703dff89c46b349025d2d3ec88ea9b3819 /miralib/ex/hamming.m
import Miranda 2.066 from upstream
Diffstat (limited to 'miralib/ex/hamming.m')
-rw-r--r--miralib/ex/hamming.m19
1 files changed, 19 insertions, 0 deletions
diff --git a/miralib/ex/hamming.m b/miralib/ex/hamming.m
new file mode 100644
index 0000000..3ebb6ce
--- /dev/null
+++ b/miralib/ex/hamming.m
@@ -0,0 +1,19 @@
+||this is a problem described by Dijkstra in his book, A Discipline of
+||Programming, and attributed by him to Dr Hamming, of Bell Labs.
+||Print in ascending order all numbers of the form
+|| 2**a.3**b.5**c a,b,c all >=0
+||the solution here is based on a method using communicating processes.
+||ham is the list of numbers, to see them, say
+|| ham
+||hit control-C (interrupt) when you have seen enough!
+
+ham = 1 : foldr1 merge [mult 2 ham, mult 3 ham, mult 5 ham]
+ where
+ mult n x = [n*a|a<-x]
+ merge (a:x) (b:y) = a : merge x y, if a=b
+ = a : merge x (b:y), if a<b
+ = b : merge (a:x) y, if a>b
+
+||Note that there is a function called `merge' in the standard
+||environment, but unlike the one defined above it does not remove
+||duplicates from the lists being merged.