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]


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




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

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

4

R 28 octets

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

Essayez-le en ligne!


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

Java (JDK) , 47 octets

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

Essayez-le en ligne!


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

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!






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!


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


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.



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

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.



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



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)

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.



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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.