Encontre a porcentagem


15

Não enfrentamos nenhum desafio fácil e agradável há algum tempo, então aqui vamos nós.

Dada uma lista de números inteiros maiores que 0 e um índice como entrada, imprima a porcentagem do item no índice fornecido da soma total da lista.

A saída deve ser qualquer que seja a representação natural de números flutuantes / números inteiros no seu idioma (unário, decimal, numerais da igreja etc.). Se você optar por arredondar a saída de qualquer forma, ela deve ter no mínimo 2 casas decimais (quando razoável. 1.2 não precisa ser arredondado, mas 1.20 também é perfeitamente aceitável).

Os índices podem ser indexados 1 ou 0 e sempre estarão dentro dos limites da matriz.

Isso é , então o código mais curto em bytes vence!

Exemplos

Usando 1 indexado e arredondado para 2 dp

list, index                    =>         output
[1, 2, 3, 4, 5], 5             => 5 / 15    => 33.33
[7, 3, 19], 1                  => 7 / 29    => 24.14
[1, 1, 1, 1, 1, 1, 1, 1, 1], 6 => 1 / 9     => 11.11
[20, 176, 194, 2017, 3], 1     => 20 / 2410 => 0.83
[712], 1                       => 712 / 712 => 100

Ou, como três listas:

[[1, 2, 3, 4, 5], [7, 3, 19], [1, 1, 1, 1, 1, 1, 1, 1, 1], [20, 176, 194, 2017, 3], [712]]
[5, 1, 6, 1, 1]
[33.33, 24.14, 11.11, 0.83, 100]


3
como exatamente os não-inteiros podem ser produzidos como números unários / de igreja?
Maçaneta

1
@ Doorknob Talvez um número unário, o ponto e outro número unário?
HighlyRadioactive

Como a saída pode ser arredondada para duas casas decimais, também pode ser permitido gerar vezes arredondadas 100?
String não relacionada

1
caso de teste 4 deve ser 20/2410
attinat 29/09/19

Respostas:


6

APL (Dyalog Unicode) , SBCS de 9 bytes

Função de infixo tácito anônimo. Leva o índice como argumento à esquerda e lista como argumento à direita.

100×⌷÷1⊥⊢

Experimente online!

100 cem

× vezes

 o elemento indexado

÷ dividido por

1⊥ a soma (lit. a avaliação de base 1) de

 o argumento certo




5

Geléia , 7 bytes

ị÷S}ȷ2×

Um link diádico que aceita um índice inteiro com base à esquerda e uma lista de números à direita que produz a porcentagem.

Experimente online!

Quão?

ị÷S}ȷ2× - Link: integer, i; list, L
ị       - (i) index into (L)
   }    - use right argument:
  S     -   sum (L)
 ÷      - divide
    ȷ2  - literal 10^2 = 100
      × - multiply

1
Agradável! Isso é byte por byte que eu tinha: P
caird coinheringaahing

5

05AB1E , 6 bytes

è²O/т*

Um programa completo tendo o índice e depois a lista. Usa indexação 0.

Experimente online!

Quão?

è²O/т*
è      - index (input 1) into (input 2)
 ²     - push 2nd input
  O    - sum
   /   - divide
    т  - push 100
     * - multiply
       - print top of stack

4

R 28 bytes

function(n,l)100*l[n]/sum(l)

Experimente online!


Eu não conheço R, mas isso não parece funcionar (não sei como testá-lo no TIO com matrizes arbitrárias), pois você deve recuperar o elemento lat no index n, não apenas dividir por n(veja a caixa de [7, 3, 19], 1teste )
caird coinheringaahing

@cairdcoinheringaahing Meu mal, teve um erro de digitação (esqueci l[]on )
niko #

Há uma coisa na página de link do TIO que pode formatar isso para você.
SS Anne


4

Java (JDK) , 47 bytes

a->i->1e2*a[i]/java.util.Arrays.stream(a).sum()

Experimente online!


Por que você escreveu em 1e2vez de 100? É porque 100é inteiro e 1e2é considerado como um número de ponto flutuante?
Ismael Miguel

1
@IsmaelMiguel Sim: 1e2carrega o tipo double, que a[i]e a soma não. Como o desafio exige retornar números de ponto flutuante, é onde eu posso usá-lo.
Olivier Grégoire

Alterá-lo para um BiFunction <int [], Integer, Double> e você pode salvar 10 bytes com este: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Edit:> :( minha pobre flecha lambda
Avi

@ Avi A importação ainda é necessária, então eu teria que escrever:, (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()que tem 54 bytes de comprimento. Minha resposta atual tem apenas 47 bytes. Além disso, a->i->é um byte menor que (a,i)->.
Olivier Grégoire

1
@Avi Sim, eles são necessários , e é geralmente mais curto para escrever o nome completo da classe em vez da importação, de modo que o que eu faço aqui
Olivier Grégoire




3

JavaScript (ES6), 30 bytes

Aceita entrada como (array)(index), onde o índice é baseado em 0.

a=>n=>a[n]*100/eval(a.join`+`)

Experimente online!


3

MATL , 9 bytes

)1Gs/100*

Experimente online!

Explicação

          implicitly take two inputs
)         get the entry within the first input at the index specified by the second
 1G       push the first input onto the stack again
   s      compute the sum 
    /     divide first entry of the stack by this number (the sum) 
     100* multiply by 100

Experimente online!






2

Scratch 3.0 24 23 blocos / 239 228 bytes

-11 bytes graças a @JoKing

Como alternativa na sintaxe SB

when gf clicked
set[s v]to(0
ask()and wait
repeat until<(answer)=(
add(answer)to[m v
ask()and wait
end
set[n v]to(item(length of(n))of(m
repeat(length of((m)-(1
change[s v]by(item(1)of[m v
delete (1)of[m v
end
say(((n)/(s))*(100

Guardado 11 bytes graças a @JoKing

Experimente no zero

Histórico de respostas

Oh Scratchblocks, por que tanto tempo?

Como alternativa na sintaxe SB

when gf clicked
set[s v]to(0
ask()and wait
repeat until<(answer)=(
add(answer)to[m v
ask()and wait
end
set[n v]to(item(length of(n))of(m
delete(n)of[m v
repeat(length of(m
change[s v]by(item(1)of[m v
delete (1)of[m v
end
say(((n)/(s))*(100

Experimente no zero

A entrada está na forma de:

item1
item2
...
itemN
index

Eu realmente deveria parar de fazer isso comigo mesma. Mas é muito divertido!


Você pode mudar repeat length of ma length of m-1e salve-se o delete n?
Jo rei

Não, porque se eu fizesse, não contabilizaria o último item.
Jó 2906

Bem, se você remover o delete n of mque eu sugeri, então o faria
Jo King

2

Pitão , 13 bytes

c*100@hQeQshQ

Experimente online!

Primeira vez usando Pyth, provavelmente há algumas otimizações bastante grandes aqui, mas não sei onde elas estão ...

Índice 0, recebe a entrada como list, index


1

Perl 5 -ap -MList::Util=Sum , 19 bytes

$_=100*$F[<>]/sum@F

Experimente online!

Pegue a lista, o espaço separado na primeira linha e o índice (com base em 0) na segunda.



1

TI-Basic , 12 bytes (12 tokens)

Prompt X
Ans(X)E2/sum(Ans

Indexado 1

Leva a lista Anse solicita ao usuário o índice

Exemplo de execução

Explicação:

Prompt X         # Prompt the user for the index
Ans(X)E2/sum(Ans
Ans(X)           # The value at the Xth index in the list
      E2         # times 100
        /sum(Ans # Divided by the sum of the list
                 # The result of the last expression in a program is implicitly returned

1

Retina 0.8.2 , 102 bytes

\d+
$*
^(1)+((?<-1>.(1+))+)
$3$2
,

\G1
10000$*
;(1+)\1
$1;$1$1
r`.*(\2)*;(1+)
$#1
+`^..?$
0$&
..$
.$&

Experimente online! O link inclui casos de teste. Toma entrada como index;list,.... Explicação:

\d+
$*

Converta para unário.

^(1)+((?<-1>.(1+))+)
$3$2

Índice na lista.

,

Soma a lista.

\G1
10000$*
;(1+)\1
$1;$1$1
r`.*(\2)*;(1+)
$#1

Multiplique o valor desejado por 10000 e divida pela soma com arredondamento adicionando primeiro metade da soma.

+`^..?$
0$&

Verifique se o resultado possui pelo menos três dígitos.

..$
.$&

Insira um ponto decimal na segunda última posição.



1

Perl 6 , 21 bytes

{100*@^a[$^b]/@a.sum}

Experimente online!

A solução simples, pois não posso usar parâmetros ao curry com o $bparâmetro sendo indexado. Uma solução mais divertida que não precisa manipular dois parâmetros usando a rotatefunção:

{100*.[0]/.sum}o&rotate

Experimente online!

Mas infelizmente é mais dois bytes



1

MathGolf , 7 6 bytes

§\Σ/♀*

Indexação baseada em 0.

Experimente online.

Explicação:

§       # Index the (implicit) second input-integer into the first (implicit) input-list,
        # which apparently doesn't pop the list
 \      # Swap so this list is at the top of the stack now
  Σ     # Take the sum of that list
   /    # Divide the earlier number we indexed by this sum
    ♀*  # Multiply it by 100
        # (after which the entire stack joined together is output implicitly as result)

1

Ícone , 53 bytes

procedure f(L,i)
s:=0;s+:=!L&\z
return 1e2*L[i]/s
end

Experimente online!

A única coisa interessante aqui é encontrar a soma. Icon foi um dos primeiros idiomas a ter geradores. !gera todos os valores da lista Lque são acumulados s. Normalmente precisamos escrever every s+:=!L, mas usei o retorno com &\z, que verifica se a zvariável inexistente é non-null, o que não é, e extrai o próximo valor da lista até a exaustão.



1

Lote, 111 bytes

@shift
@set s=%*
@call set/as=%s: =+%-%0,s=(%%%0*10000+s/2)/s,h=s%%%%10,t=s/10%%%%10,s/=100
@echo %s%.%t%%h%

Recebe entrada como índice e lista como argumentos da linha de comando. Nota: Funciona apenas para valores de índice de 1a 9devido a limitações do lote; poderia ser escrita uma versão indexada em 0, capaz de indexar os 10 primeiros elementos. Explicação:

@shift

Mude o índice para %0e a lista para %1... %9(ou menos). Observe, porém, que os lotes shiftnão afetam %*.

@set s=%*

Obtenha todos os parâmetros, com espaço separado.

@call set/as=%s: =+%-%0,s=(%%%0*10000+s/2)/s,h=s%%%%10,t=s/10%%%%10,s/=100

Altere os espaços para se +avalie aritmeticamente, obtendo a soma, mas subtraindo o índice. Em seguida, indexe na lista, multiplique por 10000, adicione metade da soma e divida pela soma. Por fim, execute divmod por 10 duas vezes para gerar as casas decimais. (O %operador aritmético tem um significado especial no Lote e normalmente precisa ser duplicado, mas, em callseguida, requer uma duplicação adicional.)

@echo %s%.%t%%h%

Produza o resultado e as casas decimais.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.