The challenge

Implement a function which behaves like the uniq command in UNIX.

It takes as input a sequence and returns a sequence in which all duplicate elements following each other have been reduced to one instance.

Example:

1
["a", "a", "b", "b", "c", "a", "b", "c"]  =>  ["a", "b", "c", "a", "b", "c"]

The solution in Golang

Option 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
package uniq
func Uniq(a []string) []string {
 array := []string{}
  for i, value := range a {
    if i == 0 {
      array = append(array, value)
    } else if a[i-1] != value {
      array = append(array, value)
    }
  }
  return array
}

Option 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
package uniq
func Uniq(a []string) []string {
  answer := make([]string, 0, len(a))
  for i, str := range a {
    if i == 0 || str != a[i-1] {
      answer = append(answer, str)
    }
  }
  return answer
}

Option 3:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package uniq
import "fmt"
func Uniq(a []string) []string {
  n := len(a)
  if (n == 0) {
    return []string{}
  }
  i := 1
  for j := 1; j < n; j++ {
    if (a[i] == a[j] || a[i - 1] == a[j]) {
      continue;
    } else {
      a[i] = a[j]
      i++
    }
  }
  fmt.Println(i)
  return a[0:i]
}

Test cases to validate our solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package uniq_test
import (
  . "github.com/onsi/ginkgo"
  . "github.com/onsi/gomega"
)
var _ = Describe("Test Suite", func() {
  It("Sample Tests", func() {
    Expect(Uniq([]string{"a", "a", "b", "b", "c", "a", "b", "c", "c"})).To(Equal([]string{"a", "b", "c", "a", "b", "c"}))
    Expect(Uniq([]string{"a", "a", "a", "b", "b", "b", "c", "c", "c"})).To(Equal([]string{"a", "b", "c"}))
    Expect(Uniq([]string{})).To(Equal([]string{}))
    Expect(Uniq([]string{"foo"})).To(Equal([]string{"foo"}))
    Expect(Uniq([]string{"bar"})).To(Equal([]string{"bar"}))
    Expect(Uniq([]string{""})).To(Equal([]string{""}))
    Expect(Uniq([]string{"a", "a"})).To(Equal([]string{"a"}))
  })
})