O desafio é escrever um programa de código de golfe que, considerando n números reais positivos de 0 a 10 (formato xy, y possa ser apenas 0 ou 5: 0, 0,5, 1, 1,5, 2, 2,5 ... 9,5 e 10), descarte os valores mais altos e mais baixos (apenas um, mesmo que sejam repetidos) e mostra a média dos demais, no formato xy (y pode ser 0 ou 5, arredondado para o mais próximo), semelhante a algumas pontuações nos Jogos Olímpicos.
Exemplos: Entrada -> Saída
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: Se a entrada tiver apenas dois números, não descarte nenhum, apenas faça a média deles. Se a entrada for um número, a saída será a mesma.
Esclarecendo a regra de arredondamento (desculpe, pouco confuso):
x.01 a x.25 arredondam para x.0
x.26 a x.75 arredondado a x.5
x.76 a x.99 arredondado para x + 1.0
6.5, 9
não concorda com suas especificações, o que indica que x.75 arredonda para x.5.Respostas:
Jelly , 12 bytes
Experimente online!
Uma versão que arredonda pela metade para baixo, de acordo com as especificações às custas do segundo caso de teste:
Jelly , 12 bytes
Experimente online!
O método de arredondamento aqui é mais próximo do de Jonathan Allan:
fonte
[1,10,6,7,7,7]
Retina , 86 bytes
Experimente online! O link inclui casos de teste. Explicação:
Como a Retina não pode lidar facilmente com números fracionários ou zero, cada número é representado em unário como 1 mais que 4 vezes o valor. O
.5
expande, portanto, a 2_
s, enquanto que o*4*_
aplica-se a todo o número da peça, e uma final_
é sufixo.Classifique os números em ordem.
Se houver pelo menos três números, descarte o primeiro (menor) e o último (maior).
Ordene os espaços para o início, somando também os números.
Conte o número de espaços e adicione
_
e um separador. Isso então representa o número pelo qual devemos dividir.Divida a soma pelo número de números, permitindo o fato de estarmos trabalhando em múltiplos de 4 vezes o número original, para que as partes inteiras e decimais possam ser extraídas diretamente. Esta é uma divisão truncante, mas, felizmente, porque adicionamos um extra
_
a cada número, o resultado inclui efetivamente 0,25 extra, dando-nos o arredondamento que queremos.fonte
EDIT: Esta resposta tornou-se inválida. Foi válido por cerca de meio minuto após a publicação.
Gelatina , 10 bytes
Experimente online!
fonte
Ḟ
parece produzir o resultado errado para[6.5,9]
.J ,
3635 bytesExperimente online!
Emprestado o truque duplo / piso / metade para arredondar para incrementos de 0,5 a partir de String não relacionada.
fonte
Python 3 , 62 bytes
Experimente online!
fonte
JavaScript (V8) ,
213211189176 bytesEdit: -2 bytes, porque eu terminei com
;\n}
quando eu poderia terminar com um}
erro bobo.Edite 2: -22 mais bytes lendo sobre dicas gerais de golfe em JS. Consegui tirar parênteses de meus ternários aninhados na
r
função de arredondamento e usei operações matemáticas bit a bit para evitar o usoMath.floor
eMath.ceil
Edite 3: -13 bytes porque consegui substituir a
a.length
função de atalho por apenas chamadas diretasa.length
para economizar 4 bytes. Também movi a função g () diretamente para a declaração de retorno, pois ela foi usada apenas uma vez, o que removeu o restante dos bytes.Experimente online!
Tenho certeza de que pode ser melhorado, pois sou bastante novo, mas foi divertido resolver este. Acredito que as principais coisas que poderiam ser melhoradas são minha lógica / métodos de arredondamento e o fato de a função principal usar um corpo de função (
{ }
ereturn
).Havia uma coisa na pergunta que era inconsistente com os exemplos e eu não tinha muita certeza de como lidar com isso. Eu o implementei para que seja consistente com os exemplos, mas não reflete exatamente as regras de arredondamento especificadas. Aqui está o exemplo que achei inconsistente:
6,5, 9 -> 8
Você diz que deve ser 8, embora a média seja 7,75. Nas regras de arredondamento, você diz que deve ter pelo menos 0,76 para ir +1. Eu escolhi refletir os exemplos em vez de suas regras de arredondamento, então> = 0,75 para ir +1 e <= 0,25 para -1, entre 0,25 e 0,75 (exclusivo) para 0,5. Se as especificações de arredondamento forem alteradas, meu código poderá adaptar-se sem alterar o número de bytes, apenas alterando os números na função de arredondamento
r
e, talvez, a ordem da declaração ternária, dependendo das regras.Um pouco sem explicação com explicação (as operações matemáticas foram alteradas para operações bit a bit eg () está diretamente na declaração de retorno)
fonte
a.length
, portanto, como o estou usando antes e depois das operações que modificam a matriz,l
ficará inválido assim que a matriz for alterada. LMK se estiver errado. Acontece que na verdade me economizaria 3 bytes agora para substituir isso pora.length
chamadas diretas . Quando o escrevi inicialmente, eu não sabia que o JS permitia que você usasse números negativos para emenda, então, inicialmente, minha segunda emenda foi ems(l()-1)
vez de apenass(-1)
, e quando eu tinha três chamadas de comprimento, ele salvou bytes para ter esse atalho. Agora não vale mais a pena. Obrigado, irá atualizar!Gelatina , 12 bytes
Um link monádico que aceita uma lista de números que gera um número.
Experimente online!
Quão?
fonte
1,10,7,7,7,6
onde 27/4 = 6,75Braquilog , 19 bytes
Experimente online!
E eu pensei que o arredondamento era estranho em Jelly!
fonte
[1,10,7,7,7,6]
; 27/4 = 6,75, que deve arredondar para 6,5, de acordo com as especificações.Rápido , 203 bytes
Experimente online!
fonte
PHP , 110 bytes
Parece que o PHP tem algumas boas funções internas para isso. Eu apenas array_sum a coisa toda, então se houver mais de dois elementos, subtraia os valores min () e max () e divida por 2 menos que o comprimento da matriz.
Para o arredondamento, uso a função round () com o sinalizador PHP_ROUND_HALF_DOWN (que = 2) no dobro da média e, em seguida, divido-o por 2, para incrementos de 0,5
EDIT: no caso de [6.5, 9], estou seguindo a regra declarada de que 7,75 arredonda para 7,5 e não 8, como no exemplo original dado.
Experimente online!
fonte
Zsh ,
141136 bytesexperimente online!
141bytesA solução segue as especificações mais recentes. Salvou alguns bytes usando implícito
($@)
.Nós iteramos implicitamente sobre os argumentos com
for x
e construímos um total correntet
e também encontramos máximos, mínimosm, n
. Se o número de argumentosa
for maior que 2, descartamosm
en
da média.s
é 2x a média resultante. Se a mantissa des
for maior que 0,5, arredondar paras
cima, caso contrário truncar coms^0
. Finalmente, divida por 2 e faça a saída.fonte