Editar: -2 bytes porque terminé ;\n}
cuando podía terminar con un }
error tonto.
Edición 2: -22 bytes más leyendo sobre consejos generales de golf JS. Logré sacar paréntesis de mis ternar anidados en la r
función de redondeo, y utilicé operaciones matemáticas bit a bit para evitar usar Math.floor
yMath.ceil
Edición 3: -13 bytes porque pude reemplazar la a.length
función de acceso directo con solo llamadas directas a.length
para ahorrar 4 bytes. También moví la función g () directamente a la declaración de devolución, ya que solo se usó una vez, lo que eliminó el resto de los bytes.
a=>{s=i=>a.splice(i,1)
e=_=>a.reduce((t,i)=>t+=i)/a.length
r=n=>(m=n%1,m<0.75?m>0.25?~~(n)+0.5:~~(n):n%1?-~n:n)
return a.length>2?r((a.sort((x,y)=>x-y),s(0),s(-1),e())):r(e())}
Pruébalo en línea!
Estoy seguro de que se puede mejorar, ya que soy bastante nuevo, pero fue divertido resolverlo. Creo que las principales cosas que podrían mejorarse son mis métodos / lógica de redondeo y el hecho de que la función principal utiliza un cuerpo de función ( { }
yreturn
).
Había una cosa en la pregunta que era inconsistente con los ejemplos y no estaba realmente seguro de cómo manejarlo. Lo implementé para que sea consistente con los ejemplos, pero no refleja exactamente las reglas de redondeo especificadas, aquí está el ejemplo que encontré que es inconsistente:
6.5, 9 -> 8
Dices que debería ser 8, aunque el promedio es 7.75. En las reglas de redondeo, usted dice que tiene que ser al menos .76 para ir a +1. Elegí reflejar los ejemplos en lugar de sus reglas de redondeo, por lo que> = 0.75 para ir a +1, y <= 0.25 para ir a -1, entre 0.25 y 0.75 (exclusivo) para .5. Si las especificaciones de redondeo cambian, mi código debería poder adaptarse sin cambiar el número de bytes, simplemente cambiando los números en la función de redondeor
, y tal vez el orden de la declaración ternaria dependiendo de las reglas.
Ligeramente inexpresivo con la explicación (las operaciones matemáticas se cambiaron a operaciones bit a bit y g () está directamente en la declaración de devolución)
a => { // a is the input array
s = i=>a.splice(i, 1); // shortcut to remove index i for 1 element
e = _=>a.reduce((t, i) => t += i) / a.length; // get array avg
g = _=>(a.sort((x,y)=>x-y), s(0), s(-1), e()); // what to execute when > 2: sort, remove 1st/last, get avg
t = n=>Math.floor(n); // Math.floor shortcut
// apply olympic rounding to number by checking the value of n%1
r = n=>(m=n%1,m < 0.75 ? (m > 0.25 ? t(n) + 0.5 : t(n)) : Math.ceil(n));
// if arr length > 2: round g(), otherwise round e()
return a.length > 2 ? r(g()) : r(e());
}