The challenge
Given a string of words, you need to find the highest scoring word.
Each letter of a word scores points according to its position in the alphabet: a = 1, b = 2, c = 3
etc.
You need to return the highest scoring word as a string.
If two words score the same, return the word that appears earliest in the original string.
All letters will be lowercase and all inputs will be valid.
The solution in Java code
Option 1:
import java.util.*;
public class HSW {
public static String high(String s) {
return Arrays.stream(s.split(" "))
.max(Comparator.comparingInt(
a -> a.chars().map(i -> i - 96).sum()
)).get();
}
}
Option 2:
import java.util.Arrays;
import java.util.Comparator;
class HSW {
static String high(String s) {
return Arrays.stream(s.split( " " ))
.sorted( Comparator.comparingInt( HSW::cws )
.reversed()).findFirst().get();
}
private static int cws(String y) {
return y.chars().map( i->i-(int)'a'+1 ).sum();
}
}
Option 3:
public class HSW {
public static String high(String stringOfWords) {
String highscoreWord = "";
int maxTotal = 0;
for (String word : stringOfWords.split(" ")) {
int totalOfWord = 0;
for (char c : word.toCharArray()) {
totalOfWord += c - 96; // the int value of "a" is 97
}
if (totalOfWord > maxTotal) {
maxTotal = totalOfWord;
highscoreWord = word;
}
}
return highscoreWord;
}
}
Test cases to validate our solution
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
import java.util.*;
import java.util.stream.*;
public class SolutionTest {
private static String _high(String s) {
return Stream.of(s.split(" "))
.sorted(Comparator.comparing((String a) -> a.chars().map(b -> b - 96).sum()).reversed())
.findFirst().get();
}
@Test
public void sampleTests() {
assertEquals("taxi", HSW.high("man i need a taxi up to ubud"));
assertEquals("volcano", HSW.high("what time are we climbing up to the volcano"));
assertEquals("semynak", HSW.high("take me to semynak"));
}
@Test
public void randomTests() {
String chars = " abcdefghijklmnopqrstuvwxyz";
Random random = new Random();
for (int i = 0; i < 100; ++i) {
String test = IntStream.range(10, random.nextInt(201))
.mapToObj(x -> Character.toString(chars.charAt(random.nextInt(chars.length()))))
.collect(Collectors.joining()).trim().replaceAll("\\s+", " ");
String expected = _high(test);
String actual = HSW.high(test);
assertEquals(expected, actual);
}
}
}