Desafio
Dado um número x
e um número n
, arredondar x
para n
números significativos e gerar o resultado.
Figuras significativas
Os números significativos de um número são dígitos que carregam significado, contribuindo para sua resolução de medição. Isso inclui todos os números, exceto os zeros à esquerda.
Lembre-se de que zeros à esquerda após um ponto decimal ainda são números insignificantes .
Ao arredondar um dígito, você deve arredondar para zero se o dígito a seguir for maior ou igual a cinco.
Todos os zeros à direita após um ponto decimal são contados como significativos.
Entrada
O primeiro número será x
, o número a ser arredondado. O segundo número será n
o número de números significativos para os quais você deve arredondar x
.
x
será um número (seu código deve lidar com números inteiros e pontos flutuantes) entre -1.000.000.000 e 1.000.000.000 inclusive. n
será um número inteiro positivo entre 1 e 50, inclusive. n
nunca será maior que o número de dígitos x
.
A entrada nunca será 0
ou qualquer forma de 0
, por exemplo, 0.000
ou 000
.
Exemplos
Inputs: 2.6754, 2
Output: 2.7
Uma saída de 2.7000
seria inválida porque os zeros à direita após o ponto decimal são contados como números significativos.
Inputs: 0.00034551, 4
Output: 0.0003455
Inputs: 50237.1238, 3
Output: 50200
Observe que isso não deve ter um ponto decimal.
Inputs: 2374905, 1
Output: 2000000
Inputs: 543.0489, 4
Output: 543.0
Inputs: 15, 1
Output: 20
Inputs: 520.3, 3
Output: 520
Se desejar, você pode produzir, em 520.
vez disso, mas não 520.0
.
Inputs: -53.87, 2
Output: -54
Inputs: 0.0999, 2
Output: 0.10
Regras
As funções e bibliotecas internas que permitem arredondar um número para n
números significativos não são permitidas.
Ganhando
O código mais curto em bytes vence.
Inputs: 520.3, 3
, o ponto decimal na resposta não é520.
crucial?2.0 x 10^2
, mostrando os 2 sigfigs.Respostas:
Python 3, 83 bytes
(semelhante à resposta do PHP)
Casos de teste:
Saída:
Além de ser um pouco mais longo, outra abordagem que considerei:
... produz uma saída incorreta para a entrada de (15, 1):
... devido à imprecisão do ponto flutuante na
round()
função. Parece-me provável que eu pudesse encontrar casos de teste que quebrariam o método "arredondar para zero casas decimais" também se eu parecesse bastante.Assim, parece-me que minha solução provavelmente não é 100% correta para todos os casos e não seria, a menos que fosse computada em decimal. Portanto, esse problema pode afetar soluções em qualquer idioma que use a aritmética de FP.
fonte
s
na mesma linha e usando ponto e vírgula.def s(x,n):y=10**(ceil(log10(abs(x)))-n);return y*round(x/y)
import *
para fazê-loimport*
round()
função arredonda paran
casas decimais, e não paran
números significativos, por isso foi permitida para este evento de golfe.PHP, 130 bytes
PHP, 133 bytes trabalha com valores <1 para os números significativos
PHP, 56 bytes funciona, mas ignora zeros desnecessários
Alguém roubou ou excluiu a função round no PHP! Para tornar o desafio mais interessante. 127 bytes
fonte
Lote,
660652 bytesExplicação: Inicia com o sufixo
.
a no parâmetro, caso ele ainda não tenha um, e apara o sinal (que é salvo) e os zeros à esquerda. A variável resultantem
é salva para mais tarde porque nos dirá a magnitude desejada do resultado. Todos os.
s são removidos, o que pode resultar em zeros à esquerda, e também são removidos.n
zeros são sufixados para garantir que haja dígitos suficientes para arredondar e, em seguida, on
primeiro e o terceiron
dígitos são extraídos. Se on
dígito th não for 4 ou menos, adicionaremos tediosamente1
à string. Se a cadeia estourar, aumentamos a magnitude prefixando a1
, mas se era originalmente menor do que o0.1
que fazemos, removendo o1
que acabamos de adicionar e também um0
após o ponto decimal. Se a magnitude ainda for menor que1
, copiamos os zeros após o ponto decimal para o resultado; no entanto, se é1
ou mais, extraímos a parte inteira da resposta, adicionando zeros extras, se necessário, para atingir o ponto decimal (que é então excluído porque mostraria precisão incorreta). Finalmente, o sinal, a parte inteira, o ponto decimal e a parte decimal são concatenados.fonte