Finden Sie den Prozentsatz

15

Wir hatten seit einiger Zeit keine schönen, einfachen Herausforderungen mehr, also können wir loslegen.

Geben Sie bei einer Liste von ganzen Zahlen größer als 0 und einem Index als Eingabe den Prozentsatz des Elements am angegebenen Index der Gesamtsumme der Liste aus.

Die Ausgabe sollte unabhängig von der natürlichen Darstellung für Gleitkommazahlen / Ganzzahlen in Ihrer Sprache erfolgen (unäre, dezimale, kirchliche Ziffern usw.). Wenn Sie die Ausgabe in irgendeiner Weise abzurunden, muss es mindestens zwei Dezimalstellen haben (wenn sinnvoll . 1.2 nicht funktioniert müssen abgerundet sein, aber 1.20 ist auch durchaus akzeptabel).

Indizes können entweder 1-indiziert oder 0-indiziert sein und befinden sich immer innerhalb der Grenzen des Arrays.

Das ist , also gewinnt der kürzeste Code in Bytes!

Beispiele

Mit 1-indexiert und auf 2 dp gerundet

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

Oder als drei Listen:

[[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
quelle
Sandbox Post (jetzt gelöscht)
Caird Coinheringaahing
3
Wie genau können Nicht-Ganzzahlen als unäre / kirchliche Zahlen ausgegeben werden?
Türknauf
1
@Doorknob Vielleicht eine unäre Zahl, der Punkt und eine andere unäre Zahl?
Hochradioaktiv
Da die Ausgabe auf zwei Dezimalstellen gerundet werden kann, ist es möglicherweise auch zulässig, gerundete Zeiten 100 auszugeben.
Nicht verwandte String
1
Testfall 4 sollte 20/2410 sein
attinat

Antworten:

6

APL (Dyalog Unicode) , 9 Byte SBCS

Anonyme stillschweigende Infix-Funktion. Nimmt Index als linkes Argument und Liste als rechtes Argument.

100×⌷÷1⊥⊢

Probieren Sie es online!

100 einhundert

× mal

 das indizierte Element

÷ geteilt durch

1⊥ die Summe (lit. die Basis-1-Bewertung) von

 das richtige argument

Adam
quelle
6

Python 3 , 26 Bytes

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

Eine unbenannte Funktion, die eine Ganzzahl (Index mit 0 Indizes) und eine Liste akzeptiert, die den Prozentsatz zurückgibt.

Probieren Sie es online!

Jonathan Allan
quelle
5

Gelee , 7 Bytes

ị÷S}ȷ2×

Ein dyadischer Link, der einen ganzzahligen Index auf der linken Seite und eine Liste von Zahlen auf der rechten Seite akzeptiert, die den Prozentsatz ergibt.

Probieren Sie es online!

Wie?

ị÷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
quelle
1
Nett! Das ist Byte für Byte, was ich hatte: P
Caird Coinheringaahing
5

05AB1E , 6 Bytes

è²O/т*

Ein volles Programm nimmt den Index dann in die Liste auf. Verwendet die 0-Indizierung.

Probieren Sie es online!

Wie?

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

R 28 Bytes

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

Probieren Sie es online!

niko
quelle
Ich kenne R nicht, aber es sieht nicht so aus, als ob es funktioniert (ich weiß nicht, wie ich es auf TIO mit beliebigen Arrays testen soll), da Sie das Element von lat index abrufen nund nicht nur durch dividieren sollen n(siehe [7, 3, 19], 1Testfall) )
Caird Coinheringaahing
@cairdcoinheringaahing Mein schlechtes, hatte einen Tippfehler (vergessen die l[]um die n)
niko
Auf der TIO-Link-Seite gibt es eine Funktion, die dies für Sie formatieren kann.
JL2210
4

Java (JDK) , 47 Byte

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

Probieren Sie es online!

Olivier Grégoire
quelle
Warum hast du geschrieben 1e2anstatt 100? Liegt es daran, dass 100es eine Ganzzahl ist und 1e2als Gleitkommazahl betrachtet wird?
Ismael Miguel
1
@IsmaelMiguel Ja: 1e2trägt den doppelten Typ, der a[i]und die Summe nicht. Da die Abfrage die Rückgabe von Gleitkommazahlen erfordert, kann ich sie dort verwenden.
Olivier Grégoire
Ändern Sie es zu einem bifunktionellen <int [], Integer, Double> und Sie können 10 Bytes mit diesem speichern: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Bearbeiten:> :( mein armes Lambda Pfeil
Avi
@Avi Der Import ist noch erforderlich, also müsste ich schreiben:, (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()was 54 Bytes lang ist. Meine aktuelle Antwort ist nur 47 Bytes lang. Ist auch a->i->ein Byte kürzer als (a,i)->.
Olivier Grégoire
1
@Avi Ja, sie werden benötigt und es ist normalerweise kürzer, den vollständigen Klassennamen anstelle des Imports zu schreiben. Deshalb mache ich das hier
Olivier Grégoire,
3

Haskell ,  20 bis  18 Bytes

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

Ein dyadischer Operator ( ?), der links den Index (mit dem Index 0) und rechts eine Liste mit dem Prozentsatz verwendet.

Probieren Sie es online!

Jonathan Allan
quelle
3

JavaScript (ES6), 30 Byte

Nimmt die Eingabe als an (array)(index), wobei der Index auf 0 basiert.

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

Probieren Sie es online!

Arnauld
quelle
3

MATL , 9 Bytes

)1Gs/100*

Probieren Sie es online!

Erläuterung

          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

Probieren Sie es online!

fehlerhaft
quelle
3

PHP (7.4), 35 Bytes

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

Probieren Sie es online!

Eingabeindex ist 0-basiert.

Night2
quelle
2

Rot , 31 29 Bytes

-2 Bytes dank ErikF

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

Probieren Sie es online!

Galen Ivanov
quelle
1
(-2 Bytes) empfehlen 1e2statt 100.0: Online ausprobieren! . Es ist ziemlich ordentlich, wie viele Sprachen diesen Trick anwenden können!
ErikF
@ErikF Danke! Ich weiß das theoretisch, aber wie es scheint, habe ich vergessen, es zu benutzen :)
Galen Ivanov
2

Scratch 3.0 24 23 Blöcke / 239 228 Bytes

-11 Bytes dank @JoKing

Alternativ in SB-Syntax

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 Bytes dank @JoKing gespeichert

Probieren Sie es einfach aus

Antwortverlauf

Oh Scratchblocks, warum so lange?

Alternativ in SB-Syntax

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

Probieren Sie es einfach aus

Die Eingabe erfolgt in Form von:

item1
item2
...
itemN
index

Ich sollte wirklich aufhören, mir das anzutun. Aber es macht sehr viel Spaß!

Jono 2906
quelle
Können Sie ändern , repeat length of mum length of m-1die und sparen Sie sich delete n?
Jo King
Nein, denn wenn ich das täte, würde es nicht den letzten Punkt zählen.
Jono 2906
Nun, wenn Sie das entfernen, was delete n of mich vorgeschlagen habe, dann würde es
Jo King
2

Pyth , 13 Bytes

c*100@hQeQshQ

Probieren Sie es online!

Das erste Mal mit Pyth, also gibt es hier wahrscheinlich einige ziemlich große Optimierungen, aber ich weiß nicht, wo sie sind ...

0-Index, nimmt Eingabe als an list, index

frank
quelle
1

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

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

Probieren Sie es online!

Nehmen Sie die Liste, in der ersten Zeile ein Leerzeichen, in der zweiten den Index (0-basiert).

Xcali
quelle
1

TI-Basic , 12 Bytes (12 Token)

Prompt X
Ans(X)E2/sum(Ans

1-indiziert

Nimmt die Liste auf Ansund fordert den Benutzer zur Eingabe des Index auf

Beispiellauf

Erläuterung:

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
quelle
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$&
..$
.$&

Probieren Sie es online! Link enthält Testfälle. Übernimmt die Eingabe als index;list,.... Erläuterung:

\d+
$*

In Unary konvertieren.

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

In die Liste aufnehmen.

,

Summiere die Liste.

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

Multiplizieren Sie den gewünschten Wert mit 10000 und dividieren Sie ihn durch die Summe mit der Rundung, indem Sie zuerst die Hälfte der Summe addieren.

+`^..?$
0$&

Stellen Sie sicher, dass das Ergebnis aus mindestens drei Ziffern besteht.

..$
.$&

Fügen Sie an der vorletzten Stelle einen Dezimalpunkt ein.

Neil
quelle
1

Perl 6 , 21 Bytes

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

Probieren Sie es online!

Die einfache Lösung, da ich mit dem $bindizierten Parameter keine Curry-Parameter verwenden kann. Eine Funner-Lösung, die nicht mit zwei Parametern umgehen muss, indem sie stattdessen die rotateFunktion verwendet:

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

Probieren Sie es online!

Es ist aber leider zwei Bytes länger

Scherzen
quelle
1

MathGolf , 7 6 Bytes

§\Σ/♀*

0-basierte Indizierung.

Probieren Sie es online aus.

Erläuterung:

§       # 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
quelle
1

Icon , 53 Bytes

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

Probieren Sie es online!

Das einzig Interessante dabei ist, die Summe zu finden. Icon war eine der ersten Sprachen mit Generatoren. !generiert alle Werte der Liste L, die zu akkumuliert werden s. Normalerweise müssen wir schreiben every s+:=!L, aber ich habe Backtracking mit verwendet, um zu prüfen &\z, ob die nicht vorhandene zVariable vorhanden ist non-null, und um den nächsten Wert aus der Liste bis zur Erschöpfung zu extrahieren.

Galen Ivanov
quelle
1

Batch, 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%

Übernimmt Eingaben als Index und Listen als Befehlszeilenargumente. Hinweis: Funktioniert nur für Indexwerte von 1bis 9aufgrund von Einschränkungen des Stapels. Es könnte eine 0-indizierte Version geschrieben werden, die in der Lage wäre, die ersten 10 Elemente zu indizieren. Erläuterung:

@shift

Verschieben Sie den Index auf %0und die Liste auf %1... %9(oder weniger). Beachten Sie jedoch, dass Batch's shiftnicht beeinflusst %*.

@set s=%*

Holen Sie sich alle Parameter, Leerzeichen getrennt.

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

Ändern Sie die Leerzeichen in +s und werten Sie sie arithmetisch aus, wobei Sie die Summe nehmen, aber den Index subtrahieren. Dann in die Liste indexieren, mit 10000 multiplizieren, die Hälfte der Summe addieren und durch die Summe dividieren. Führen Sie schließlich zweimal divmod by 10 aus, um die Dezimalstellen zu generieren. (Der %arithmetische Operator hat in Batch eine besondere Bedeutung und muss normalerweise verdoppelt werden, aber das callerfordert dann eine weitere Verdoppelung.)

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

Ergebnis und Nachkommastellen ausgeben.

Neil
quelle