The challenge
The objective of Duck, duck, goose is to walk in a circle, tapping on each player’s head until one is chosen.
Task: Given an array of Player objects (an array of associative arrays in PHP) and an index (1-based), return the name
of the chosen Player(name
is a property of Player
objects, e.g Player.name
)
Example:
duck_duck_goose([a, b, c, d], 1) should return a.name
duck_duck_goose([a, b, c, d], 5) should return a.name
duck_duck_goose([a, b, c, d], 4) should return d.name
The solution in Java code
Option 1 (returning the modulo
):
public class Solution {
public static String duckDuckGoose(Player[] players, int goose) {
return players[(goose - 1) % players.length].name;
}
}
Option 2 (slightly longer
):
public class Solution {
public static String duckDuckGoose(Player[] players, int goose) {
int a = players.length;
int b = goose%a-1;
if(b<0) b = b+a;
return players[b].name;
}
}
Option 3 (working through the problem
):
public class Solution {
public static String duckDuckGoose(Player[] players, int goose) {
int len = players.length;
int diff = 0;
if(goose > 0) {
if(goose % len == 0){
return players[len-1].name;
}
if(goose > len){
diff = (goose % len) - 1;
} else if(goose == 1) {
diff = 0;
}
if(goose < len){
diff = goose - 1;
}
if(goose == len){
return players[len-1].name;
}
}
return players[diff].name;
}
}
Option 4 (using a while
):
public class Solution {
public static String duckDuckGoose(Player[] players, int goose) {
int size = players.length ;
while (goose > size) {
goose = goose - size;
}
return players[goose-1].name;
}
}
Test cases to validate our Java solution
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
public class ExampleSolutionTests {
@Test
public void tests() {
Player[] players = makePlayerArr(new String[] {"a", "b", "c", "d", "c", "e", "f", "g", "h", "z"});
assertEquals("a", Solution.duckDuckGoose(players, 1));
assertEquals("c", Solution.duckDuckGoose(players, 3));
assertEquals("z", Solution.duckDuckGoose(players, 10));
assertEquals("z", Solution.duckDuckGoose(players, 20));
assertEquals("z", Solution.duckDuckGoose(players, 30));
assertEquals("g", Solution.duckDuckGoose(players, 18));
assertEquals("g", Solution.duckDuckGoose(players, 28));
assertEquals("b", Solution.duckDuckGoose(players, 12));
assertEquals("b", Solution.duckDuckGoose(players, 2));
assertEquals("f", Solution.duckDuckGoose(players, 7));
}
private Player[] makePlayerArr(String[] names) {
Player[] players = new Player[names.length];
for (int i = 0; i < names.length; i++) {
players[i] = new Player(names[i]);
}
return players;
}
}