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
6.5, 9
stimmt nicht mit Ihrer Spezifikation überein, was darauf hinweist, dass x.75 auf x.5 rundet.Antworten:
Gelee , 12 Bytes
Probieren Sie es online aus!
Eine Version, die auf Kosten des zweiten Testfalls gemäß der Spezifikation die Hälfte abrundet:
Gelee , 12 Bytes
Probieren Sie es online aus!
Die Rundungsmethode hier ist näher an Jonathan Allans:
quelle
[1,10,6,7,7,7]
Netzhaut , 86 Bytes
Probieren Sie es online aus! Link enthält Testfälle. Erläuterung:
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
.5
erweitert sich daher auf 2_
s, während das*4*_
für den gesamten_
Zahlenteil gilt und ein Finale angehängt wird.Sortieren Sie die Zahlen in der richtigen Reihenfolge.
Wenn mindestens drei Zahlen vorhanden sind, verwerfen Sie die erste (kleinste) und die letzte (größte).
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.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.quelle
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
Probieren Sie es online aus!
quelle
Ḟ
scheint das falsche Ergebnis für zu produzieren[6.5,9]
.J ,
3635 BytesProbieren Sie es online aus!
Leihte den Doppel- / Boden- / Halbtrick zum Runden auf 0,5 Schritte von Unrelated String.
quelle
Python 3 , 62 Bytes
Probieren Sie es online aus!
quelle
JavaScript (V8) ,
213211189176 ByteBearbeiten: -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 konntea.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.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 (
{ }
undreturn
) 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 werden
r
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)
quelle
a.length
. Da ich ihn also vor und nach Operationen verwende, die das Array ändern,l
wird 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ß anfangss(l()-1)
statt nurs(-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!Gelee , 12 Bytes
Ein monadischer Link, der eine Liste von Zahlen akzeptiert, die eine Zahl ergibt.
Probieren Sie es online aus!
Wie?
quelle
1,10,7,7,7,6
wo 27/4 = 6.75Brachylog , 19 Bytes
Probieren Sie es online aus!
Und ich fand die Rundung in Jelly unangenehm!
quelle
[1,10,7,7,7,6]
; 27/4 = 6,75, was gemäß Spezifikation auf 6,5 runden sollte.Schnell , 203 Bytes
Probieren Sie es online aus!
quelle
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.
Probieren Sie es online aus!
quelle
Zsh ,
141136 BytesProbieren Sie es online aus!
141 BytesDie Lösung folgt der neuesten Spezifikation. Einige Bytes wurden implizit gespeichert
($@)
.Wir iterieren implizit über die Argumente mit
for x
und erstellen eine laufende Summet
und finden auch Maxima, Minimam, n
. Wenn die Anzahl der Argumentea
größer als 2 ist, verwerfen wirm
undn
aus dem Durchschnitt.s
ist 2x der resultierende Durchschnitt. Wenn die Mantisse vons
größer als 0,5 ist, runden Sies
auf, andernfalls kürzen Sie mits^0
. Zum Schluss durch 2 teilen und ausgeben.quelle