Escreva uma função que inclua uma lista de números inteiros positivos e retorne uma lista de números inteiros aproximando a porcentagem do total para o número inteiro correspondente na mesma posição.
Todos os números inteiros na lista de retorno devem adicionar exatamente até 100. Você pode assumir que a soma dos números inteiros passados é maior que 0. Como você deseja arredondar ou truncar decimais, é com você, desde que qualquer número inteiro resultante retorne como porcentagem está desativado em não mais que 1 em qualquer direção.
p([1,0,2]) -> [33,0,67] or [34,0,66]
p([1000,1000]) -> [50,50]
p([1,1,2,4]) -> [12,12,25,51] or [13,12,25,50] or [12,13,25,50] or [12,12,26,50]
p([0,0,0,5,0]) -> [0,0,0,100,0]
Isso é código-golfe , então o código mais curto em bytes vence!
code-golf
array-manipulation
DaveAlger
fonte
fonte
p([2,2,2,2,2,3])
. Tem muitas respostas legais possíveis, mas nem todas2
podem ser mapeadas para o mesmo valor. Isso elimina muitos algoritmos excessivamente simples que funcionam em todos os casos de teste anteriores porque o arredondamento não é muito ruim.p([1000,1000]) -> [49,51]
?Respostas:
Dyalog APL,
211916 bytesO acima é um trem equivalente a
Experimente online.
Como funciona
fonte
TI-BASIC,
262316 bytesPara calculadoras da série TI-83 + / 84 +.
Obrigado a @Dennis por um belo algoritmo! Pegamos a soma cumulativa da lista depois de converter em porcentagem, depois andar, colocar um 0 na frente e fazer as diferenças.
ᴇ2
é um byte menor que100
.Na mesma contagem de bytes é:
Curiosidade:
%
é um token de dois bytes que multiplica um número por 0,01 - mas não há como digitá-lo na calculadora! Você precisa editar a fonte fora ou usar um programa de montagem.Código antigo:
A primeira linha calcula todas as porcentagens pavimentadas e, em seguida, a segunda linha adiciona 1 aos primeiros
N
elementos, ondeN
é a porcentagem restante.cumSum(
significa "soma acumulada".Exemplo com
{1,1,2,4}
:Não teremos
N>dim([list]
, porque nenhuma porcentagem diminui em mais de 1 no piso.fonte
int(
,sum(
,Ans
, etc.) ocupar somente um byte.%
símbolo? Eu pensei que poderia ser encontrado no catálogo de símbolos ... Além disso, eu deveria pegar minha TI-84 + Silver. Eu não uso há um tempo. Block Dude é incrível.CJam,
252322 bytesObrigado a @ Sp3000 por 25 → 24.
Experimente online.
Como funciona
fonte
Mathematica, 41 bytes
fonte
N
elementos, ondeN
fica a porcentagem restante.J (8,04 beta) , 59 bytes (30 bytes roubados)
Porta J literal de 30 bytes da resposta APL de Dennis :
59 bytes de resposta, o melhor que eu poderia fazer:
(Com base no restante dos valores mais altos, no máximo +1), divida-os em vários valores no caso de um restante> 1 ou um empate para o valor mais alto).
por exemplo
Explicação
f=.3 : 0
- 'f' é uma variável, que é um tipo de verbo (3), definido abaixo (: 0):p=.
variável 'p', criada a partir de:y
é uma lista de números1 0 2
+/y
é '+' colocado entre cada valor '/', a soma da lista3
y % (+/y)
são os valores y originais divididos pela soma:0.333333 0 0.666667
100 * (y%+/y)
é 100x esses valores:33.33.. 0 0.66...
para obter as porcentagens.<. (100*y%+/y)
é o operador de piso aplicado às porcentagens:33 0 66
r=.
variável 'r', criada a partir de:+/p
é a soma das porcentagens com piso:99
100 - (+/p)
é 100 - a soma ou os pontos percentuais restantes necessários para fazer com que as porcentagens totalizem 100.r $ 1
é uma lista de 1s, contanto que o número de itens que precisamos incrementar:1 [1 1 ..]
#p
é o comprimento da lista de porcentagem(#p - r)
é a contagem de itens que não serão incrementados(#p-r) $ 0
é uma lista de 0s, desde que contados:0 0 [0 ..]
((r$1) , (#p-r)$0)
é a lista 1s seguida pela lista 0s:1 0 0
\: p
é uma lista de índices para extrairp
e colocar em ordem decrescente./: (\:p)
é uma lista de índices a serem tirados\:p
para colocar em ordem crescente((r$1),(#p-r)$0)/:\:p
está tomando os elementos do 1 1 .. 0 0 .. lista máscara e classificar de forma que há 1s nas posições dos maiores percentagens, um para cada número precisamos incremento, e 0s para outros números:0 0 1
.p + ((r$1),(#p-r)$0)/:\:p
são as porcentagens + a máscara, para fazer a lista de resultados que totaliza 100%, que é o valor de retorno da função.por exemplo
e
)
fim de definição.Eu não sou muito experiente com J; Eu não ficaria surpreso se houver uma "lista de transformar-se em percentagens do total", operação integrada, e uma maneira mais limpa para "incremento n maiores valores" também. (Isso é 11 bytes a menos que minha primeira tentativa).
fonte
list[0:100-n] + list[:-100-n]
abordagem - e não pensei em outra maneira de abordá-la.JavaScript (ES6), 81 bytes
Essa condição "deve ser igual a 100" (em vez de arredondar e somar) quase dobrou meu código (de 44 para 81). O truque era adicionar um pote para valores decimais que, uma vez atingido 1, retira 1 de si e o adiciona ao número atual. O problema então era pontos flutuantes, o que significa que algo como [1,1,1] deixa um restante de .9999999999999858. Então, mudei o cheque para mais de 0,999 e decidi chamar isso de preciso o suficiente.
fonte
Haskell,
4227 bytesPraticamente o método trivial em Haskell, com alguns espaços removidos para jogar golfe.
Console (colchetes incluídos para serem consistentes com o exemplo):
Edit: praticou minha colocação, fez algumas substituições óbvias.
Original:
fonte
Jelly , 7 bytes
-2 graças a Dennis, lembrando-me de usar outro novo recurso (
Ä
) e usar em:
vez do que eu tinha inicialmente.Experimente online!
Gelatina , 11 bytes
Experimente online!
Feito ao lado de caird coinheringaahing e user202729 no chat .
Como funciona
fonte
Haskell,
635655 bytesfonte
Perl, 42 bytes
Baseado no algoritmo de Dennis
Inclui +1 para
-p
Corra com a lista de números no STDIN, por exemplo
percent.pl
:fonte
Oitava, 40 bytes
fonte
Python 2, 89 bytes
fonte
Flacidez cerebral , 150 bytes
Experimente online!
Começando pelo final e trabalhando para trás, esse código garante a cada etapa que a soma dos números de saída até agora é igual à porcentagem total encontrada, arredondada para baixo.
fonte
JavaScript (ES6) 60
63 95Adaptado e simplificado da minha resposta (errada) para outro desafio
Thk para @ l4m2 por descobrir que isso também estava errado
Corrigido o salvamento de 1 byte (e 2 bytes a menos, sem contar o nome
F=
)Teste a execução do snippet abaixo em qualquer navegador compatível com EcmaScript 6
fonte
[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,980]
any single resulting integer returned as a percentage is off by no more than 1 in either direction.
Ferrugem, 85 bytes
Isso usa vetores em vez de matrizes porque, até onde sei, não há como aceitar matrizes de vários comprimentos diferentes.
fonte
JavaScript, 48 bytes
fonte
Jq 1.5 , 46 bytes
Expandido
Experimente online!
fonte
PHP, 82 bytes
recebe entrada dos argumentos da linha de comando, imprime porcentagens delimitadas por sublinhado.
Corra com
-nr
ou experimente online .fonte
15_15_15_15_15_25
quando dada a entrada[2,2,2,2,3]
, o que não é certo, porque3/13 ~= 23.1%