Encuentra el porcentaje

15

No hemos tenido desafíos agradables y fáciles en mucho tiempo, así que aquí vamos.

Dada una lista de enteros cada uno mayor que y un índice como entrada, genera el porcentaje del elemento en el índice dado de la suma total de la lista.0 0

La salida debe ser la representación natural para flotantes / enteros en su idioma (unario, decimal, números de iglesia, etc.). Si elige redondear la salida de alguna manera, debe tener un mínimo de 2 decimales (cuando sea razonable. no necesita redondearse, pero también es perfectamente aceptable).1,21.201.20

Los índices pueden estar indexados en 1 o indexados en 0, y siempre estarán dentro de los límites de la matriz.

Este es el , por lo que gana el código más corto en bytes.

Ejemplos

Usando 1 indexado y redondeado a 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

O, como tres 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]
caird coinheringaahing
fuente
Publicación de
3
¿Cómo exactamente pueden salir los no enteros como números unarios / eclesiásticos?
Pomo de la puerta
1
@ Pomo de la puerta ¿Quizás un número unario, el punto y otro número unario?
HighRadioactive
Dado que la salida se puede redondear a dos decimales, también podría estar permitido la salida redondeada por 100?
Cadena no relacionada
1
el caso de prueba 4 debería ser 20/2410
attinat

Respuestas:

6

APL (Dyalog Unicode) , SBCS de 9 bytes

Función de infijo tácito anónimo. Toma el índice como argumento izquierdo y la lista como argumento derecho.

100×⌷÷1⊥⊢

Pruébalo en línea!

100 cien

× veces

 el elemento indexado

÷ dividido por

1⊥ la suma (lit. la evaluación de base 1) de

 el argumento correcto

Adán
fuente
6

Python 3 , 26 bytes

lambda i,a:a[i]/sum(a)*100

Una función sin nombre que acepta un número entero (índice indexado 0) y una lista que devuelve el porcentaje.

Pruébalo en línea!

Jonathan Allan
fuente
5

Jalea , 7 bytes

ị÷S}ȷ2×

Un enlace diádico que acepta un índice entero basado en uno a la izquierda y una lista de números a la derecha que produce el porcentaje.

Pruébalo en línea!

¿Cómo?

ị÷S}ȷ2× - Link: integer, i; list, L
ị       - (i) index into (L)
   }    - use right argument:
  S     -   sum (L)
 ÷      - divide
    ȷ2  - literal 10^2 = 100
      × - multiply
Jonathan Allan
fuente
1
¡Agradable! Eso es byte por byte lo que tenía: P
caird coinheringaahing
5

05AB1E , 6 bytes

è²O/т*

Un programa completo que toma el índice y luego la lista. Utiliza indexación 0.

Pruébalo en línea!

¿Cómo?

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

R 28 bytes

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

Pruébalo en línea!

niko
fuente
No sé R, pero no parece que funcione (no estoy seguro de cómo probarlo en TIO con matrices arbitrarias), ya que se supone que debes recuperar el elemento de líndice n, no solo dividir por n(ver el caso de [7, 3, 19], 1prueba )
caird coinheringaahing
@cairdcoinheringaahing Mi error, tenía un error tipográfico (olvidé el l[]alrededor n)
niko
Hay algo en la página de enlaces de TIO que puede formatear esto para usted.
SS Anne
4

Java (JDK) , 47 bytes

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

Pruébalo en línea!

Olivier Grégoire
fuente
¿Por qué escribiste en 1e2lugar de 100? ¿Es porque 100es entero y 1e2se considera como un número de coma flotante?
Ismael Miguel el
1
@IsmaelMiguel Sí: 1e2lleva el tipo doble, que a[i]y la suma no. Como el desafío requiere devolver números de coma flotante, ahí es donde puedo usarlo.
Olivier Grégoire
Cambiarlo a un BiFunction <int [], Integer, Double> y se puede guardar 10 bytes con esto: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Editar:> :( mi pobre flecha lambda
Avi
@Avi Todavía se requiere la importación, por lo que tendría que escribir:, (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()que tiene 54 bytes de longitud. Mi respuesta actual tiene solo 47 bytes de longitud. Además, a->i->es un byte más corto que (a,i)->.
Olivier Grégoire
1
@Avi Sí, son obligatorios , y generalmente es más corto escribir el nombre completo de la clase en lugar de la importación, así que eso es lo que hago aquí
Olivier Grégoire
3

Haskell ,  20  18 bytes

i?a=a!!i/sum a*100

Un operador diádico ( ?) que toma el índice (indexado a 0) a la izquierda y una lista a la derecha que produce el porcentaje.

Pruébalo en línea!

Jonathan Allan
fuente
3

JavaScript (ES6), 30 bytes

Toma la entrada como (array)(index), donde el índice está basado en 0.

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

Pruébalo en línea!

Arnauld
fuente
3

MATL , 9 bytes

)1Gs/100*

Pruébalo en línea!

Explicación

          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

Pruébalo en línea!

falla
fuente
2

Rojo , 31 29 bytes

-2 bytes gracias a ErikF

func[b i][1e2 * b/:i / sum b]

Pruébalo en línea!

Galen Ivanov
fuente
1
(-2 bytes) sugiere usar en 1e2lugar de 100.0: ¡ Pruébelo en línea! . ¡Es bastante bueno cuántos idiomas pueden usar este truco!
ErikF
@ ErikF ¡Gracias! Sé esto en teoría, pero como parece, olvidé usarlo :)
Galen Ivanov
2

Scratch 3.0 24 23 bloques / 239 228 bytes

-11 bytes gracias a @JoKing

Alternativamente en sintaxis 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 gracias a @JoKing

Pruébalo desde cero

Historial de respuestas

Oh Scratchblocks, ¿por qué tanto tiempo?

Alternativamente en sintaxis 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

Pruébalo desde cero

La entrada tiene la forma de:

item1
item2
...
itemN
index

Realmente debería dejar de hacerme esto a mí mismo. ¡Pero es muy divertido!

Lyxal
fuente
Se puede cambiar repeat length of ma length of m-1y se ahorrará el delete n?
Jo King el
No, porque si lo hiciera, no contaría el último elemento.
Lyxal
Bueno, si eliminas lo delete n of mque sugerí, sería
Jo King el
2

Pyth , 13 bytes

c*100@hQeQshQ

Pruébalo en línea!

La primera vez que uso Pyth, probablemente hay algunas optimizaciones bastante grandes aquí, pero no sé dónde están ...

0-index, toma la entrada como list, index

franco
fuente
1

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

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

Pruébalo en línea!

Tome la lista, el espacio separado en la primera línea, el índice (basado en 0) en la segunda.

Xcali
fuente
1

TI-Basic , 12 bytes (12 tokens)

Prompt X
Ans(X)E2/sum(Ans

1 indexado

Toma la lista Ansy solicita al usuario el índice

Ejecución de ejemplo

Explicación:

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
pizzapants184
fuente
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$&
..$
.$&

Pruébalo en línea! El enlace incluye casos de prueba. Toma entrada como index;list,.... Explicación:

\d+
$*

Convierte a unario.

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

Indice en la lista.

,

Suma la lista.

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

Multiplique el valor deseado por 10000 y divida por la suma con redondeo agregando primero la mitad de la suma.

+`^..?$
0$&

Asegúrese de que el resultado tenga al menos tres dígitos.

..$
.$&

Inserte un punto decimal en la segunda última posición.

Neil
fuente
1

Perl 6 , 21 bytes

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

Pruébalo en línea!

La solución simple, ya que no puedo usar parámetros curry con el $bparámetro que se indexa. Una solución más divertida que no tiene que manejar dos parámetros usando la rotatefunción en su lugar:

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

Pruébalo en línea!

Pero lamentablemente es dos bytes más largo

Jo King
fuente
1

MathGolf , 7 6 bytes

§\Σ/♀*

Indexación basada en 0.

Pruébalo en línea.

Explicación:

§       # 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)
Kevin Cruijssen
fuente
1

Icono , 53 bytes

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

Pruébalo en línea!

Lo único interesante aquí es encontrar la suma. Icon fue uno de los primeros idiomas en tener generadores. !genera todos los valores de la lista Lque se acumulan en s. Normalmente necesitamos escribir every s+:=!L, pero utilicé el rastreo hacia atrás &\z, que comprueba si la zvariable no existe es non-null, que no lo es, y extrae el siguiente valor de la lista hasta el agotamiento.

Galen Ivanov
fuente
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%

Toma la entrada como índice y la lista como argumentos de línea de comandos. Nota: Solo funciona para valores de índice de 1a 9debido a limitaciones de Batch; se podría escribir una versión indexada en 0 que pudiera indexar los primeros 10 elementos. Explicación:

@shift

Cambie el índice %0y la lista a %1... %9(o menos). Sin embargo, tenga en cuenta que Batch's shiftno afecta %*.

@set s=%*

Obtenga todos los parámetros, separados por espacios.

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

Cambie los espacios a +sy evalúe aritméticamente, tomando la suma, pero reste el índice. Luego indexe en la lista, multiplique por 10000, agregue la mitad de la suma y divida por la suma. Finalmente realice divmod por 10 dos veces para generar los lugares decimales. (El %operador aritmético tiene un significado especial en Batch y normalmente debe duplicarse, pero callluego requiere una duplicación adicional).

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

Salida del resultado y los lugares decimales.

Neil
fuente