a-conjecture-of-mine

An exercise on polyglossy: the same problem solved on multiple languages

commit 0dcbc80f01565bfc3adaff579fd56d3aaae7ab5e
parent 11684a6cca2bd4dc18173a3f2635dc4878a7c0e5
Author: Pablo Escobar Gaviria <gark.garcia@protonmail.com>
Date:   Tue, 21 Jan 2020 13:19:26 -0200

Started writing a Racket implementation.

Diffstat:
M.gitignore | 1-
MElixir/main.ex | 4+++-
MHaskell/Main.hs | 11++++++-----
Ascript.rkt | 16++++++++++++++++
4 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -10,6 +10,5 @@ build
 *.swp
 *.o
 *.hi
-extra.pl
 Latex
 Cuda
diff --git a/Elixir/main.ex b/Elixir/main.ex
@@ -12,7 +12,9 @@ defmodule Conjecture do
       :ets.new(:sums_cache, [:set, :public, :named_table])
 
       # Spawn a new process for each starting index from 0 to `max`
-      f = fn i -> spawn fn -> counterexpl i, max, n_processes, parent_id end end
+      f = fn i -> 
+            spawn fn -> counterexpl i, max, n_processes, parent_id end
+        end
       Enum.map 0..(n_processes - 1), f
 
       listen n_processes
diff --git a/Haskell/Main.hs b/Haskell/Main.hs
@@ -26,10 +26,11 @@ main = do
           head' xs = Just (head xs)
 
 -- Calculates the sum of the digits of `n`.
-sum' :: Int -> Int
-sum' n
-     | n < 10 = n
-     | otherwise = (n `mod` 10) + sum' (n `div` 10)
+sumDigits :: Int -> Int
+sumDigits = sumDigitsTail 0
+    where sumDigitsTail acc n
+              | n == 0 = acc
+              | otherwise = sumDigitsTail (acc + (n `mod` 10)) (n `div` 10)
 
 -- Returns `Just updated` if the if the conjecture holds for pair, where
 -- `updated` is an updated versions of the sums cache provided by `sums`.
@@ -47,7 +48,7 @@ test' sums (a, b) = diff `mod` 9 == 0
 counterexempl :: Int -> Bool
 counterexempl max =
     all (test' sums) [(a, b) | a <- [0..max], b <- [a..max]]
-    where sums = generate (2 * max + 1) sum'
+    where sums = generate (2 * max + 1) sumDigits
 
 exitInvalidInput :: IO Int
 exitInvalidInput = exitWith $ ExitFailure 2
diff --git a/script.rkt b/script.rkt
@@ -0,0 +1,16 @@
+(define (counterexempl max)
+    (foldl (lambda (acc a) (and acc (iter a))) (in-range max)))
+
+(define (iter a)
+    (foldl (lambda (acc b) (and acc (test a b))) (in-range a)))
+
+(define (test a b)
+    (zero? (mod (- (sum-digits (+ a b)) (sum-digits a) (sum-digits b)) 9)))
+
+(define (sum-digits n) (sum-digits-tail n 0))
+
+(define (sum-digits-tail n acc)
+    (if (zero? n)
+        acc
+        (sum-digits-tail (div n 10) (+ acc (mod n 10)))))
+