Advertisement
Guest User

Untitled

a guest
Sep 26th, 2016
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.92 KB | None | 0 0
  1. defmodule Triangles do
  2. def area({a,b}) when is_number(a) and is_number(b) do
  3. a * b * 0.5
  4. end
  5. def area(_) do
  6. "Unknown arguments"
  7. end
  8.  
  9. @spec lines_lengths!(String.t) :: Stream.t
  10. def lines_lengths! filepath do
  11. File.stream!(filepath)
  12. |> Stream.map(&String.replace(&1, "\n", ""))
  13. |> Stream.map(&{&1, String.length(&1)})
  14. |> Stream.with_index
  15. end
  16.  
  17. defp val {{_, val}, _} do
  18. val
  19. end
  20.  
  21. def longest_line_length! filepath do
  22. lines_lengths!(filepath)
  23. |> Enum.reduce(
  24. {{"", 0},-1},
  25. &(if val(&1) > val(&2) do &1 else &2 end)
  26. )
  27. end
  28.  
  29. def longest_line! filepath do
  30. longest_line_length! filepath
  31. end
  32.  
  33. def words_per_line! filepath do
  34. lines_lengths!(filepath)
  35. |> Stream.map(
  36. fn {{conts,_},index} ->
  37. conts
  38. |> (&String.split(&1,~r/\W+/)).() # Anonymous function needs to be evaluated?
  39. |> Enum.filter(&(String.length(&1) > 0)) # filter out empty splits
  40. |> (&{{conts, length(&1)}, index}).()
  41. end
  42. )
  43. end
  44. end
  45.  
  46. defmodule TrianglesTest do
  47. def test_lines_lengths! do
  48. Triangles.lines_lengths!("./test.exs")
  49. |> print_line_info("Length")
  50. end
  51.  
  52.  
  53. def test_longest_line_length! do
  54. {{_, length}, line} = Triangles.longest_line_length!("./test.exs")
  55. IO.puts("#{line + 1}. Length: #{length}")
  56. end
  57.  
  58. def test_longest_line! do
  59. {{conts, _}, line} = Triangles.longest_line!("./test.exs")
  60. IO.puts("#{line + 1}. \"#{conts}\"")
  61. end
  62.  
  63. def test_words_per_line! do
  64. Triangles.words_per_line!("./test.exs")
  65. |> print_line_info("Words")
  66. end
  67.  
  68. defp print_line_info(stream, attr) do
  69. stream |> Enum.each(
  70. fn({{_, value}, line}) ->
  71. IO.puts "#{line + 1}. #{attr}: #{value}"
  72. end
  73. )
  74. end
  75. end
  76.  
  77. TrianglesTest.test_longest_line_length!
  78. TrianglesTest.test_longest_line!
  79. TrianglesTest.test_words_per_line!
  80.  
  81. IO.puts [1,-1,1,-1,1,-1] |>
  82. Stream.filter(&(is_number(&1) and &1 > 0)) |>
  83. Enum.reduce(&(&1 + &2))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement