Edit: -2 bytes, porque eu terminei com ;\n}
quando eu poderia terminar com um}
erro bobo.
Edite 2: -22 mais bytes lendo sobre dicas gerais de golfe em JS. Consegui tirar parênteses de meus ternários aninhados na r
função de arredondamento e usei operações matemáticas bit a bit para evitar o uso Math.floor
eMath.ceil
Edite 3: -13 bytes porque consegui substituir a a.length
função de atalho por apenas chamadas diretas a.length
para economizar 4 bytes. Também movi a função g () diretamente para a declaração de retorno, pois ela foi usada apenas uma vez, o que removeu o restante dos 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())}
Experimente online!
Tenho certeza de que pode ser melhorado, pois sou bastante novo, mas foi divertido resolver este. Acredito que as principais coisas que poderiam ser melhoradas são minha lógica / métodos de arredondamento e o fato de a função principal usar um corpo de função ({ }
ereturn
).
Havia uma coisa na pergunta que era inconsistente com os exemplos e eu não tinha muita certeza de como lidar com isso. Eu o implementei para que seja consistente com os exemplos, mas não reflete exatamente as regras de arredondamento especificadas. Aqui está o exemplo que achei inconsistente:
6,5, 9 -> 8
Você diz que deve ser 8, embora a média seja 7,75. Nas regras de arredondamento, você diz que deve ter pelo menos 0,76 para ir +1. Eu escolhi refletir os exemplos em vez de suas regras de arredondamento, então> = 0,75 para ir +1 e <= 0,25 para -1, entre 0,25 e 0,75 (exclusivo) para 0,5. Se as especificações de arredondamento forem alteradas, meu código poderá adaptar-se sem alterar o número de bytes, apenas alterando os números na função de arredondamentor
e, talvez, a ordem da declaração ternária, dependendo das regras.
Um pouco sem explicação com explicação (as operações matemáticas foram alteradas para operações bit a bit eg () está diretamente na declaração de retorno)
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());
}