summaryrefslogtreecommitdiff
path: root/src/code/2
diff options
context:
space:
mode:
Diffstat (limited to 'src/code/2')
-rw-r--r--src/code/2/fib_itr.exs15
-rw-r--r--src/code/2/fib_perf.out9
-rw-r--r--src/code/2/fib_rec.exs7
-rw-r--r--src/code/2/my_map.exs8
-rw-r--r--src/code/2/my_map.out2
-rw-r--r--src/code/2/my_map_red.exs17
-rw-r--r--src/code/2/my_map_red.out3
-rw-r--r--src/code/2/my_red.exs10
-rw-r--r--src/code/2/my_red.out2
-rw-r--r--src/code/2/qs.exs10
-rw-r--r--src/code/2/qs.out4
-rw-r--r--src/code/2/wc.exs28
-rw-r--r--src/code/2/wc.out6
13 files changed, 121 insertions, 0 deletions
diff --git a/src/code/2/fib_itr.exs b/src/code/2/fib_itr.exs
new file mode 100644
index 0000000..2eafcee
--- /dev/null
+++ b/src/code/2/fib_itr.exs
@@ -0,0 +1,15 @@
+defmodule Fib do
+ def seq(0), do: 0
+ def seq(1), do: 1
+ def seq(n) when n > 1, do: compute_seq(n, 1, [0, 1])
+
+ defp compute_seq(n, i, acc) when n == i do
+ Enum.at(acc, length(acc) - 1)
+ end
+ defp compute_seq(n, i, acc) do
+ len = length(acc)
+ compute_seq(n, i + 1, acc++[Enum.at(acc, len-1) + Enum.at(acc, len-2)])
+ end
+end
+
+IO.puts Fib.seq(50)
diff --git a/src/code/2/fib_perf.out b/src/code/2/fib_perf.out
new file mode 100644
index 0000000..dda3a70
--- /dev/null
+++ b/src/code/2/fib_perf.out
@@ -0,0 +1,9 @@
+% /usr/bin/time elixir fib_rec.exs
+12586269025
+603.66user 0.08system 10:04.26elapsed 99%CPU (0avgtext+0avgdata 32892maxresident)k
+2856inputs+0outputs (0major+6861minor)pagefaults 0swaps
+
+% /usr/bin/time elixir fib_itr.exs
+12586269025
+0.24user 0.06system 0:00.28elapsed 110%CPU (0avgtext+0avgdata 33916maxresident)k
+0inputs+0outputs (0major+7617minor)pagefaults 0swaps
diff --git a/src/code/2/fib_rec.exs b/src/code/2/fib_rec.exs
new file mode 100644
index 0000000..edd3af8
--- /dev/null
+++ b/src/code/2/fib_rec.exs
@@ -0,0 +1,7 @@
+defmodule Fib do
+ def seq(0), do: 0
+ def seq(1), do: 1
+ def seq(n) when n > 1, do: seq(n-1) + seq(n-2)
+end
+
+IO.puts Fib.seq(50)
diff --git a/src/code/2/my_map.exs b/src/code/2/my_map.exs
new file mode 100644
index 0000000..ef219ef
--- /dev/null
+++ b/src/code/2/my_map.exs
@@ -0,0 +1,8 @@
+defmodule MyMap do
+ def map([], _), do: []
+ def map([h|t], f) do
+ [f.(h)] ++ map(t, f)
+ end
+end
+
+[1, 2, 3, 4, 5] |> MyMap.map(fn(x) -> x * 2 end) |> IO.inspect
diff --git a/src/code/2/my_map.out b/src/code/2/my_map.out
new file mode 100644
index 0000000..1781de0
--- /dev/null
+++ b/src/code/2/my_map.out
@@ -0,0 +1,2 @@
+% elixir my_map.exs
+[2, 4, 6, 8, 10]
diff --git a/src/code/2/my_map_red.exs b/src/code/2/my_map_red.exs
new file mode 100644
index 0000000..51f47f8
--- /dev/null
+++ b/src/code/2/my_map_red.exs
@@ -0,0 +1,17 @@
+defmodule MapReduce do
+ def reduce([], acc, _), do: acc
+ def reduce([h|t], acc, f) do
+ reduce(t, f.(h, acc), f)
+ end
+
+ def map([], _), do: []
+ def map(l, f) do
+ reduce(l, [], fn(x, acc) -> acc ++ [f.(x)] end)
+ end
+end
+
+[1, 2, 3, 4, 5]
+|> MapReduce.map(fn(x) -> x * 2 end)
+|> IO.inspect
+|> MapReduce.reduce(0, fn(x, acc) -> acc + x end)
+|> IO.inspect
diff --git a/src/code/2/my_map_red.out b/src/code/2/my_map_red.out
new file mode 100644
index 0000000..1a38a74
--- /dev/null
+++ b/src/code/2/my_map_red.out
@@ -0,0 +1,3 @@
+% elixir my_map_red.exs
+[2, 4, 6, 8, 10]
+30
diff --git a/src/code/2/my_red.exs b/src/code/2/my_red.exs
new file mode 100644
index 0000000..6966f3e
--- /dev/null
+++ b/src/code/2/my_red.exs
@@ -0,0 +1,10 @@
+defmodule MyReduce do
+ def reduce([], acc, _), do: acc
+ def reduce([h|t], acc, f) do
+ reduce(t, f.(h, acc), f)
+ end
+end
+
+[1, 2, 3, 4, 5] |>
+MyReduce.reduce(0, fn(x, acc) -> x + acc end)
+|> IO.inspect
diff --git a/src/code/2/my_red.out b/src/code/2/my_red.out
new file mode 100644
index 0000000..13af7eb
--- /dev/null
+++ b/src/code/2/my_red.out
@@ -0,0 +1,2 @@
+% elixir my_red.exs
+15
diff --git a/src/code/2/qs.exs b/src/code/2/qs.exs
new file mode 100644
index 0000000..38c90c9
--- /dev/null
+++ b/src/code/2/qs.exs
@@ -0,0 +1,10 @@
+defmodule Quicksort do
+ def sort([]), do: []
+ def sort([h|t]) do
+ lower = t |> Enum.filter(&(&1 <= h))
+ upper = t |> Enum.filter(&(&1 > h))
+ sort(lower) ++ [h] ++ sort(upper)
+ end
+end
+
+1..10 |> Enum.shuffle |> Quicksort.sort |> IO.inspect
diff --git a/src/code/2/qs.out b/src/code/2/qs.out
new file mode 100644
index 0000000..9569cda
--- /dev/null
+++ b/src/code/2/qs.out
@@ -0,0 +1,4 @@
+% elixir qs.exs
+0.28user 0.02system 0:00.27elapsed 112%CPU (0avgtext+0avgdata 38936maxresident)k
+0inputs+8outputs (0major+6654minor)pagefaults 0swaps
+[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
diff --git a/src/code/2/wc.exs b/src/code/2/wc.exs
new file mode 100644
index 0000000..2c7c284
--- /dev/null
+++ b/src/code/2/wc.exs
@@ -0,0 +1,28 @@
+defmodule WordCount do
+
+ defp stream_file(filename) do
+ File.stream!(filename)
+ end
+
+ defp tokenize_words(line) do
+ line |> Stream.flat_map(&String.split/1)
+ end
+
+ defp reduce_words(words) when is_list(words) do
+ Enum.reduce(words, %{}, &update_count/2)
+ end
+
+ defp update_count(word, acc) do
+ Map.update(acc, word, 1, &(&1 + 1))
+ end
+
+ def count_words(filename) do
+ stream_file(filename)
+ |> tokenize_words
+ |> Enum.to_list
+ |> reduce_words
+ end
+
+end
+
+WordCount.count_words("pg51353.txt") |> IO.inspect(limit: 20)
diff --git a/src/code/2/wc.out b/src/code/2/wc.out
new file mode 100644
index 0000000..fa338fb
--- /dev/null
+++ b/src/code/2/wc.out
@@ -0,0 +1,6 @@
+% elixir wc.exs
+%{"Kometevskyite?\"" => 1, "silent" => 1, "cease" => 1, "along," => 1,
+ "Refund\"" => 1, "prepare)" => 1, "black" => 4, "shrunken" => 1, "Man" => 1,
+ "payments" => 3, "Redistribution" => 1, "Gutenberg:" => 1, "SEND" => 1,
+ "first" => 3, "accepted" => 1, "whole" => 9, "happened.\"" => 1,
+ "casually," => 1, "forward." => 2, "thoroughly" => 1, ...}