Trouver le pourcentage

15

Nous n'avons pas eu de défis faciles et faciles depuis un certain temps, alors c'est parti.

Étant donné une liste d'entiers supérieurs chacun à et un indice en entrée, affichez le pourcentage de l'élément à l'indice donné de la somme totale de la liste.0

La sortie doit être quelle que soit la représentation naturelle des flottants / entiers dans votre langue (unaire, décimal, chiffres d'église, etc.). Si vous choisissez d'arrondir la sortie de quelque façon que ce soit, elle doit avoir au moins 2 décimales (lorsque cela est raisonnable. n'a pas besoin d'être arrondi, mais est également parfaitement acceptable).1.21,20

Les index peuvent être indexés 1 ou 0 et seront toujours dans les limites du tableau.

C'est le , donc le code le plus court en octets gagne!

Exemples

Utilisation de 1 indexé et arrondi à 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, comme trois listes:

[[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
la source
Publication Sandbox (maintenant supprimée)
Cairn Coinheringaahing
3
comment exactement les non-entiers peuvent-ils être sortis sous forme de nombres unaires / d'église?
Poignée de porte
1
@ Doorknob Peut-être un nombre unaire, le point et un autre nombre unaire?
HighlyRadioactive
Étant donné que la sortie peut être arrondie à deux décimales, il peut également être autorisé de produire des arrondis multipliés par 100?
Unrelated String
1
le cas de test 4 devrait être 20/2410
attinat

Réponses:

6

APL (Dyalog Unicode) , 9 octets SBCS

Fonction infixe tacite anonyme. Prend l'index comme argument de gauche et la liste comme argument de droite.

100×⌷÷1⊥⊢

Essayez-le en ligne!

100 cent

× fois

 l'élément indexé

÷ divisé par

1⊥ la somme (lit. l'évaluation de base 1) de

 le bon argument

Adam
la source
6

Python 3 , 26 octets

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

Une fonction sans nom acceptant un entier (index indexé 0) et une liste qui renvoie le pourcentage.

Essayez-le en ligne!

Jonathan Allan
la source
5

Gelée , 7 octets

ị÷S}ȷ2×

Un lien dyadique acceptant un entier, un index basé sur une à gauche et une liste de nombres à droite qui donne le pourcentage.

Essayez-le en ligne!

Comment?

ị÷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
la source
1
Agréable! C'est octet par octet ce que j'avais: P
caird coinheringaahing
5

05AB1E , 6 octets

è²O/т*

Un programme complet reprenant l'index puis la liste. Utilise l'indexation 0.

Essayez-le en ligne!

Comment?

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

R 28 octets

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

Essayez-le en ligne!

niko
la source
Je ne connais pas R, mais cela ne semble pas fonctionner (je ne sais pas comment le tester sur TIO avec des tableaux arbitraires), car vous êtes censé récupérer l'élément de lat index n, pas seulement le diviser par n(voir le [7, 3, 19], 1testcase )
caird coinheringaahing
@cairdcoinheringaahing Mon mauvais, a eu une faute de frappe (j'ai oublié le l[]autour du n)
niko
Il y a quelque chose sur la page de liens TIO qui peut le formater pour vous.
SS Anne
4

C (gcc) , 64 octets

0 indexé. Le seul morceau amusant était la réalisation qui 1e2est double, en économisant un octet 100.!

float f(v,n,t)int*v;{n=v[n];for(t=0;*v;t+=*v++);return n*1e2/t;}

Essayez-le en ligne!

ErikF
la source
Essayez-le en ligne! 59 utilisant C (clang)
AZTECCO
4

Java (JDK) , 47 octets

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

Essayez-le en ligne!

Olivier Grégoire
la source
Pourquoi avez-vous écrit 1e2au lieu de 100? Est-ce parce que100 est entier et 1e2est considéré comme un nombre à virgule flottante?
Ismael Miguel
1
@IsmaelMiguel Oui: 1e2porte le double type, ce qui a[i]et la somme ne le font pas. Étant donné que le défi nécessite de renvoyer des nombres à virgule flottante, c'est là que je peux l'utiliser.
Olivier Grégoire
Changez - le à un BiFunction <int [], Entier, Double> et vous pouvez enregistrer 10 octets avec ceci: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Edit:> :( ma pauvre flèche lambda
Avi
@Avi L'importation est toujours requise, donc je devrais écrire:, (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()qui fait 54 octets de long. Ma réponse actuelle ne fait que 47 octets. En outre, a->i->est un octet plus court que (a,i)->.
Olivier Grégoire
1
@Avi Oui, ils sont obligatoires , et il est généralement plus court d'écrire le nom complet de la classe au lieu de l'importer, c'est donc ce que je fais ici
Olivier Grégoire
3

Haskell ,  20  18 octets

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

Un opérateur dyadique ( ?) prenant l'index (0 indexé) à gauche et une liste à droite qui donne le pourcentage.

Essayez-le en ligne!

Jonathan Allan
la source
3

JavaScript (ES6), 30 octets

Prend l'entrée comme (array)(index), où l' index est basé sur 0.

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

Essayez-le en ligne!

Arnauld
la source
3

MATL , 9 octets

)1Gs/100*

Essayez-le en ligne!

Explication

          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

Essayez-le en ligne!

flawr
la source
3

PHP (7.4), 35 octets

fn($l,$i)=>100/array_sum($l)*$l[$i]

Essayez-le en ligne!

L'index d'entrée est basé sur 0.

Nuit2
la source
2

Rouge , 31 29 octets

-2 octets grâce à ErikF

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

Essayez-le en ligne!

Galen Ivanov
la source
1
(-2 octets) suggère d'utiliser 1e2au lieu de 100.0: Essayez-le en ligne! . C'est assez net combien de langues peuvent utiliser cette astuce!
ErikF
@ErikF Merci! Je sais cela en théorie, mais comme il semble, j'ai oublié de l'utiliser :)
Galen Ivanov
2

Scratch 3.0 24 23 blocs / 239 228 octets

-11 octets grâce à @JoKing

Alternativement dans la syntaxe 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

11 octets enregistrés grâce à @JoKing

Essayez-le à zéro

Historique des réponses

Oh Scratchblocks, pourquoi si longtemps?

Alternativement dans la syntaxe 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

Essayez-le à zéro

L'entrée se présente sous la forme de:

item1
item2
...
itemN
index

Je devrais vraiment arrêter de me faire ça. Mais il est très amusant!

Lyxal
la source
Pouvez - vous changer repeat length of mpour length of m-1et Epargnez - vous delete n?
Jo King
Non, car si je le faisais, cela ne correspondrait pas au dernier élément.
Lyxal
Eh bien, si vous supprimez ce delete n of mque j'ai suggéré, ce serait
Jo King
2

Pyth , 13 octets

c*100@hQeQshQ

Essayez-le en ligne!

La première fois que vous utilisez Pyth, il y a probablement quelques optimisations assez importantes ici, mais je ne sais pas où elles sont ...

0-index, prend l'entrée comme list, index

franc
la source
1

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

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

Essayez-le en ligne!

Prenez la liste, espace séparé sur la première ligne, l'index (basé sur 0) sur la seconde.

Xcali
la source
1

TI-Basic , 12 octets (12 jetons)

Prompt X
Ans(X)E2/sum(Ans

1 indexé

Prend la liste Anset invite l'utilisateur à indexer

Exemple d'exécution

Explication:

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
la source
1

Retina 0.8.2 , 102 octets

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

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

Essayez-le en ligne! Le lien inclut des cas de test. Prend l'entrée comme index;list,.... Explication:

\d+
$*

Convertissez en unaire.

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

Index dans la liste.

,

Additionnez la liste.

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

Multipliez la valeur souhaitée par 10000 et divisez par la somme avec l'arrondi en ajoutant d'abord la moitié de la somme.

+`^..?$
0$&

Assurez-vous que le résultat comporte au moins trois chiffres.

..$
.$&

Insérez un point décimal à l'avant-dernière position.

Neil
la source
1

Perl 6 , 21 octets

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

Essayez-le en ligne!

La solution simple, car je ne peux pas utiliser de paramètres au curry avec le $bparamètre indexé. Une solution plus amusante qui n'a pas à gérer deux paramètres en utilisant la rotatefonction à la place:

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

Essayez-le en ligne!

Mais c'est malheureusement deux octets de plus

Jo King
la source
1

MathGolf , 7 6 octets

§\Σ/♀*

Indexation basée sur 0.

Essayez-le en ligne.

Explication:

§       # 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
la source
1

Icône , 53 octets

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

Essayez-le en ligne!

La seule chose intéressante ici est de trouver la somme. L'icône a été l'une des premières langues à disposer de générateurs. !génère toutes les valeurs de la liste Lqui sont cumulées s. Normalement, nous devons écrire every s+:=!L, mais j'ai utilisé le retour arrière avec &\z, qui vérifie si la zvariable inexistante estnon-null , qui ne l'est pas, et extrait la valeur suivante de la liste jusqu'à épuisement.

Galen Ivanov
la source
1

Lot, 111 octets

@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%

Prend l'entrée comme index et la liste comme arguments de ligne de commande. Remarque: ne fonctionne que pour les valeurs d'index de 1à en 9raison des limitations de Batch; une version indexée 0 pourrait être écrite qui serait capable d'indexer les 10 premiers éléments. Explication:

@shift

Déplacez l'index vers %0et la liste vers %1... %9(ou moins). Notez cependant que Batch shiftn'affecte pas %*.

@set s=%*

Obtenez tous les paramètres, séparés par des espaces.

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

Remplacez les espaces par +s et évaluez arithmétiquement, prenant ainsi la somme, mais soustrayez l'indice. Indexez ensuite dans la liste, multipliez par 10000, ajoutez la moitié de la somme et divisez par la somme. Enfin, effectuez divmod par 10 deux fois pour générer les décimales. (L' %opérateur arithmétique a une signification particulière dans Batch et doit normalement être doublé, mais cela callnécessite alors un doublement supplémentaire.)

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

Sortez le résultat et les décimales.

Neil
la source