Bearbeiten: -2 Bytes, weil ich mit endete ;\n}
mit einem }
dummen Fehler .
Bearbeiten Sie 2: -22 weitere Bytes, indem Sie allgemeine JS-Golftipps lesen. Ich habe es geschafft, Klammern aus meinen verschachtelten Ternären in der r
Rundungsfunktion zu entfernen , und habe bitweise mathematische Operationen verwendet, um die Verwendung zu vermeidenMath.floor
undMath.ceil
Bearbeiten Sie 3: -13 Bytes, da ich die a.length
Verknüpfungsfunktion durch direkte Aufrufe ersetzen konnte a.length
, um 4 Bytes zu sparen. Ich habe auch die Funktion g () direkt in die return-Anweisung verschoben, da sie nur einmal verwendet wurde, wodurch der Rest der Bytes entfernt wurde.
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())}
Probieren Sie es online aus!
Ich bin sicher, dass es verbessert werden kann, da ich ziemlich neu bin, aber es hat Spaß gemacht, dieses Problem zu lösen. Ich glaube, die wichtigsten Dinge, die verbessert werden könnten, sind meine Rundungslogik / -methoden und die Tatsache, dass die Hauptfunktion einen Funktionskörper ( { }
und return
) verwendet.
Es gab eine Sache in der Frage, die nicht mit den Beispielen übereinstimmte, und ich war mir nicht sicher, wie ich damit umgehen sollte. Ich habe es so implementiert, dass es mit den Beispielen übereinstimmt, aber es spiegelt nicht genau die angegebenen Rundungsregeln wider. Hier ist das Beispiel, das ich als inkonsistent empfunden habe:
6,5, 9 -> 8
Sie sagen, es sollte 8 sein, obwohl der Durchschnitt 7,75 ist. In den Rundungsregeln sagen Sie, dass es mindestens 0,76 sein muss, um +1 zu erhalten. Ich habe mich dafür entschieden, die Beispiele anstelle Ihrer Rundungsregeln wiederzugeben, also> = 0,75 für +1 und <= 0,25 für -1 zwischen 0,25 und 0,75 (exklusiv) für 0,5. Wenn sich die Rundungsspezifikationen ändern, sollte sich mein Code anpassen können, ohne die Anzahl der Bytes zu ändern, indem nur die Zahlen in der Rundungsfunktion geändert werdenr
und möglicherweise die Reihenfolge der ternären Anweisung in Abhängigkeit von den Regeln geändert werden.
Mit Erklärung etwas ungolfed (die mathematischen Operationen wurden in bitweise Operationen geändert und g () steht direkt in der return-Anweisung)
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());
}