Chỉnh sửa: -2 byte bởi vì tôi đã kết thúc ;\n}
khi tôi có thể kết thúc bằng một }
lỗi ngớ ngẩn.
Chỉnh sửa 2: -22 nhiều byte hơn bằng cách đọc về các mẹo chơi gôn chung của JS. Tôi đã xoay sở để loại bỏ các dấu ngoặc đơn từ các ternary lồng nhau của mình trong r
hàm làm tròn và sử dụng các phép toán bitwise để tránh sử dụng Math.floor
vàMath.ceil
Chỉnh sửa 3: -13 byte vì tôi có thể thay thế a.length
chức năng phím tắt chỉ bằng các cuộc gọi trực tiếp a.length
để lưu 4 byte. Tôi cũng đã chuyển hàm g () trực tiếp vào câu lệnh return, vì nó chỉ được sử dụng một lần, loại bỏ phần còn lại của các byte.
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())}
Hãy thử trực tuyến!
Tôi chắc chắn rằng nó có thể được cải thiện vì tôi khá mới, nhưng thật vui khi giải quyết vấn đề này. Tôi tin rằng những điều chính có thể được cải thiện là logic / phương pháp làm tròn của tôi và thực tế là hàm chính sử dụng một thân hàm ( { }
và return
).
Có một điều trong câu hỏi không phù hợp với các ví dụ và tôi không thực sự chắc chắn làm thế nào để xử lý nó. Tôi đã triển khai nó sao cho phù hợp với các ví dụ, nhưng nó không phản ánh chính xác các quy tắc làm tròn được chỉ định, đây là ví dụ tôi thấy không nhất quán:
6,5, 9 -> 8
Bạn nói nó phải là 8, mặc dù trung bình là 7,75. Trong quy tắc làm tròn, bạn nói rằng nó phải có ít nhất 0,7 để đi +1. Tôi đã chọn phản ánh các ví dụ thay vì quy tắc làm tròn của bạn, vì vậy> = 0,75 để đi +1 và <= 0,25 để đi -1, trong khoảng 0,25 đến 0,75 (loại trừ) cho 0,5. Nếu thông số kỹ thuật làm tròn thay đổi, mã của tôi sẽ có thể thích ứng mà không thay đổi số byte, chỉ bằng cách thay đổi số trong hàm làm trònr
và có thể là thứ tự của câu lệnh ternary tùy thuộc vào quy tắc.
Hơi khó hiểu với lời giải thích (các phép toán đã được thay đổi thành phép toán bitwise và g () trực tiếp trong câu lệnh return)
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());
}