Skip to content

Instantly share code, notes, and snippets.

@Riduidel
Created January 4, 2010 09:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Riduidel/268420 to your computer and use it in GitHub Desktop.
Save Riduidel/268420 to your computer and use it in GitHub Desktop.
def next=[1:1];
def length = [1:1];
def getNext(number) {
if((number%2)==0) {
return number/2;
} else {
return 3*number+1;
}
}
def getSequence(numbers, number) {
def returned = [];
returned << number;
if(number!=1) {
returned.addAll(getSequence(numbers, numbers.get(number)));
}
return returned;
}
def getLength(next, length, i) {
int size = 1;
int number = i;
while(number!=1) {
number = next[number];
if(length.containsKey(number)) {
size+=length[number];
break;
} else {
size++;
}
}
return size;
}
long start = System.currentTimeMillis();
def toCompute = [];
def max = 1000000;
toCompute+=1..max;
int index=0;
while(toCompute.size()>0) {
def current = toCompute.remove(0);
if(!next.containsKey(current)) {
next[current]=getNext(current).toInteger();
if(!next.containsKey(next[current])) {
toCompute << next[current];
}
if(index%100000==0)
println "$index th number reached in "+(System.currentTimeMillis()-start)+" ms";
index++;
}
}
println "all values computed";
index=0;
for(i in next.keySet()) {
length[i] = getLength(next, length, i);
if(index%100000==0)
println "$index th length computed in "+(System.currentTimeMillis()-start)+" ms";
index++;
}
println "max length = "+length.values().max();
long end = System.currentTimeMillis();
println "duration "+((end-start)/1000.0)+" s";
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment