Si te encuentras con alguna parte que no comprendes puedes comentarlo y haremos todo lo necesario de ayudarte lo más rápido posible.
Solución:
JavaScript (Node.js), 122 115 bytes
N=>W=S=>2*S>N?W(N-S).map(t=>1-t):(t=(Q=s=>n?[r=s-s*Math.random()**(1/--n),...r>1?[++Q]:Q(s-r)]:[])(S,n=N),Q?t:W(S))
¡Pruébelo en línea!
pitón 2, 144128 119 bytes
from random import*
def f(n,s):
r=min(s,1);x=uniform(max(0,r-(r-s/n)*2),r);return n<2and[s]or sample([x]+f(n-1,s-x),n)
¡Pruébelo en línea!
- -20 bytes, gracias a Kevin Cruijssen
Java 8, 194188196237 236 bytes
n->s->double r[]=new double[n+1],d[]=new double[n],t;int f=0,i=n,x=2*s>n?1:0;for(r[n]=s=x>0?n-s:s;f<1;)for(f=1;i-->1;)r[i]=Math.random()*s;for(java.util.Arrays.sort(r);i0?1-t:t)f=(t=Math.abs(r[i]-r[i+1]))>1?0:f;return d;
+49 bytes (188 → 196 y 196 → 237) para corregir la velocidad de los casos de prueba que se acercan a 1, así como corregir el algoritmo en general.
Pruébelo en línea
Explicación:
Utiliza el enfoque en esta respuesta de StackoverFlow, dentro de un bucle, siempre que uno de los elementos siga siendo mayor que 1.
También si 2*s>n
, s
será transformado en n-s
y se establece una bandera para indicar que debemos usar 1-diff
en vez de diff
en el resultado-array (gracias por el consejo @soktinpk y @l4m2).
n->s-> // Method with integer & double parameters and Object return-type
double r[]=new double[n+1]
// Double-array of random values of size `n+1`
d[]=new double[n],
// Resulting double-array of size `n`
t; // Temp double
int f=0, // Integer-flag (every item below 1), starting at 0
i=n, // Index-integer, starting at `n`
x= // Integer-flag (average below 0.5), starting at:
2*s>n? // If two times `s` is larger than `n`:
1 // Set this flag to 1
: // Else:
0; // Set this flag to 0
for(r[n]=s= // Set both the last item of `r` and `s` to:
x>0? // If the flag `x` is 1:
n-s // Set both to `n-s`
: // Else:
s; // Set both to `s`
f<1;) // Loop as long as flag `f` is still 0
for(f=1; // Reset the flag `f` to 1
i-->1;) // Inner loop `i` in range (n,1] (skipping the first item)
r[i]=Math.random()*s;
// Set the i'th item in `r` to a random value in the range [0,s)
for(java.util.Arrays.sort(r);
// Sort the array `r` from lowest to highest
i0? // If the flag `x` is 1:
1-t // Set it to `1-t`
: // Else:
t) // Set it to `t`
f=(t=Math.abs( // Set `t` to the absolute difference of:
r[i]-r[i+1]))
// The i'th & (i+1)'th items in `r`
>1? // And if `t` is larger than 1 (out of the [0,1] boundary)
0 // Set the flag `f` to 0
: // Else:
f; // Leave the flag `f` unchanged
return d; // Return the array `d` as result
No se te olvide comunicar esta reseña si si solucionó tu problema.
¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)