Olympische Spielwertung [geschlossen]

9

Die Herausforderung besteht darin, ein Golfcode-Programm zu schreiben, das bei n positiven reellen Zahlen von 0 bis 10 (Format xy, y kann nur 0 oder 5: 0, 0,5, 1, 1,5, 2, 2,5… 9,5 und 10 sein). Verwerfen Sie die niedrigsten und höchsten Werte (nur einen, obwohl sie wiederholt werden) und zeigen Sie den Durchschnitt der verbleibenden Werte im xy-Format (y kann 0 oder 5 sein, auf den nächsten gerundet), ähnlich wie bei einigen Olympischen Spielen.

Beispiele: Eingabe -> Ausgabe

6 -> 6

6,5, 9 -> 8

9, 7, 8 -> 8

6, 5, 7, 8, 9 -> 7

5, 6,5, 9, 8, 7 -> 7

6,5, 6,5, 9,5, 8, 7 -> 7

5, 6,5, 7,5, 8,5, 9,5 -> 7,5

Hinweise: Wenn die Eingabe nur aus zwei Zahlen besteht, verwerfen Sie keine, sondern mitteln Sie sie. Wenn die Eingabe eine Zahl ist, ist die Ausgabe dieselbe.

Klarstellung der Rundungsregel (sorry, wenig verwirrend):

x.01 bis x.25 rund auf x.0

x.26 bis x.75 rund auf x.5

x.76 bis x.99 rund auf x + 1.0

JuanCa
quelle
2
Wie ist das zweite Beispiel (6.5, 9 => 8) gültig? Wenn Sie das Hoch und das Niedrig wegwerfen, gibt es keine Durchschnittswerte mehr?
Jeff Zeitlin
2
Willkommen bei Code Golf SE!
AdmBorkBork
6
Ich würde vorschlagen, dass wir keine ungültigen Eingaben verarbeiten. Die Olympischen Spiele haben eine feste Anzahl von Richtern, die für ein solches Ereignis größer als zwei sind. (Tauchen entfernt zum Beispiel die vier Extremitäten von sieben)
Jonathan Allan
7
Ihr Beispiel 6.5, 9stimmt nicht mit Ihrer Spezifikation überein, was darauf hinweist, dass x.75 auf x.5 rundet.
Nick Kennedy
7
Bis die Rundung sortiert ist, habe ich für das Schließen gestimmt.
Nick Kennedy

Antworten:

5

Gelee , 12 Bytes

ṢṖḊȯµÆmḤær0H

Probieren Sie es online aus!

    µ           Take
Ṣ               the input sorted,
 Ṗ              without its last
  Ḋ             or first element,
   ȯ            or the unchanged input if that's empty,
     Æm         then calculate the mean,
       Ḥ        double it,
        ær      round it to the nearest multiple of
          0     10^-0 (= 1),
           H    and halve it.

Eine Version, die auf Kosten des zweiten Testfalls gemäß der Spezifikation die Hälfte abrundet:

Gelee , 12 Bytes

ṢṖḊȯµÆmḤ_.ĊH

Probieren Sie es online aus!

Die Rundungsmethode hier ist näher an Jonathan Allans:

Ḥ        Double,
 _       subtract
  .      one half,
   Ċ     round up,
    H    and halve.
Nicht verwandte Zeichenfolge
quelle
Zufällig entspricht dies versehentlich der Aktualisierung der Spezifikation
Unrelated String
@ NickKennedy Wenn ich nicht runde , ergibt dieser Fall 6.8, was gemäß der Spezifikation auf 7 aufrunden sollte, da 6.75 <6.8 ≤ 7.
Nicht verwandte
1
Entschuldigung eins zwei viele 7s. Ich meinte[1,10,6,7,7,7]
Nick Kennedy
1
Oh ja, das macht es falsch.
Nicht verwandte
4

Netzhaut , 86 Bytes

\.5
__
\d+
*4*__
O`_+
_+ (.+) _+
$1
O`.
^ *
$.&*__:
(_+):(\1{4})*(\1\1)?_*
$#2$#3*$(.5

Probieren Sie es online aus! Link enthält Testfälle. Erläuterung:

\.5
__
\d+
*4*__

Da die Netzhaut nicht ohne weiteres mit Bruch- oder Nullzahlen umgehen kann, wird jede Zahl unary als 1 mehr als das Vierfache des Wertes dargestellt. Das .5erweitert sich daher auf 2 _s, während das *4*_für den gesamten _Zahlenteil gilt und ein Finale angehängt wird.

O`_+

Sortieren Sie die Zahlen in der richtigen Reihenfolge.

_+ (.+) _+
$1

Wenn mindestens drei Zahlen vorhanden sind, verwerfen Sie die erste (kleinste) und die letzte (größte).

O`.

Sortieren Sie die Leerzeichen zum Anfang und summieren Sie so auch die Zahlen.

^ *
$.&*__:

Zählen Sie die Anzahl der Leerzeichen und fügen Sie _ein Trennzeichen hinzu. Dies stellt dann die Zahl dar, durch die wir teilen müssen.

(_+):(\1{4})*(\1\1)?_*
$#2$#3*$(.5

Teilen Sie die Summe durch die Anzahl der Zahlen, wobei Sie berücksichtigen, dass wir in Vielfachen des 4-fachen der ursprünglichen Zahl arbeiten, damit die Ganzzahl- und Dezimalanteile direkt extrahiert werden können. Dies ist eine abschneidende Unterteilung, aber glücklicherweise _enthält das Ergebnis , da wir jeder Zahl ein Extra hinzugefügt haben, effektiv ein Extra von 0,25, wodurch wir die gewünschte Rundung erhalten.

Neil
quelle
3

BEARBEITEN: Diese Antwort ist seitdem ungültig geworden. Es war ungefähr eine halbe Minute gültig, nachdem es veröffentlicht wurde.

Gelee , 10 Bytes

ṢḊṖȯƊÆmḤḞH

Probieren Sie es online aus!

Erik der Outgolfer
quelle
scheint das falsche Ergebnis für zu produzieren [6.5,9].
Nicht verwandte
1
@UnrelatedString Im Moment, als ich dies gepostet habe, war es die richtige Ausgabe. Es sieht so aus, als hätte OP die Regel jetzt geändert.
Erik der Outgolfer
1
Ja, ich habe ein Chaos gemacht, sorry :(
JuanCa
1
Gemäß meinem Kommentar unter Arnauld's Post hatte ich im Grunde auch diesen Algorithmus. Nachdem ich die Regeln geklärt hatte, habe ich meinen gepostet :)
Jonathan Allan
1
@ JonathanAllan Das ist das gleiche wie bei nicht verwandten Strings. : P
Erik der Outgolfer
3

J , 36 35 Bytes

[:(1r4<.@+&.+:+/%#)}:@}.^:(2<#)@/:~

Probieren Sie es online aus!

Leihte den Doppel- / Boden- / Halbtrick zum Runden auf 0,5 Schritte von Unrelated String.

Jona
quelle
3

JavaScript (V8) , 213 211 189 176 Byte

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 rRundungsfunktion 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.lengthVerknü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());
}
Matsyir
quelle
1
Ich habe einen Kommentar zu der Frage nach der Diskrepanz zwischen Beispiel und Spezifikation gepostet.
Nick Kennedy
1
warum du nicht l = a.length verwendest und jedes Mal, wenn du eine Länge willst, rufe einfach l auf, hier weiß ich nicht, warum du hier die Funktion verwendest
Chau Giang
@chaugiang Das würde den Wert speichern, keinen Verweis auf a.length. Da ich ihn also vor und nach Operationen verwende, die das Array ändern, lwird er ungültig, sobald das Array geändert wird. LMK wenn falsch. Es stellt sich heraus, dass ich jetzt tatsächlich 3 Bytes sparen würde, um dies einfach durch direkt zu ersetzena.length Anrufe . Als ich es zum ersten Mal schrieb, wusste ich nicht, dass JS Ihnen erlaubt, negative Zahlen für den Spleiß zu verwenden, also war mein zweiter Spleiß anfangs s(l()-1)statt nur s(-1), und als ich 3 Längenaufrufe hatte, wurden Bytes gespeichert, um diese Verknüpfung zu haben. Jetzt lohnt es sich nicht mehr. Danke, werde aktualisieren!
Matsyir
2

Gelee , 12 Bytes

ṢṖḊȯ⁸ÆmḤ+.ḞH

Ein monadischer Link, der eine Liste von Zahlen akzeptiert, die eine Zahl ergibt.

Probieren Sie es online aus!

Wie?

ṢṖḊȯ⁸ÆmḤ+.ḞH - Link, list of numbers, X
Ṣ            - sort X
 Ṗ           - remove the right-most
  Ḋ          - remove the left-most
    ⁸        - chain's left argument, X
   ȯ         - logical OR (if we have nothing left use X instead)
     Æm      - arithmetic mean
       Ḥ     - double
         .   - literal half
        +    - add
          Ḟ  - floor
           H - halve
Jonathan Allan
quelle
1
@ NickKennedy 34/5> 6.75
Jonathan Allan
1
Sorry meinte 1,10,7,7,7,6wo 27/4 = 6.75
Nick Kennedy
1
Nein, das Problem ist die etwas unkonventionelle Rundung in der Spezifikation. Tatsächlich wird Ihre Antwort auch [1,10,7,6,6,6] falsch (es sollte 6 sein, nicht 6,5), während die ursprüngliche Version von @ UnrelatedString diese richtig macht, weil Python auf gerade rundet (also 12,5 auf 12 abrunden) ). Wie ich jetzt in einem Kommentar zu der Frage ausgeführt habe, verstößt eines der Beispiele auch gegen die Rundungsspezifikation. Beachten Sie auch, dass Bruchteile von Zweierpotenzen kein Problem für Gleitkomma-Ungenauigkeiten sein sollten, da sie eine exakte binäre Darstellung haben.
Nick Kennedy
1
Ich denke, die Spezifikation ist umständlich und möglicherweise unbeabsichtigt. (Was rundet x.251 auf usw .; sind die Grenzen inklusive, exklusiv oder liegt es an uns?) ... und dann gibt es den Kommentar "Ich habe festgestellt, dass es ein bisschen verwirrend ist, lassen Sie uns sie auf den nächsten runden , abhängig von der Plattform ". Vielleicht sollten wir VTC als unklar?
Jonathan Allan
1
Ja, stimme VTC vorerst zu
Nick Kennedy
2

Brachylog , 19 Bytes

o{bṀk|}⟨+/l⟩×₄<÷₂/₂

Probieren Sie es online aus!

Und ich fand die Rundung in Jelly unangenehm!

Nicht verwandte Zeichenfolge
quelle
1
Dies ist falsch für [1,10,7,7,7,6]; 27/4 = 6,75, was gemäß Spezifikation auf 6,5 runden sollte.
Nick Kennedy
2

Schnell , 203 Bytes

func a(b:[Double])->Void{var r=0.0,h=0.0,l=11.0
b.forEach{(c)in h=c>h ?c:h;l=c<l ?c:l;r+=c}
var d=Double(b.count)
r=d>2 ?(r-h-l)/(d-2.0):r/d
d=Double(Int(r))
r=r-d<=0.25 ?d:r-d<=0.75 ?d+0.5:d+1
print(r)}

Probieren Sie es online aus!

onnoweb
quelle
2

PHP , 110 Bytes

Es scheint, dass PHP einige gute integrierte Funktionen dafür hat. Ich habe nur array_sum die ganze Sache, dann, wenn es mehr als zwei Elemente gibt, subtrahiere die min () und max () Werte und dividiere durch 2 weniger als die Länge des Arrays.

Für die Rundung verwende ich die Funktion round () mit dem Flag PHP_ROUND_HALF_DOWN (welches = 2) im doppelten Durchschnitt und dividiere es dann durch 2, sodass es in Schritten von 0,5 erfolgt

BEARBEITEN: Für den Fall von [6.5, 9] folge ich der angegebenen Regel, dass 7,75 auf 7,5 rundet und nicht 8 wie im ursprünglichen Beispiel.

function s($s){$c=count($s);$t=array_sum($s);if($c>2){$c-=2;$t-=min($s)+max($s);}return round($t/$c*2,0,2)/2;}

Probieren Sie es online aus!

XMark
quelle
1
Gut gemacht! Ich wollte eine PHP-Antwort posten, aber die Regeln hatten viele Fehler oder Änderungen, die ich gerade aufgegeben habe! Ich habe Ihren Code ein wenig optimiert und 10 Bytes gespart: Probieren Sie es online aus!
Nacht2
2

Zsh , 141 136 Bytes

Probieren Sie es online aus!   141 Bytes

setopt FORCE_FLOAT
m=$1 n=$1 a=$#
for x ((t+=x))&&m=$[x>m?x:m]&&n=$[x<n?x:n]
s=$[2*(a>2?(t-m-n)/(a-2):t/a)]
<<<$[(s^0+(s-s^0>.5?1:0))/2]

Die Lösung folgt der neuesten Spezifikation. Einige Bytes wurden implizit gespeichert($@) .

Wir iterieren implizit über die Argumente mit for xund erstellen eine laufende Summe tund finden auch Maxima, Minima m, n. Wenn die Anzahl der Argumente agrößer als 2 ist, verwerfen wir mund naus dem Durchschnitt. sist 2x der resultierende Durchschnitt. Wenn die Mantisse von sgrößer als 0,5 ist, runden Sie sauf, andernfalls kürzen Sie mit s^0. Zum Schluss durch 2 teilen und ausgeben.

Roblogik
quelle