El desafío es escribir un programa de código de golf que, dados n números reales positivos del 0 al 10 (formato xy, y solo puede ser 0 o 5: 0, 0.5, 1, 1.5, 2, 2.5 ... 9.5 y 10), descarta los valores más bajos y más altos (solo uno, aunque se repitan) y muestra el promedio del resto, en formato xy (y puede ser 0 o 5, redondeado al más cercano), similar a la puntuación de algunos Juegos Olímpicos.
Ejemplos: Entrada -> Salida
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
Notas: Si la entrada es solo dos números, no descarte ninguno, solo promedie. Si la entrada es un número, la salida es la misma.
Aclarando la regla de redondeo (lo siento, poco confuso):
x.01 a x.25 redondeado a x.0
x.26 a x.75 redondeado a x.5
x.76 a x.99 redondeado a x + 1.0
6.5, 9
no está de acuerdo con su especificación que indica que x.75 se redondea a x.5.Respuestas:
Jalea , 12 bytes
Pruébalo en línea!
Una versión que redondea mitades hacia abajo, de acuerdo con la especificación a expensas del segundo caso de prueba:
Jalea , 12 bytes
Pruébalo en línea!
El método de redondeo aquí es más cercano al de Jonathan Allan:
fuente
[1,10,6,7,7,7]
Retina , 86 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Dado que Retina no puede manejar fácilmente números fraccionales o cero, cada número se representa en unario como 1 más de 4 veces el valor. Por lo
.5
tanto, el se expande a 2_
s, mientras que el se*4*_
aplica a la parte del número entero, y_
se agrega un final .Ordenar los números en orden.
Si hay al menos tres números, descarte el primero (el más pequeño) y el último (el más grande).
Ordena los espacios al inicio, sumando también los números.
Cuente el número de espacios y agregue
_
y un separador. Esto representa el número por el que tenemos que dividir.Divida la suma entre el número de números, teniendo en cuenta el hecho de que estamos trabajando en múltiplos de 4 veces el número original, de modo que las partes enteras y decimales se puedan extraer directamente. Esta es una división truncada, pero afortunadamente porque agregamos un extra
_
a cada número, el resultado incluye efectivamente un extra de 0.25, lo que nos da el redondeo que queremos.fuente
EDITAR: Esta respuesta ya no es válida. Fue válido durante aproximadamente medio minuto después de su publicación.
Jalea , 10 bytes
Pruébalo en línea!
fuente
Ḟ
parece producir el resultado incorrecto para[6.5,9]
.J ,
3635 bytesPruébalo en línea!
Pidió prestado el truco de doble / piso / reducir a la mitad para redondear a 0.5 incrementos de Cadena no relacionada.
fuente
Python 3 , 62 bytes
Pruébalo en línea!
fuente
JavaScript (V8) ,
213211189176 bytesEditar: -2 bytes porque terminé
;\n}
cuando podía terminar con un}
error tonto.Edición 2: -22 bytes más leyendo sobre consejos generales de golf JS. Logré sacar paréntesis de mis ternar anidados en la
r
función de redondeo, y utilicé operaciones matemáticas bit a bit para evitar usarMath.floor
yMath.ceil
Edición 3: -13 bytes porque pude reemplazar la
a.length
función de acceso directo con solo llamadas directasa.length
para ahorrar 4 bytes. También moví la función g () directamente a la declaración de devolución, ya que solo se usó una vez, lo que eliminó el resto de los bytes.Pruébalo en línea!
Estoy seguro de que se puede mejorar, ya que soy bastante nuevo, pero fue divertido resolverlo. Creo que las principales cosas que podrían mejorarse son mis métodos / lógica de redondeo y el hecho de que la función principal utiliza un cuerpo de función (
{ }
yreturn
).Había una cosa en la pregunta que era inconsistente con los ejemplos y no estaba realmente seguro de cómo manejarlo. Lo implementé para que sea consistente con los ejemplos, pero no refleja exactamente las reglas de redondeo especificadas, aquí está el ejemplo que encontré que es inconsistente:
6.5, 9 -> 8
Dices que debería ser 8, aunque el promedio es 7.75. En las reglas de redondeo, usted dice que tiene que ser al menos .76 para ir a +1. Elegí reflejar los ejemplos en lugar de sus reglas de redondeo, por lo que> = 0.75 para ir a +1, y <= 0.25 para ir a -1, entre 0.25 y 0.75 (exclusivo) para .5. Si las especificaciones de redondeo cambian, mi código debería poder adaptarse sin cambiar el número de bytes, simplemente cambiando los números en la función de redondeo
r
, y tal vez el orden de la declaración ternaria dependiendo de las reglas.Ligeramente inexpresivo con la explicación (las operaciones matemáticas se cambiaron a operaciones bit a bit y g () está directamente en la declaración de devolución)
fuente
a.length
, por lo que dado que lo estoy usando antes y después de las operaciones que modifican la matriz,l
quedaría inválido tan pronto como se cambie la matriz. LMK si está mal. Resulta que en realidad me ahorraría 3 bytes ahora para reemplazar esto cona.length
llamadas directas . Cuando lo escribí inicialmente, no sabía que JS le permitía usar números negativos para el empalme, por lo que inicialmente mi segundo empalme fue ens(l()-1)
lugar de solos(-1)
, y cuando tuve 3 llamadas de longitud, guardó bytes para tener este acceso directo. Ahora ya no vale la pena. Gracias, se actualizará!Jalea , 12 bytes
Un enlace monádico que acepta una lista de números que produce un número.
Pruébalo en línea!
¿Cómo?
fuente
1,10,7,7,7,6
donde 27/4 = 6.75Brachylog , 19 bytes
Pruébalo en línea!
¡Y pensé que el redondeo era incómodo en Jelly!
fuente
[1,10,7,7,7,6]
; 27/4 = 6.75 que debería redondear a 6.5 de acuerdo con las especificaciones.Rápido , 203 bytes
Pruébalo en línea!
fuente
PHP , 110 bytes
Parece que PHP tiene algunas buenas funciones integradas para esto. Simplemente array_sum todo, entonces si hay más de dos elementos, reste los valores min () y max () y divídalos entre 2 menos que la longitud de la matriz.
Para el redondeo, utilizo la función round () con el indicador PHP_ROUND_HALF_DOWN (que = 2) en el doble del promedio, y luego lo divido por 2 para que vaya en incrementos de 0.5
EDITAR: para el caso de [6.5, 9] estoy siguiendo la regla establecida de que 7.75 se redondea a 7.5 y no 8 como en el ejemplo original dado.
Pruébalo en línea!
fuente
Zsh ,
141136 bytesPruébalo en línea!
141bytesLa solución sigue las últimas especificaciones. Guardado algunos bytes usando implícito
($@)
.Implícitamente iteramos sobre los argumentos con
for x
, construimos un total acumuladot
y también encontramos máximos, mínimosm, n
. Si el número de argumentosa
es mayor que 2, descartamosm
yn
del promedio.s
es 2 veces el promedio resultante. Si la mantisa des
es mayor que 0.5, redondeas
hacia arriba, de lo contrario trunca cons^0
. Finalmente, divide por 2 y salida.fuente