Solving “Duck Duck Goose” in Java


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;
    }
}