Temukan persentasenya

15

Kami belum memiliki tantangan yang menyenangkan dan mudah dalam beberapa saat, jadi inilah dia.

Diberikan daftar bilangan bulat masing-masing lebih besar dari 0 dan indeks sebagai input, output persentase item pada indeks yang diberikan dari total jumlah daftar.

Output harus berupa apa pun representasi alami untuk pelampung / bilangan bulat dalam bahasa Anda (unary, desimal, angka Gereja, dll.). Jika Anda memilih untuk membulatkan output dengan cara apa pun, itu harus memiliki minimal 2 tempat desimal (bila masuk akal. 1.2 tidak perlu dibulatkan, tetapi 1.20 juga dapat diterima).

Indeks dapat berupa indeks-1 atau indeks-0, dan akan selalu berada dalam batas-batas array.

Ini adalah , jadi kode terpendek dalam byte menang!

Contohnya

Menggunakan 1-diindeks dan dibulatkan menjadi 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

Atau, sebagai tiga daftar:

[[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
sumber
Posting Sandbox (sekarang dihapus)
caird coinheringaahing
3
bagaimana tepatnya non-integer menjadi output sebagai angka unary / gereja?
Gagang Pintu
1
@ Doorknob Mungkin nomor unary, titik, dan nomor unary lainnya?
HighlyRadioactive
Karena output dapat dibulatkan ke dua tempat desimal, mungkin juga diizinkan untuk membulatkan kali 100?
String Tidak Terkait
1
test case 4 harus 20/2410
attinat

Jawaban:

6

APL (Dyalog Unicode) , 9 byte SBCS

Fungsi infiks diam-diam anonim. Mengambil indeks sebagai argumen kiri dan daftar sebagai argumen kanan.

100×⌷÷1⊥⊢

Cobalah online!

100 seratus

× waktu

 elemen yang diindeks

÷ dibagi dengan

1⊥ jumlah (lit. evaluasi base-1) dari

 argumen yang benar

Adm
sumber
6

Python 3 , 26 byte

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

Fungsi tanpa nama yang menerima bilangan bulat (indeks-indeks 0) dan daftar yang mengembalikan persentase.

Cobalah online!

Jonathan Allan
sumber
5

Jelly , 7 byte

ị÷S}ȷ2×

Tautan diad yang menerima bilangan bulat, indeks berbasis satu di sebelah kiri dan daftar angka di sebelah kanan yang menghasilkan persentase.

Cobalah online!

Bagaimana?

ị÷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
sumber
1
Bagus! Itu byte untuk byte yang saya punya: P
caird coinheringaahing
5

05AB1E , 6 byte

è²O/т*

Program lengkap mengambil indeks kemudian daftar. Menggunakan pengindeksan 0.

Cobalah online!

Bagaimana?

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

R 28 byte

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

Cobalah online!

niko
sumber
Saya tidak tahu R, tetapi ini sepertinya tidak berfungsi (tidak yakin bagaimana cara mengujinya pada TIO dengan array arbitrer), karena Anda seharusnya mengambil elemen lpada indeks n, tidak hanya dibagi dengan n(lihat [7, 3, 19], 1testcase )
caird coinheringaahing
@cairdcoinheringaahing Badaku, salah ketik (lupa l[]sekitar n)
niko
Ada satu hal di halaman tautan TIO yang dapat memformat ini untuk Anda.
SS Anne
4

C (gcc) , 64 byte

Diindeks 0. Satu-satunya menyenangkan bit adalah kesadaran bahwa 1e2adalah double, menyimpan byte lebih 100.!

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

Cobalah online!

ErikF
sumber
Cobalah online! 59 menggunakan C (
clang
4

Java (JDK) , 47 byte

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

Cobalah online!

Olivier Grégoire
sumber
Mengapa Anda menulis 1e2alih-alih 100? Apakah karena 100bilangan bulat dan 1e2dianggap sebagai angka titik mengambang?
Ismael Miguel
1
@ IsmaelMiguel Ya: 1e2membawa tipe ganda, yang a[i]dan jumlah tidak. Karena tantangan mengharuskan untuk mengembalikan angka floating point, di situlah saya dapat menggunakannya.
Olivier Grégoire
Mengubahnya ke BiFunction <int [], Integer, Double> dan Anda dapat menyimpan 10 byte dengan ini: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Sunting:> :( panah lambda saya yang malang
Avi
@ Avi Impor masih diperlukan, jadi saya harus menulis:, yang panjangnya (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()54 byte. Jawaban saya saat ini hanya 47 byte. Juga, a->i->satu byte lebih pendek dari (a,i)->.
Olivier Grégoire
1
@Vi Ya, mereka diharuskan , dan biasanya lebih pendek untuk menulis nama kelas penuh daripada impor, jadi itulah yang saya lakukan di sini
Olivier Grégoire
3

Haskell,  20  18 bytes

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

A dyadic operator (?) taking the (0-indexed) index on the left and a list on the right which yields the percentage.

Try it online!

Jonathan Allan
sumber
3

J, 10 bytes

100*{%1#.]

Try it online!

0-indexed

Galen Ivanov
sumber
3

JavaScript (ES6), 30 bytes

Takes input as (array)(index), where index is 0-based.

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

Try it online!

Arnauld
sumber
3

MATL, 9 bytes

)1Gs/100*

Try it online!

Explanation

          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

Try it online!

flawr
sumber
3

PHP (7.4), 35 bytes

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

Try it online!

Input index is 0-based.

Night2
sumber
3

K (oK), 15 14 bytes

-1 byte thanks to ngn!

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

Try it online!

0-indexed

Galen Ivanov
sumber
1
(x@y) -> x[y]
ngn
@ngn Thanks you!
Galen Ivanov
2

Red, 31 29 bytes

-2 bytes thanks to ErikF

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

Try it online!

Galen Ivanov
sumber
1
(-2 byte) menyarankan menggunakan 1e2daripada 100.0: Coba online!. It's pretty neat how many languages can use this trick!
ErikF
@ErikF Thank you! I know this in theory, but as it seems, I forgot to use it :)
Galen Ivanov
2

Gores 3.0 24 23 blok / 239 228 byte

-11 bytes thanks to @JoKing

Atau dalam sintaks 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

Disimpan 11 byte berkat @ JoKing

Cobalah dari awal

Jawab Sejarah

Oh Scratchblocks, why so long?

Atau dalam sintaks 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

Cobalah dari awal

Masukan dalam bentuk:

item1
item2
...
itemN
index

Aku benar-benar harus berhenti melakukan ini pada diriku sendiri. Tapi ini sangat menyenangkan!

Jono 2906
sumber
Anda dapat mengubah repeat length of mke length of m-1dan menyelamatkan diri delete n?
Jo King
Tidak, karena jika saya lakukan, itu tidak akan cocok dengan item terakhir.
Jono 2906
Nah, jika Anda menghapus delete n of mseperti yang saya sarankan maka itu akan
Jo King
2

Pyth , 13 byte

c*100@hQeQshQ

Cobalah online!

Pertama kali menggunakan Pyth jadi mungkin ada beberapa optimasi yang cukup besar di sini, tapi saya tidak tahu di mana mereka ...

0-index, menerima input sebagai list, index

jujur
sumber
1

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

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

Cobalah online!

Ambil daftar, spasi terpisah pada baris pertama, indeks (berbasis 0) pada baris kedua.

Xcali
sumber
1

TI-Basic , 12 byte (12 token)

Prompt X
Ans(X)E2/sum(Ans

1-diindeks

Membawa daftar Ansdan meminta pengguna untuk indeks

Contoh dijalankan

Penjelasan:

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

Cobalah online! Tautan termasuk kasus uji. Mengambil input sebagai index;list,.... Penjelasan:

\d+
$*

Konversikan ke unary.

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

Indeks ke dalam daftar.

,

Jumlahkan daftar.

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

Lipat gandakan nilai yang diinginkan dengan 10000 dan bagi dengan jumlah dengan pembulatan dengan menambahkan setengah dari jumlah pertama.

+`^..?$
0$&

Pastikan bahwa hasilnya memiliki setidaknya tiga digit.

..$
.$&

Masukkan titik desimal di posisi terakhir kedua.

Neil
sumber
1

Perl 6 , 21 byte

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

Cobalah online!

Solusi sederhana, karena saya tidak bisa menggunakan parameter curried dengan $bparameter diindeks. Solusi funner yang tidak harus menangani dua parameter dengan menggunakan rotatefungsi sebagai gantinya:

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

Cobalah online!

Tapi sayangnya dua byte lebih lama

Jo King
sumber
1

MathGolf , 7 6 byte

§\Σ/♀*

Pengindeksan berbasis 0.

Cobalah online.

Penjelasan:

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

Ikon , 53 byte

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

Cobalah online!

Satu-satunya hal yang menarik di sini adalah menemukan jumlahnya. Ikon adalah salah satu bahasa pertama yang memiliki generator. !menghasilkan semua nilai daftar Lyang diakumulasikan s. Biasanya kita perlu menulis every s+:=!L, tetapi saya menggunakan backtracking &\z, yang memeriksa apakah zvariabel tidak ada non-null, yang tidak, dan mengekstrak nilai berikutnya dari daftar sampai kelelahan.

Galen Ivanov
sumber
1

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

Takes input as index and list as command-line arguments. Note: Only works for index values from 1 to 9 due to limitations of Batch; a 0-indexed version could be written which would be able to index the first 10 elements. Explanation:

@shift

Shift the index to %0 and the list to %1...%9 (or less). Note however that Batch's shift does not affect %*.

@set s=%*

Get all of the parameters, space separated.

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

Ubah spasi menjadi +s dan evaluasi secara hitung, sehingga mengambil jumlah, tetapi kurangi indeks. Kemudian indeks ke dalam daftar, kalikan dengan 10.000, tambahkan setengah dari jumlah, dan bagi dengan jumlah. Akhirnya lakukan divmod sebanyak 10 kali untuk menghasilkan tempat desimal. ( %Operator aritmatika memiliki arti khusus dalam Batch dan biasanya perlu digandakan tetapi callkemudian membutuhkan penggandaan lebih lanjut.)

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

Keluarkan hasilnya dan tempat desimal.

Neil
sumber