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