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