On Sunday, 13 December 2015 at 01:01:07 UTC, cym13 wrote:

That's because you want to modify it in product passing it by ref.

Hmm, that seems different to c++.


On Sunday, 13 December 2015 at 11:37:50 UTC, cym13 wrote:


As cryptic as it is this means that the range you passed to reduce is empty. Reduce needs it not to be because as I said it needs a seed and as you didn't pass one explicitely as argument it tries to take the first element of the range (and fails obviously). You can either pass it a seed explicitely or add a non-empty check before the return.


Here is the full code, where I changed the product function. Sorry, I don't understand what the difference now and why it crashes.

import std.stdio, std.array, std.algorithm;


int product(const ref int[] arr){

        /*int p = 1;
        foreach(i;arr)
                p*=i;
        return p;*/
        
        return arr.reduce!((a, b) => a*b)();

}


int [] prim_sieve(int n){

        bool [] T;
        T.length = n;
        T[0] = true;
        T[1] = true;
        
        for(int i = 2; i*i <= T.length-1;++i){
                for(int j = i*i;j<T.length; j+=i)
                        T[j] =true;
        }
        int[] v;
        foreach(int i,t;T)
                if(t==false)
                        v~=i;
        return v;
}

int[] prim_factors(int n, const ref int[] P){
        
        int[] v;
        
        for(int i; P[i]*P[i]<=n;++i){
                while(n%P[i]==0){
                        v~=P[i];
                        n/=P[i];
                }
        }
        if(n>1)
                v~=n;
                
        return v.dup.sort.uniq.array;

}


void bubblesort(ref int[2][] v){

        size_t n = v.length;
        do{
                int newn = 1;
                for(int i = 0;i<n-1; ++i){
                        if(v[i][1]>v[i+1][1]){
                                auto temp = v[i];
                                v[i] = v[i+1];
                                v[i+1] = temp;
                                newn = i+1;
                        }
                }
                n=newn; 
        }
        while(n>1);
}



void main(){
        
        int[] P = prim_sieve(500);
        
        int[2][] v;
        
        foreach(k;1..100001){
                auto t = prim_factors(k,P);
                v~= [k,product(t)];
        }
        
        bubblesort(v);
        
        writeln(v[9999][0]);
}

Reply via email to