Julio Biason
4 years ago
7 changed files with 184 additions and 0 deletions
@ -0,0 +1 @@ |
|||||||
|
{"track":"elixir","exercise":"word-count","id":"d4d0245ac687461fb69c2e536694fd0f","url":"https://exercism.io/my/solutions/d4d0245ac687461fb69c2e536694fd0f","handle":"JBiason","is_requester":true,"auto_approve":false} |
@ -0,0 +1,24 @@ |
|||||||
|
# The directory Mix will write compiled artifacts to. |
||||||
|
/_build/ |
||||||
|
|
||||||
|
# If you run "mix test --cover", coverage assets end up here. |
||||||
|
/cover/ |
||||||
|
|
||||||
|
# The directory Mix downloads your dependencies sources to. |
||||||
|
/deps/ |
||||||
|
|
||||||
|
# Where third-party dependencies like ExDoc output generated docs. |
||||||
|
/doc/ |
||||||
|
|
||||||
|
# Ignore .fetch files in case you like to edit your project deps locally. |
||||||
|
/.fetch |
||||||
|
|
||||||
|
# If the VM crashes, it generates a dump, let's ignore it too. |
||||||
|
erl_crash.dump |
||||||
|
|
||||||
|
# Also ignore archive artifacts (built via "mix archive.build"). |
||||||
|
*.ez |
||||||
|
|
||||||
|
# Ignore package tarball (built via "mix hex.build"). |
||||||
|
word_count-*.tar |
||||||
|
|
@ -0,0 +1,57 @@ |
|||||||
|
# Word Count |
||||||
|
|
||||||
|
Given a phrase, count the occurrences of each word in that phrase. |
||||||
|
|
||||||
|
For example for the input `"olly olly in come free"` |
||||||
|
|
||||||
|
```text |
||||||
|
olly: 2 |
||||||
|
in: 1 |
||||||
|
come: 1 |
||||||
|
free: 1 |
||||||
|
``` |
||||||
|
|
||||||
|
Words are compared case-insensitively. |
||||||
|
The keys are lowercase. |
||||||
|
|
||||||
|
## Running tests |
||||||
|
|
||||||
|
Execute the tests with: |
||||||
|
|
||||||
|
```bash |
||||||
|
$ mix test |
||||||
|
``` |
||||||
|
|
||||||
|
### Pending tests |
||||||
|
|
||||||
|
In the test suites, all but the first test have been skipped. |
||||||
|
|
||||||
|
Once you get a test passing, you can unskip the next one by |
||||||
|
commenting out the relevant `@tag :pending` with a `#` symbol. |
||||||
|
|
||||||
|
For example: |
||||||
|
|
||||||
|
```elixir |
||||||
|
# @tag :pending |
||||||
|
test "shouting" do |
||||||
|
assert Bob.hey("WATCH OUT!") == "Whoa, chill out!" |
||||||
|
end |
||||||
|
``` |
||||||
|
|
||||||
|
Or, you can enable all the tests by commenting out the |
||||||
|
`ExUnit.configure` line in the test suite. |
||||||
|
|
||||||
|
```elixir |
||||||
|
# ExUnit.configure exclude: :pending, trace: true |
||||||
|
``` |
||||||
|
|
||||||
|
If you're stuck on something, it may help to look at some of |
||||||
|
the [available resources](https://exercism.io/tracks/elixir/resources) |
||||||
|
out there where answers might be found. |
||||||
|
|
||||||
|
## Source |
||||||
|
|
||||||
|
This is a classic toy problem, but we were reminded of it by seeing it in the Go Tour. |
||||||
|
|
||||||
|
## Submitting Incomplete Solutions |
||||||
|
It's possible to submit an incomplete solution so you can see how others have completed the exercise. |
@ -0,0 +1,25 @@ |
|||||||
|
defmodule WordCount do |
||||||
|
@doc """ |
||||||
|
Count the number of words in the sentence. |
||||||
|
|
||||||
|
Words are compared case-insensitively. |
||||||
|
""" |
||||||
|
|
||||||
|
@spec count(String.t()) :: map |
||||||
|
def count(sentence) do |
||||||
|
sentence |
||||||
|
|> String.split(~r/[ _ ]/) |
||||||
|
|> Enum.reduce(%{}, fn (word, acc) -> |
||||||
|
lower_word = word |
||||||
|
|> String.downcase |
||||||
|
|> String.replace(~r/[\$!&^%,:@]/, "") |
||||||
|
|
||||||
|
if String.length(lower_word) > 0 do |
||||||
|
count = Map.get(acc, lower_word, 0) |
||||||
|
Map.put(acc, lower_word, count + 1) |
||||||
|
else |
||||||
|
acc |
||||||
|
end |
||||||
|
end) |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,28 @@ |
|||||||
|
defmodule WordCount.MixProject do |
||||||
|
use Mix.Project |
||||||
|
|
||||||
|
def project do |
||||||
|
[ |
||||||
|
app: :word_count, |
||||||
|
version: "0.1.0", |
||||||
|
# elixir: "~> 1.8", |
||||||
|
start_permanent: Mix.env() == :prod, |
||||||
|
deps: deps() |
||||||
|
] |
||||||
|
end |
||||||
|
|
||||||
|
# Run "mix help compile.app" to learn about applications. |
||||||
|
def application do |
||||||
|
[ |
||||||
|
extra_applications: [:logger] |
||||||
|
] |
||||||
|
end |
||||||
|
|
||||||
|
# Run "mix help deps" to learn about dependencies. |
||||||
|
defp deps do |
||||||
|
[ |
||||||
|
# {:dep_from_hexpm, "~> 0.3.0"}, |
||||||
|
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"} |
||||||
|
] |
||||||
|
end |
||||||
|
end |
@ -0,0 +1,2 @@ |
|||||||
|
ExUnit.start() |
||||||
|
ExUnit.configure(exclude: :pending, trace: true) |
@ -0,0 +1,47 @@ |
|||||||
|
defmodule WordCountTest do |
||||||
|
use ExUnit.Case |
||||||
|
|
||||||
|
test "count one word" do |
||||||
|
assert WordCount.count("word") == %{"word" => 1} |
||||||
|
end |
||||||
|
|
||||||
|
test "count one of each" do |
||||||
|
expected = %{"one" => 1, "of" => 1, "each" => 1} |
||||||
|
assert WordCount.count("one of each") == expected |
||||||
|
end |
||||||
|
|
||||||
|
test "count multiple occurrences" do |
||||||
|
expected = %{"one" => 1, "fish" => 4, "two" => 1, "red" => 1, "blue" => 1} |
||||||
|
assert WordCount.count("one fish two fish red fish blue fish") == expected |
||||||
|
end |
||||||
|
|
||||||
|
test "ignore punctuation" do |
||||||
|
expected = %{"car" => 1, "carpet" => 1, "as" => 1, "java" => 1, "javascript" => 1} |
||||||
|
assert WordCount.count("car : carpet as java : javascript!!&@$%^&") == expected |
||||||
|
end |
||||||
|
|
||||||
|
test "include numbers" do |
||||||
|
expected = %{"testing" => 2, "1" => 1, "2" => 1} |
||||||
|
assert WordCount.count("testing, 1, 2 testing") == expected |
||||||
|
end |
||||||
|
|
||||||
|
test "hyphens" do |
||||||
|
expected = %{"co-operative" => 1} |
||||||
|
assert WordCount.count("co-operative") == expected |
||||||
|
end |
||||||
|
|
||||||
|
test "ignore underscores" do |
||||||
|
expected = %{"two" => 1, "words" => 1} |
||||||
|
assert WordCount.count("two_words") == expected |
||||||
|
end |
||||||
|
|
||||||
|
test "normalize case" do |
||||||
|
expected = %{"go" => 3} |
||||||
|
assert WordCount.count("go Go GO") == expected |
||||||
|
end |
||||||
|
|
||||||
|
test "German" do |
||||||
|
expected = %{"götterfunken" => 1, "schöner" => 1, "freude" => 1} |
||||||
|
assert WordCount.count("Freude schöner Götterfunken") == expected |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue