Trova la percentuale


15

Non abbiamo avuto nessuna bella, facile sfida da un po ', quindi eccoci qui.

Dato un elenco di numeri interi ciascuno maggiore di 0 e un indice come input, genera la percentuale dell'elemento in corrispondenza dell'indice dato della somma totale dell'elenco.

L'output dovrebbe essere qualunque sia la rappresentazione naturale di float / interi nella tua lingua (unaria, decimale, numeri di Church ecc.). Se si sceglie di arrotondare in qualche modo l'output, deve avere almeno 2 decimali (quando ragionevole. 1.2 non deve essere arrotondato, ma anche 1.20 è perfettamente accettabile).

Gli indici possono essere 1-indicizzati o 0-indicizzati e saranno sempre entro i limiti dell'array.

Questo è , quindi vince il codice più corto in byte!

Esempi

Utilizzando 1-indicizzato e arrotondato 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

Oppure, come tre elenchi:

[[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
come possono esattamente essere emessi numeri interi come numeri unari / ecclesiali?
Maniglia della porta

1
@Doorknob Forse un numero unario, il punto e un altro numero unario?
Altamente radioattivo,

Poiché l'output può essere arrotondato al secondo decimale, potrebbe anche essere consentito l'output arrotondato per 100?
Stringa non correlata

1
il test case 4 dovrebbe essere 20/2410
attinat

Risposte:


6

APL (Dyalog Unicode) , SBCS da 9 byte

Funzione anonimo di tacita infissione. Accetta l'indice come argomento a sinistra e l'elenco come argomento a destra.

100×⌷÷1⊥⊢

Provalo online!

100 cento

× volte

 l'elemento indicizzato

÷ diviso per

1⊥ la somma (lett. la valutazione base-1) di

 l'argomento giusto




5

Gelatina , 7 byte

ị÷S}ȷ2×

Un collegamento diadico che accetta un indice intero a base singola a sinistra e un elenco di numeri a destra che fornisce la percentuale.

Provalo online!

Come?

ị÷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
Bello! Quello è byte per byte quello che avevo: P
caird coinheringaahing

5

05AB1E , 6 byte

è²O/т*

Un programma completo che prende l'indice e poi l'elenco. Utilizza l'indicizzazione 0.

Provalo online!

Come?

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

4

R 28 byte

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

Provalo online!


Non conosco R, ma questo non sembra funzionare (non sono sicuro di come testarlo su TIO con array arbitrari), in quanto si suppone di recuperare l'elemento di lin index n, non solo dividerlo per n(vedere la [7, 3, 19], 1testcase )
caird coinheringaahing il

@cairdcoinheringaahing Il mio male, aveva un refuso (dimenticato il l[]giro del n)
niko

C'è qualcosa nella pagina dei link di TIO che può formattarlo per te.
SS Anne


4

Java (JDK) , 47 byte

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

Provalo online!


Perché hai scritto 1e2invece di 100? È perché 100è un numero intero ed 1e2è considerato un numero in virgola mobile?
Ismael Miguel,

1
@IsmaelMiguel Sì: 1e2porta il doppio tipo, che a[i]e la somma no. Poiché la sfida richiede di restituire numeri in virgola mobile, è qui che posso usarla.
Olivier Grégoire,

Cambiarlo in un BiFunction <int [], Integer, Double> ed è possibile salvare 10 byte con questo: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Modifica:> :( la mia povera freccia lambda
Avi

@Avi L'importazione è ancora necessaria, quindi dovrei scrivere:, (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()che è lungo 54 byte. La mia risposta attuale è lunga solo 47 byte. Inoltre, a->i->è un byte più breve di (a,i)->.
Olivier Grégoire,

1
@Avi Sì, sono richiesti , e di solito è più breve scrivere il nome completo della classe anziché l'importazione, quindi è quello che faccio qui
Olivier Grégoire,

3

Haskell ,  20 anni  18 byte

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

Un operatore diadico (? ) che prende l'indice (0-indicizzato) a sinistra e un elenco a destra che fornisce la percentuale.

Provalo online!




3

JavaScript (ES6), 30 byte

Prende come ingresso (array)(index), dove indice si basa-0.

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

Provalo online!


3

MATL , 9 byte

)1Gs/100*

Provalo online!

Spiegazione

          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

Provalo online!






2

Scratch 3.0 24 23 blocchi / 239 228 byte

-11 bytes thanks to @JoKing

In alternativa nella sintassi 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

Salvato 11 byte grazie a @JoKing

Provalo da zero

Cronologia delle risposte

Oh Scratchblocks, why so long?

In alternativa nella sintassi 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

Provalo da zero

L'input ha la forma di:

item1
item2
...
itemN
index

Dovrei davvero smettere di farmi questo. Ma è molto divertente!


Si può cambiare repeat length of mper length of m-1e risparmiare la delete n?
Jo King,

No, perché se lo facessi, non calcolerebbe l'ultimo elemento.
Lyxal,

Bene, se rimuovessi delete n of mcome ti avevo suggerito, sarebbe
Jo King il

2

Pyth , 13 byte

c*100@hQeQshQ

Provalo online!

La prima volta che uso Pyth quindi probabilmente ci sono alcune grandi ottimizzazioni qui, ma non so dove siano ...

0-index, accetta input come list, index


1

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

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

Provalo online!

Prendi l'elenco, lo spazio separato sulla prima riga, l'indice (basato su 0) sulla seconda.



1

TI-Basic , 12 byte (12 token)

Prompt X
Ans(X)E2/sum(Ans

1-indicizzato

Inserisce l'elenco Anse richiede all'utente l'indice

Esempio di esecuzione

Spiegazione:

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 byte

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

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

Provalo online! Il link include casi di test. Accetta input come index;list,.... Spiegazione:

\d+
$*

Converti in unario.

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

Indice nell'elenco.

,

Somma l'elenco.

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

Moltiplicare il valore desiderato per 10000 e dividere per la somma con arrotondamento aggiungendo prima metà della somma.

+`^..?$
0$&

Assicurarsi che il risultato abbia almeno tre cifre.

..$
.$&

Inserire un punto decimale nella penultima posizione.



1

Perl 6 , 21 byte

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

Provalo online!

La soluzione semplice, dal momento che non posso usare i parametri curry con il $bparametro da indicizzare. Una soluzione più divertente che non deve gestire due parametri utilizzando rotateinvece la funzione:

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

Provalo online!

Ma sfortunatamente è più lungo di due byte



1

MathGolf , 7 6 byte

§\Σ/♀*

Indicizzazione basata su 0.

Provalo online.

Spiegazione:

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

Icona , 53 byte

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

Provalo online!

L'unica cosa interessante qui è trovare la somma. Icona è stata una delle prime lingue ad avere generatori. !genera tutti i valori dell'elenco Lche vengono accumulati s. Normalmente dobbiamo scrivere every s+:=!L, ma ho usato il backtracking con &\z, che controlla se la zvariabile inesistente è non-null, che non lo è, ed estrae il valore successivo dall'elenco fino all'esaurimento.



1

Lotto, 111 byte

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

Accetta input come indice ed elenco come argomenti della riga di comando. Nota: funziona solo per i valori di indice da 1a a 9causa delle limitazioni di Batch; potrebbe essere scritta una versione con indice 0 che sarebbe in grado di indicizzare i primi 10 elementi. Spiegazione:

@shift

Spostare l'indice su %0e l'elenco su %1... %9(o meno). Si noti tuttavia che Batch shiftnon influisce %*.

@set s=%*

Ottieni tutti i parametri, spazio separato.

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

Cambia gli spazi in +s e valuta aritmeticamente, prendendo così la somma, ma sottraendo l'indice. Quindi indicizza nell'elenco, moltiplica per 10000, aggiungi metà della somma e dividi per la somma. Infine esegui divmod per 10 due volte per generare i decimali. (L' %operatore aritmetico ha un significato speciale in Batch e normalmente deve essere raddoppiato, ma callrichiede quindi un ulteriore raddoppio.)

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

Emette il risultato e le posizioni decimali.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.