diff --git a/clean-code-challanges/src/main/java/Acronym.java b/clean-code-challanges/src/main/java/Acronym.java index 5e00939..8359fb0 100644 --- a/clean-code-challanges/src/main/java/Acronym.java +++ b/clean-code-challanges/src/main/java/Acronym.java @@ -1,18 +1,32 @@ +import java.util.List; +import java.util.Locale; + /** * Convert a phrase to its acronym. - * + *

* Techies love their TLA (Three Letter Acronyms)! - * + *

* Help generate some jargon by writing a program that converts a long name like Portable Network Graphics to its acronym (PNG). */ class Acronym { + private final String phrase; Acronym(String phrase) { - + this.phrase = phrase; } String get() { - return null; + String cleanedPhrase = phrase.replaceAll("-|_", " "); + List words = convertPhraseToListOfWords(cleanedPhrase); + String acronym = ""; + for (String word : words){ + acronym += word.toUpperCase(Locale.ROOT).charAt(0); + } + return acronym; + } + + private List convertPhraseToListOfWords(String phrase){ + return List.of(phrase.toLowerCase(Locale.ROOT).split("\\s+")); } } diff --git a/clean-code-challanges/src/main/java/Anagram.java b/clean-code-challanges/src/main/java/Anagram.java index 9930cd0..6af41d6 100644 --- a/clean-code-challanges/src/main/java/Anagram.java +++ b/clean-code-challanges/src/main/java/Anagram.java @@ -1,17 +1,36 @@ +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Locale; /** * Given a word and a list of possible anagrams, select the correct sublist. - * + *

* Given "listen" and a list of candidates like "enlists" "google" "inlets" "banana" the program should return a list containing "inlets". */ public class Anagram { - public Anagram(String word) { + private final String word; + public Anagram(String word) { + this.word = word; } public List match(List candidates) { - return null; + List matches = new ArrayList<>(); + String sortedAnagram = sortLetters(this.word); + for (String candidate : candidates){ + String sortedCandidate = sortLetters(candidate); + if (sortedAnagram.equals(sortedCandidate) && !this.word.toLowerCase(Locale.ROOT).equals(candidate.toLowerCase(Locale.ROOT))){ + matches.add(candidate); + } + } + return matches; + } + + private String sortLetters(String word){ + char [] letters = word.toLowerCase(Locale.ROOT).toCharArray(); + Arrays.sort(letters); + return new String(letters); } } diff --git a/clean-code-challanges/src/main/java/PigLatinTranslator.java b/clean-code-challanges/src/main/java/PigLatinTranslator.java index 602a04d..5555194 100644 --- a/clean-code-challanges/src/main/java/PigLatinTranslator.java +++ b/clean-code-challanges/src/main/java/PigLatinTranslator.java @@ -1,3 +1,5 @@ +import java.util.*; + /** * Implement a program that translates from English to Pig Latin. * @@ -17,7 +19,121 @@ */ public class PigLatinTranslator { + private final List vowelSounds = Arrays.asList("a", "e", "i", "o", "u"); + private final List consonantSounds = Arrays.asList("b", "c", "d", "f", "g", "j", "k", "l", "m", "n", "p", "q", "s", "t", "v", "x", "z", "h", "r", "w", "y"); + private final String ay = "ay"; + private final String qu = "qu"; + private final String xr = "xr"; + private final String yt = "yt"; + + public String translate(String englishPhrase) { - return null; + List wordsList = transformEnglishPhraseToWords(englishPhrase); + List cleanedWords = cleanWords(wordsList); + + return pigify(cleanedWords); + } + private String pigify (List words){ + for (String word : words){ + if (isFirstLetterVowel(word) || isWordStartingWithXrOrYt(word)){ + words.set(words.indexOf(word), appendAy(word)); + } else if (isConsonantClusterFollwedByY(word)){ + words.set(words.indexOf(word), appendTwoFirstLetterAy(word)); + }else if (isConsonantFollowedByQu(word)){ + words.set(words.indexOf(word), appendThreeFirstLetterAy(word)); + }else if (isConsonantCluster(word)){ + words.set(words.indexOf(word), appendTwoFirstLetterAy(word)); + }else if (isFirstLetterConsonant(word)){ + words.set(words.indexOf(word), appendFirstLetterAy(word)); + } + } + + return transformWordsToPhrase(words); + } + + private List transformEnglishPhraseToWords(String englishPhrase) { + return List.of(englishPhrase.toLowerCase(Locale.ROOT).split("\\s+")); + } + + private List cleanWords(List words){ + List cleanWords = new ArrayList<>(); + for (String word : words){ + cleanWords.add(word.replaceAll("[^\\w]", "")); + } + System.out.println(cleanWords); + + return cleanWords; + } + + + + + + private boolean isFirstLetterVowel(String word){ + String firstLetter = String.valueOf(word.charAt(0)); + return vowelSounds.contains(firstLetter); + } + + private boolean isWordStartingWithXrOrYt(String word){ + String firstTwoLetters = word.substring(0,2); + return firstTwoLetters.equals(xr) || firstTwoLetters.equals(yt); + } + + private boolean isFirstLetterConsonant(String word){ + String firstLetter = String.valueOf(word.charAt(0)); + return consonantSounds.contains(firstLetter); } + + private boolean isConsonantCluster(String word){ + String secondLetter = String.valueOf(word.charAt(1)); + return isFirstLetterConsonant(word) && consonantSounds.contains(secondLetter); + } + + + private boolean isConsonantFollowedByQu(String word){ + String secondAndThirdLetter = ""; + if (isMinLengthThree(word)){ + secondAndThirdLetter = word.substring(1,3); + } + return isFirstLetterConsonant(word) && secondAndThirdLetter.equals(qu); + } + + private boolean isConsonantClusterFollwedByY(String word){ + String thirdLetter = ""; + if (isMinLengthThree(word)){ + thirdLetter = word.substring(2,3); + } + + return isConsonantCluster(word) && thirdLetter.equals("y"); + } + + private boolean isMinLengthThree(String word){ + return word.length() >= 3; + } + + private String appendAy(String word){ + return word + ay; + } + private String appendFirstLetterAy(String word){ + return word.substring(1) + word.charAt(0) + ay; + + } + private String appendTwoFirstLetterAy(String word){ + return word.substring(2) + word.substring(0,2) + ay; + } + private String appendThreeFirstLetterAy(String word){ + return word.substring(3) + word.substring(0,3) + ay; + } + + private String transformWordsToPhrase(List words){ + return String.join(" ", words); + } + + + + + } + + + diff --git a/clean-code-challanges/src/test/java/AcronymTest.java b/clean-code-challanges/src/test/java/AcronymTest.java index 4fec6c2..8b5f64e 100644 --- a/clean-code-challanges/src/test/java/AcronymTest.java +++ b/clean-code-challanges/src/test/java/AcronymTest.java @@ -3,7 +3,7 @@ import static org.junit.Assert.assertEquals; -@Ignore + public class AcronymTest { @Test diff --git a/clean-code-challanges/src/test/java/AnagramTest.java b/clean-code-challanges/src/test/java/AnagramTest.java index ad4faba..76d97be 100644 --- a/clean-code-challanges/src/test/java/AnagramTest.java +++ b/clean-code-challanges/src/test/java/AnagramTest.java @@ -10,7 +10,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; -@Ignore + public class AnagramTest { @Test diff --git a/clean-code-challanges/src/test/java/IsogramCheckerTest.java b/clean-code-challanges/src/test/java/IsogramCheckerTest.java index e6808f9..188d4fd 100644 --- a/clean-code-challanges/src/test/java/IsogramCheckerTest.java +++ b/clean-code-challanges/src/test/java/IsogramCheckerTest.java @@ -4,7 +4,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -@Ignore + public class IsogramCheckerTest { @Test diff --git a/clean-code-challanges/src/test/java/PigLatinTranslatorTest.java b/clean-code-challanges/src/test/java/PigLatinTranslatorTest.java index c26cdcd..cda49cd 100644 --- a/clean-code-challanges/src/test/java/PigLatinTranslatorTest.java +++ b/clean-code-challanges/src/test/java/PigLatinTranslatorTest.java @@ -16,7 +16,7 @@ public class PigLatinTranslatorTest { @Parameterized.Parameters(name = "{index}: expected \"{0}\" to translate to the pig latin phrase \"{1}\"") public static Collection data() { return Arrays.asList(new Object[][]{ - // Ay is added to words that start with vowels + // Ay is added to words that start with {"apple", "appleay"}, {"ear", "earay"}, {"igloo", "iglooay"},