編集:-2バイト;\n}
は}
、愚かな間違いで終わる可能性があるときに終わったためです。
編集2:一般的なJSゴルフのヒントを読んで、-22バイト増やします。r
丸め関数で入れ子になった3進数からかっこを取り除くことができ、ビット単位の数学演算を使用してMath.floor
、Math.ceil
編集3:-13バイト。a.length
ショートカット関数を、a.length
4バイトを節約するための直接呼び出しに置き換えることができたため。また、g()関数はreturnステートメントに直接移動しました。これは1回しか使用されなかったため、残りのバイトが削除されたためです。
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())}
オンラインでお試しください!
私はかなり新しいので改善できると確信していますが、これを解決するのは楽しかったです。改善できる主なことは、私の丸めのロジック/メソッド、およびメイン関数が関数本体({ }
およびreturn
)を使用しているという事実だと思います。
質問には例と一致しないものが1つあり、その処理方法が本当にわかりませんでした。例と一致するように実装しましたが、指定された丸め規則を正確に反映していません。一貫性がないことがわかった例を次に示します。
6.5、9-> 8
平均は7.75ですが、8にする必要があります。端数処理ルールでは、+ 1になるには少なくとも0.76でなければならないということです。丸め規則の代わりに例を反映することを選択したので、0.5の場合は0.25以上0.75以下の範囲で、+ 1の場合は> = 0.75、-1の場合は<= 0.25です。丸めの仕様が変更された場合、丸め関数の数値を変更するだけで、バイト数を変更せずにコードを適合させることができr
ます。規則に応じて、3進ステートメントの順序を変更することもできます。
説明を少し控えめにしました(数学演算はビット演算に変更され、g()は直接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());
}