diff options
Diffstat (limited to 'src/code/2')
-rw-r--r-- | src/code/2/fib_itr.exs | 15 | ||||
-rw-r--r-- | src/code/2/fib_perf.out | 9 | ||||
-rw-r--r-- | src/code/2/fib_rec.exs | 7 | ||||
-rw-r--r-- | src/code/2/my_map.exs | 8 | ||||
-rw-r--r-- | src/code/2/my_map.out | 2 | ||||
-rw-r--r-- | src/code/2/my_map_red.exs | 17 | ||||
-rw-r--r-- | src/code/2/my_map_red.out | 3 | ||||
-rw-r--r-- | src/code/2/my_red.exs | 10 | ||||
-rw-r--r-- | src/code/2/my_red.out | 2 | ||||
-rw-r--r-- | src/code/2/qs.exs | 10 | ||||
-rw-r--r-- | src/code/2/qs.out | 4 | ||||
-rw-r--r-- | src/code/2/wc.exs | 28 | ||||
-rw-r--r-- | src/code/2/wc.out | 6 |
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, ...} |