Skip to content

Instantly share code, notes, and snippets.

@rorosaurus
Last active October 29, 2016 19:28
Show Gist options
  • Save rorosaurus/e0e9354878a49cb51705 to your computer and use it in GitHub Desktop.
Save rorosaurus/e0e9354878a49cb51705 to your computer and use it in GitHub Desktop.
SHOTS
public static void main(String args[]){
final int startingShot = 1;
ArrayList<Integer> startingList = new ArrayList<Integer>();
// fill list with shots
for(int i=0;i<1024;i++){
startingList.add(i, i+1);
}
// find solution
for (int solution=0;solution<=1024;solution++){
// init
int currentShotIndex = startingShot-1;
ArrayList<Integer> shotsList = (ArrayList<Integer>)startingList.clone();
// take shots until just 7 is left
while(!allShotsBut7(shotsList)){
// find next shot, Circle back around
for(int i=0; i<solution; i++){
currentShotIndex = (currentShotIndex+1) % shotsList.size();
}
//shoot
if (shotsList.get(currentShotIndex) == 7)break;
shotsList.remove(currentShotIndex);
// recover if we're now outside of the circle as a result of last shot
if (currentShotIndex > shotsList.size()-1){
currentShotIndex = 0;
}
}
if (allShotsBut7(shotsList)){
System.out.println("Only shot 7 is left! Solution found: " + solution);
}
}
}
public static boolean allShotsBut7(ArrayList<Integer> list){
return (list.get(0) == 7 && list.size() == 1);
}
@rorosaurus
Copy link
Author

There is an excellent writeup of this problem in Donald Knuth’s Concrete Mathematics (Chapter 1, Section 3), which gives a closed form solution and the intuition behind it.

@rorosaurus
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment