Znajdź procent

15

Od jakiegoś czasu nie mieliśmy żadnych przyjemnych, łatwych wyzwań, więc zaczynamy.

Biorąc pod uwagę listę liczb całkowitych większych niż 0 i indeks jako dane wejściowe, wypisz procent pozycji przy danym indeksie całkowitej sumy listy.

Dane wyjściowe powinny być takie same, jak naturalna reprezentacja liczb zmiennoprzecinkowych / liczb całkowitych w twoim języku (liczba jednoargumentowa, dziesiętna, cyfry kościelne itp.). Jeśli zdecydujesz się zaokrąglić wynik w jakikolwiek sposób, musi on mieć co najmniej 2 miejsca po przecinku (w uzasadnionych przypadkach. 1.2 nie musi być zaokrąglany, ale 1.20 jest również całkowicie akceptowalny).

Indeksy mogą być indeksowane 1 lub 0 i zawsze będą się mieścić w granicach tablicy.

To jest , więc wygrywa najkrótszy kod w bajtach!

Przykłady

Użycie 1-indeksowane i zaokrąglone do 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

Lub jako trzy listy:

[[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]
Cairney Coheringaahing
źródło
Wpis w
3
jak dokładnie mogą być wyprowadzane liczby całkowite jako liczby jednostkowe / kościelne?
Klamka
1
@ Dooobnob Może liczba jednoargumentowa, kropka i inna liczba jednoargumentowa?
HighlyRadioactive
Ponieważ dane wyjściowe można zaokrąglić do dwóch miejsc po przecinku, może być również dozwolone generowanie zaokrąglenia razy 100?
Niepowiązany ciąg
1
przypadek testowy 4 powinien wynosić 20/2410
attinat

Odpowiedzi:

6

APL (Dyalog Unicode) , 9 bajtów SBCS

Anonimowa funkcja ukrytej poprawki. Trwa indeks jako lewy argument i lista jako prawy argument.

100×⌷÷1⊥⊢

Wypróbuj online!

100 sto

× czasy

 indeksowany element

÷ podzielony przez

1⊥ suma (dosł. ocena podstawy 1) z

 właściwy argument

Adám
źródło
6

Python 3 , 26 bajtów

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

Nienazwana funkcja akceptująca liczbę całkowitą (indeks o indeksie 0) i listę zwracającą procent.

Wypróbuj online!

Jonathan Allan
źródło
5

Galaretka , 7 bajtów

ị÷S}ȷ2×

Dyadyczny link akceptujący liczbę całkowitą, indeks oparty na jednym z lewej strony i listę liczb po prawej, która daje wartość procentową.

Wypróbuj online!

W jaki sposób?

ị÷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
źródło
1
Ładny! To bajt za bajtem, co miałem: P
caird coinheringaahing
5

05AB1E , 6 bajtów

è²O/т*

Pełny program przyjmujący indeks, a następnie listę. Wykorzystuje indeksowanie 0.

Wypróbuj online!

W jaki sposób?

è²O/т*
è      - index (input 1) into (input 2)
 ²     - push 2nd input
  O    - sum
   /   - divide
    т  - push 100
     * - multiply
       - print top of stack
Jonathan Allan
źródło
4

R 28 bajtów

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

Wypróbuj online!

niko
źródło
Nie znam R, ale to nie wygląda na to, że to działa (nie jestem pewien, jak to przetestować na TIO z dowolnymi tablicami), ponieważ należy pobrać element z lindeksu n, a nie tylko podzielić n(patrz [7, 3, 19], 1test )
caird coinheringaahing
@cairdcoinheringaahing My bad, miał literówkę (zapomniałem o l[]całym n)
Niko
Na stronie łącza TIO jest coś, co może sformatować to dla Ciebie.
SS Anne
4

C (gcc) , 64 bajty

0-indeksowane. Jedyną zabawną 1e2rzeczą była realizacja, czyli doubleoszczędność bajtu 100.!

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

Wypróbuj online!

ErikF
źródło
Wypróbuj online! 59 przy użyciu C (clang)
AZTECCO
4

Java (JDK) , 47 bajtów

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

Wypróbuj online!

Olivier Grégoire
źródło
Dlaczego napisałeś 1e2zamiast 100? Czy to dlatego, że 100jest liczbą całkowitą i 1e2jest uważana za liczbę zmiennoprzecinkową?
Ismael Miguel
1
@ IsmaelMiguel Tak: 1e2przenosi podwójny typ, którego a[i]i suma nie. Ponieważ wyzwanie wymaga zwrócenia liczb zmiennoprzecinkowych, tam mogę go użyć.
Olivier Grégoire,
Zmień go na BiFunction <int [], Integer, double> i można zapisać 10 bajtów z tym: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Edycja:> :( moja biedna strzała lambda
Avi
@Avi Import jest nadal wymagany, więc musiałbym napisać:, (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()który ma 54 bajty. Moja obecna odpowiedź ma tylko 47 bajtów. Ponadto a->i->jest o jeden bajt krótszy niż (a,i)->.
Olivier Grégoire,
1
@Avi Tak, są one wymagane i zwykle jest krótsze, aby napisać pełną nazwę klasy zamiast importu, więc to właśnie tutaj robię
Olivier Grégoire
3

Haskell ,  20  18 bajtów

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

Operator dynamiczny ( ?) przyjmujący indeks (0-indeksowany) po lewej stronie i listę po prawej, która daje wartość procentową.

Wypróbuj online!

Jonathan Allan
źródło
3

J , 10 bajtów

100*{%1#.]

Wypróbuj online!

0-indeksowane

Galen Iwanow
źródło
3

JavaScript (ES6), 30 bajtów

Pobiera dane wejściowe jako (array)(index), gdzie indeks jest oparty na 0.

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

Wypróbuj online!

Arnauld
źródło
3

MATL , 9 bajtów

)1Gs/100*

Wypróbuj online!

Wyjaśnienie

          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

Wypróbuj online!

wada
źródło
3

PHP (7.4), 35 bajtów

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

Wypróbuj online!

Indeks wejściowy jest oparty na 0.

Noc 2
źródło
3

K (oK) , 15 14 bajtów

-1 bajt dzięki ngn!

{100*x[y]%+/x}

Wypróbuj online!

0-indeksowane

Galen Iwanow
źródło
1
(x@y)->x[y]
ngn 10.10.19
@ngn Dziękujemy!
Galen Iwanow
2

Czerwony , 31 29 bajtów

-2 bajty dzięki ErikF

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

Wypróbuj online!

Galen Iwanow
źródło
1
(-2 bajty) sugerują użycie 1e2zamiast 100.0: Wypróbuj online! . To całkiem fajne, ile języków może użyć tej sztuczki!
ErikF
@ErikF Dziękujemy! Wiem to w teorii, ale jak się wydaje, zapomniałem go użyć :)
Galen Iwanow
2

Scratch 3.0 24 23 bloki / 239 228 bajtów

-11 bytes thanks to @JoKing

Alternatywnie w składni 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

Zaoszczędź 11 bajtów dzięki @JoKing

Wypróbuj od zera

Historia odpowiedzi

Oh Scratchblocks, why so long?

Alternatywnie w składni 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

Wypróbuj od zera

Dane wejściowe mają postać:

item1
item2
...
itemN
index

Naprawdę powinienem przestać to robić dla siebie. Ale to jest bardzo fajne!

Lyxal
źródło
Można zmienić repeat length of m, aby length of m-1i oszczędzić sobie delete n?
Jo King
Nie, ponieważ gdybym to zrobił, nie oznaczałoby to ostatniego elementu.
Lyxal
Cóż, jeśli usuniesz to, delete n of mco zasugerowałem, to by to zrobiło
Jo King
2

Pyth , 13 bajtów

c*100@hQeQshQ

Wypróbuj online!

Po raz pierwszy używam Pytha, więc zapewne są tu jakieś dość duże optymalizacje, ale nie wiem, gdzie one są ...

Indeks 0, przyjmuje dane wejściowe jako list, index

szczery
źródło
1

Perl 5 -ap -MList::Util=Sum , 19 bajtów

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

Wypróbuj online!

Weź listę, oddzieloną spacją w pierwszym wierszu, a indeks (oparty na 0) w drugim.

Xcali
źródło
1

TI-Basic , 12 bajtów (12 tokenów)

Prompt X
Ans(X)E2/sum(Ans

1-indeksowany

Pobiera listę Ansi pyta użytkownika o indeks

Przykładowy przebieg

Wyjaśnienie:

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
pizzapanty184
źródło
1

Retina 0.8.2 , 102 bajty

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

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

Wypróbuj online! Link zawiera przypadki testowe. Pobiera dane wejściowe jako index;list,.... Wyjaśnienie:

\d+
$*

Konwertuj na unary.

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

Indeksuj na liście.

,

Zsumuj listę.

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

Pomnóż żądaną wartość przez 10000 i podziel przez sumę z zaokrągleniem, dodając najpierw połowę sumy.

+`^..?$
0$&

Upewnij się, że wynik ma co najmniej trzy cyfry.

..$
.$&

Wstaw kropkę dziesiętną w drugim ostatnim miejscu.

Neil
źródło
1

Perl 6 , 21 bajtów

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

Wypróbuj online!

Proste rozwiązanie, ponieważ nie mogę używać parametrów curry z $bindeksowanym parametrem. Zabawniejsze rozwiązanie, które nie musi obsługiwać dwóch parametrów za pomocą rotatefunkcji:

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

Wypróbuj online!

Ale jest niestety o dwa bajty dłużej

Jo King
źródło
1

MathGolf , 7 6 bajtów

§\Σ/♀*

Indeksowanie na podstawie 0.

Wypróbuj online.

Wyjaśnienie:

§       # 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
źródło
1

Ikona , 53 bajty

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

Wypróbuj online!

Jedyną interesującą rzeczą jest tutaj znalezienie sumy. Ikona była jednym z pierwszych języków posiadających generatory. !generuje wszystkie wartości listy, Lktóre są akumulowane s. Zwykle musimy pisać every s+:=!L, ale użyłem śledzenia wstecznego z &\z, który sprawdza, czy nieistniejąca zzmienna jest non-null, co nie jest, i wyciąga następną wartość z listy do wyczerpania.

Galen Iwanow
źródło
1

Partia, 111 bajtów

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

Pobiera dane wejściowe jako indeks, a listę jako argumenty wiersza polecenia. Uwaga: Działa tylko w przypadku wartości indeksu od 1do z 9powodu ograniczeń partii; można napisać wersję z indeksowaniem 0, która byłaby w stanie zindeksować pierwsze 10 elementów. Wyjaśnienie:

@shift

Przesuń indeks do %0i listę do %1... %9(lub mniej). Należy jednak pamiętać, że partia shiftnie ma wpływu %*.

@set s=%*

Uzyskaj wszystkie parametry oddzielone spacją.

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

Zmień spacje na +s i oblicz arytmetycznie, biorąc w ten sposób sumę, ale odejmij indeks. Następnie zindeksuj listę, pomnóż przez 10000, dodaj połowę sumy i podziel przez sumę. Na koniec dwukrotnie wykonaj divmod o 10, aby wygenerować miejsca dziesiętne. ( %Operator arytmetyczny ma specjalne znaczenie w partii i zwykle wymaga podwojenia, ale callwtedy wymaga dalszego podwojenia).

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

Wynik i miejsca dziesiętne.

Neil
źródło