Tìm tỷ lệ phần trăm


15

Chúng tôi đã không có bất kỳ thử thách dễ dàng, tốt đẹp trong một thời gian, vì vậy chúng tôi đi đây.

Đưa ra một danh sách các số nguyên mỗi lớn hơn 0 và một chỉ mục làm đầu vào, xuất ra tỷ lệ phần trăm của mục tại chỉ mục đã cho của tổng số của danh sách.

Đầu ra phải là bất cứ thứ gì đại diện tự nhiên cho số float / số nguyên trong ngôn ngữ của bạn (số đơn, số thập phân, số Church, v.v.). Nếu bạn chọn làm tròn đầu ra theo bất kỳ cách nào, nó phải có tối thiểu 2 chữ số thập phân (khi hợp lý. 1.2 không cần phải làm tròn, nhưng 1.20 cũng hoàn toàn chấp nhận được).

Các chỉ mục có thể là 1 chỉ mục hoặc 0 chỉ mục và sẽ luôn nằm trong giới hạn của mảng.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Ví dụ

Sử dụng 1 chỉ mục và làm tròn thành 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

Hoặc, như ba danh sách:

[[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
Làm thế nào chính xác những người không phải là số nguyên có thể là đầu ra số đơn vị / nhà thờ?
Doorknob

1
@Doorknob Có thể là một số unary, dấu chấm và một số unary khác?
Đánh giá cao hoạt động

Vì đầu ra có thể được làm tròn đến hai chữ số thập phân, nên nó cũng có thể được phép cho đầu ra được làm tròn 100 lần?
Chuỗi không liên quan

1
trường hợp thử nghiệm 4 phải là 20/2410
attinat

Câu trả lời:


6

APL (Dyalog Unicode) , 9 byte SBCS

Chức năng ẩn danh ẩn danh. Lấy chỉ mục làm đối số bên trái và liệt kê là đối số bên phải.

100×⌷÷1⊥⊢

Hãy thử trực tuyến!

100 một trăm

× lần

 yếu tố được lập chỉ mục

÷ chia

1⊥ tổng (lit. đánh giá cơ sở-1) của

 lập luận đúng




5

Thạch , 7 byte

ị÷S}ȷ2×

Một liên kết dyadic chấp nhận một số nguyên, chỉ mục một ở bên trái và một danh sách các số ở bên phải mang lại tỷ lệ phần trăm.

Hãy thử trực tuyến!

Làm sao?

ị÷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
Đẹp! Đó là byte cho byte những gì tôi có: P
caird coinheringaahing

5

05AB1E , 6 byte

è²O/т*

Một chương trình đầy đủ lấy chỉ số sau đó danh sách. Sử dụng chỉ mục 0.

Hãy thử trực tuyến!

Làm sao?

è²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)

Hãy thử trực tuyến!


Tôi không biết R, nhưng điều này không giống như nó hoạt động (không biết cách kiểm tra nó trên TIO với các mảng tùy ý), vì bạn phải truy xuất phần tử của lchỉ mục n, không chỉ chia cho n(xem phần [7, 3, 19], 1kiểm tra )
caird coinheringaahing

@cairdcoinheringaahing Xấu của tôi, có một lỗi đánh máy (quên mất l[]xung quanh n)
niko

Có một điều trên trang liên kết TIO có thể định dạng này cho bạn.
JL2210


4

Java (JDK) , 47 byte

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

Hãy thử trực tuyến!


Tại sao bạn viết 1e2thay vì 100? Có phải vì 100là số nguyên và 1e2được coi là số dấu phẩy động?
Ismael Miguel

1
@IsmaelMiguel Có: 1e2mang loại kép, a[i]và tổng không. Vì thử thách đòi hỏi phải trả về số dấu phẩy động, đó là nơi tôi có thể sử dụng nó.
Olivier Grégoire

Thay đổi nó thành BiFactor <int [], Integer, Double> và bạn có thể lưu 10 byte với điều này : (a,i)->1e2*a[i]/IntStream.of(a).sum(). Chỉnh sửa:> :( mũi tên lambda tội nghiệp của tôi
Avi

@Avi Việc nhập vẫn được yêu cầu, vì vậy tôi phải viết : (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum(), dài 54 byte. Câu trả lời hiện tại của tôi chỉ dài 47 byte. Ngoài ra, a->i->là một byte ngắn hơn (a,i)->.
Olivier Grégoire

1
@Avi Có, chúng là bắt buộc và thường viết tên lớp đầy đủ thay vì nhập, vì vậy đó là những gì tôi làm ở đây
Olivier Grégoire










2

Cào 3.0 24 23 khối / 239 228 byte

-11 byte nhờ @JoKing

Hoặc trong cú pháp 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

Đã lưu 11 byte nhờ @JoKing

Hãy thử nó

Trả lời lịch sử

Ôi cào, sao lâu thế?

Hoặc trong cú pháp 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

Hãy thử nó

Đầu vào có dạng:

item1
item2
...
itemN
index

Tôi thực sự nên ngừng làm điều này với bản thân mình. Nhưng nó rất thú vị!


Bạn có thể thay đổi repeat length of mđể length of m-1và tiết kiệm cho mình delete n?
Jo King

Không, bởi vì nếu tôi đã làm, nó sẽ không kiểm tra mục cuối cùng.
Jono 2906

Chà, nếu bạn loại bỏ delete n of mnhư tôi đã đề xuất thì nó sẽ
Jo King


1

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

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

Hãy thử trực tuyến!

Lấy danh sách, khoảng cách được phân tách trên dòng đầu tiên, chỉ mục (dựa trên 0) trên dòng thứ hai.



1

TI-Basic , 12 byte (12 mã thông báo)

Prompt X
Ans(X)E2/sum(Ans

1 chỉ mục

Đưa danh sách vào Ansvà nhắc người dùng về chỉ mục

Chạy ví dụ

Giải trình:

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

Võng mạc 0.8.2 , 102 byte

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

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Đưa đầu vào là index;list,.... Giải trình:

\d+
$*

Chuyển đổi sang unary.

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

Chỉ số vào danh sách.

,

Tổng hợp danh sách.

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

Nhân giá trị mong muốn với 10000 và chia cho tổng với làm tròn bằng cách thêm vào một nửa số tiền đầu tiên.

+`^..?$
0$&

Đảm bảo rằng kết quả có ít nhất ba chữ số.

..$
.$&

Chèn một dấu thập phân ở vị trí cuối cùng thứ hai.



1

Perl 6 , 21 byte

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

Hãy thử trực tuyến!

Giải pháp đơn giản, vì tôi không thể sử dụng các tham số được xử lý với $btham số được lập chỉ mục. Một giải pháp thú vị không phải xử lý hai tham số bằng cách sử dụng rotatehàm thay thế:

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

Hãy thử trực tuyến!

Nhưng không may là hai byte dài hơn



1

MathGolf , 7 6 byte

§\Σ/♀*

Lập chỉ mục dựa trên 0.

Hãy thử trực tuyến.

Giải trình:

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

Biểu tượng , 53 byte

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

Hãy thử trực tuyến!

Điều thú vị duy nhất ở đây là tìm kiếm tổng. Biểu tượng là một trong những ngôn ngữ đầu tiên có máy phát điện. !tạo ra tất cả các giá trị của danh sách Lđược tích lũy s. Thông thường chúng ta cần phải ghi every s+:=!L, nhưng tôi đã sử dụng thụt lùi với &\z, mà kiểm tra nếu không tồn tại zbiến là non-null, mà không phải là, và trích xuất các giá trị tiếp theo trong danh sách cho đến khi kiệt sức.



1

Mẻ, 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%

Lấy đầu vào là chỉ mục và liệt kê dưới dạng đối số dòng lệnh. Lưu ý: Chỉ hoạt động cho các giá trị chỉ mục từ 1đến 9do giới hạn của Batch; một phiên bản 0 chỉ mục có thể được viết để có thể lập chỉ mục 10 yếu tố đầu tiên. Giải trình:

@shift

Chuyển chỉ mục sang %0và danh sách thành %1... %9(hoặc ít hơn). Lưu ý tuy nhiên Batch's shiftkhông ảnh hưởng %*.

@set s=%*

Lấy tất cả các tham số, không gian tách biệt.

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

Thay đổi khoảng trắng thành +s và đánh giá một cách hợp lý, do đó lấy tổng, nhưng trừ chỉ số. Sau đó lập chỉ mục vào danh sách, nhân với 10000, cộng một nửa tổng và chia cho tổng. Cuối cùng thực hiện divmod bằng 10 lần để tạo các số thập phân. (Các% Toán tử số học có ý nghĩa đặc biệt trong Batch và thông thường cần phải nhân đôi nhưng callsau đó yêu cầu tăng gấp đôi.)

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

Xuất kết quả và số thập phân.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.