🎉 Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io 🎉
Avatar of SergiiVlasiuk

SergiiVlasiuk's solution

to Isogram in the Scala Track

Published at Aug 17 2019 · 0 comments
Test suite

Determine if a word or phrase is an isogram.

An isogram (also known as a "nonpattern word") is a word or phrase without a repeating letter, however spaces and hyphens are allowed to appear multiple times.

Examples of isograms:

  • lumberjacks
  • background
  • downstream
  • six-year-old

The word isograms, however, is not an isogram, because the s repeats.

The Scala exercises assume an SBT project scheme. The exercise solution source should be placed within the exercise directory/src/main/scala. The exercise unit tests can be found within the exercise directory/src/test/scala.

To run the tests simply run the command sbt test in the exercise directory.

For more detailed info about the Scala track see the help page.


Wikipedia https://en.wikipedia.org/wiki/Isogram

Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.


import org.scalatest.{Matchers, FunSuite}

/** @version 1.4.0 */
class IsogramTest extends FunSuite with Matchers {

  test("empty string") {
    Isogram.isIsogram("") should be(true)

  test("isogram with only lower case characters") {
    Isogram.isIsogram("isogram") should be(true)

  test("word with one duplicated character") {
    Isogram.isIsogram("eleven") should be(false)

  test("word with one duplicated character from the end of the alphabet") {
    Isogram.isIsogram("zzyzx") should be(false)

  test("longest reported english isogram") {
    Isogram.isIsogram("subdermatoglyphic") should be(true)

  test("word with duplicated character in mixed case") {
    Isogram.isIsogram("Alphabet") should be(false)

  test("hypothetical isogrammic word with hyphen") {
    Isogram.isIsogram("thumbscrew-japingly") should be(true)

  test("isogram with duplicated hyphen") {
    Isogram.isIsogram("six-year-old") should be(true)

  test("made-up name that is an isogram") {
    Isogram.isIsogram("Emily Jung Schwartzkopf") should be(true)

  test("duplicated character in the middle") {
    Isogram.isIsogram("accentor") should be(false)
object Isogram {
  def isIsogram(iso: String): Boolean = {
    val cleanedChars = iso.toLowerCase.filter(_.isLetter)
//    val cleanedChars = iso.replaceAll("[^A-z]", "").toLowerCase
//    println(s"$iso -> [replace all] -> " + iso.replaceAll("[^A-z]", ""))
    cleanedChars.length == cleanedChars.distinct.length

Community comments

Find this solution interesting? Ask the author a question to learn more.

What can you learn from this solution?

A huge amount can be learned from reading other people’s code. This is why we wanted to give exercism users the option of making their solutions public.

Here are some questions to help you reflect on this solution and learn the most from it.

  • What compromises have been made?
  • Are there new concepts here that you could read more about to improve your understanding?