Yüzdeyi bulun


15

Bir süredir güzel, kolay zorluklar yaşamadık, işte başlıyoruz.

Her biri 0 büyük bir tamsayı listesi ve girdi olarak bir dizin verildiğinde, verilen toplam dizinin verilen dizinindeki öğenin yüzdesini çıktılayın.

Çıktı, kayan / tamsayıların doğal temsili sizin dilinizde (tekli, ondalık, Kilise rakamları vb.) Ne olursa olsun olmalıdır. Çıkışı herhangi bir şekilde yuvarlamayı seçerseniz, en az 2 ondalık basamağa sahip olmalıdır (makul olduğunda 1.2 yuvarlatılmasına gerek yoktur , ancak 1.20 de mükemmel kabul edilebilir).

Dizinler 1 dizinli veya 0 dizinli olabilir ve her zaman dizinin sınırları içinde olur.

Bu , yani bayt içindeki en kısa kod kazanır!

Örnekler

1 dizinli ve 2 dp'ye yuvarlanmış kullanma

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

Veya üç liste halinde:

[[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
tamsayılar tam olarak tek / kilise rakamları olarak nasıl çıkarılabilir?
Kapı tokmağı

1
@Doorknob Belki bir tekli sayı, nokta ve başka bir tekli sayı?
HighlyRadioactive

Çıktı iki ondalık basamağa yuvarlanabildiğinden, yuvarlatılmış sürelerin 100?
İlişkisiz String

1
test senaryosu 4 20/2410
attinat

Yanıtlar:


6

APL (Dyalog Unicode) , 9 bayt SBCS

Anonim zımni infix fonksiyonu. Dizini sol argüman olarak alır ve sağ argüman olarak listeler.

100×⌷÷1⊥⊢

Çevrimiçi deneyin!

100 yüz

× zamanlar

 indekslenmiş eleman

÷ bölü

1⊥ toplam (baz-1 değerlendirmesi)

 doğru argüman




5

Jöle , 7 bayt

ị÷S}ȷ2×

Solda bir tamsayı, tek tabanlı bir dizin ve sağda yüzde veren bir sayı listesi kabul eden ikili bir Bağlantı.

Çevrimiçi deneyin!

Nasıl?

ị÷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
Güzel! Sahip olduğum bayt için bayt: P
caird coinheringaahing

5

05AB1E , 6 bayt

è²O/т*

Dizin ve listeyi alan tam bir program. 0 endeksleme kullanır.

Çevrimiçi deneyin!

Nasıl?

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

4

R 28 bayt

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

Çevrimiçi deneyin!


R'yi bilmiyorum, ama bu işe yaramaz gibi gözükmüyor (TIO'da keyfi dizilerle nasıl test edileceğinden emin değilim), çünkü sadece bölmekle kalmayıp lindekste elemanını almanız gerekiyor ( testcase'e bakın) )nn[7, 3, 19], 1
caird coinheringaahing

@cairdcoinheringaahing Benim kötü, bir yazım hatası vardı (unuttum l[]etrafında n)
niko

TIO bağlantı sayfasında bunu sizin için biçimlendirebilecek bir şey var.
SS Anne


4

Java (JDK) , 47 bayt

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

Çevrimiçi deneyin!


Neden yazdım mı 1e2yerine 100? Diye mi 100tam sayıdır ve 1e2bir kayan noktalı sayı olarak kabul edilir?
Ismael Miguel

1
@IsmaelMiguel Evet: toplamı olmayan 1e2çift ​​türü taşır a[i]. Zorluk kayan nokta sayılarını döndürmeyi gerektirdiğinden, onu kullanabileceğim yer burasıdır.
Olivier Grégoire

Bir Bifonksiyonel <int [], Integer, Double> olarak değiştirin ve bu 10 bayt kaydedebilirsiniz: (a,i)->1e2*a[i]/IntStream.of(a).sum(). Düzenleme:> :( benim zavallı lambda
Avi

@Avi Alma hala gereklidir, bu yüzden yazmak zorundayım: (a,i)->1e2*a[i]/java.util.stream.IntStream.of(a).sum()54 bayt uzunluğunda. Şu anki cevabım sadece 47 bayt uzunluğunda. Ayrıca, a->i->bir bayt daha kısadır (a,i)->.
Olivier Grégoire

1
@Avi Evet, gerekli ve içe aktarma yerine tam sınıf adını yazmak genellikle daha kısa, bu yüzden burada yapıyorum
Olivier Grégoire





3

MATL , 9 bayt

)1Gs/100*

Çevrimiçi deneyin!

açıklama

          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

Çevrimiçi deneyin!






2

Kazı 3.0 24 23 blok / 239 228 bayt

-11 bytes thanks to @JoKing

Alternatif olarak SB sözdiziminde

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

@JoKing sayesinde 11 bayt kaydedildi

Sıfırdan deneyin

Yanıt Geçmişi

Oh Scratchblocks, why so long?

Alternatif olarak SB sözdiziminde

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

Sıfırdan deneyin

Girdi şu şekildedir:

item1
item2
...
itemN
index

Bunu kendime yapmayı gerçekten bırakmalıyım. Ama bir çok eğlenceli!


Değiştirmek Can repeat length of miçin length of m-1ve kendiniz tasarrufu delete n?
Jo King

Hayır.
Lyxal

Eğer delete n of mönerdiğim gibi kaldırırsanız, o zaman olur
Jo King

2

Pyth , 13 bayt

c*100@hQeQshQ

Çevrimiçi deneyin!

Pyth kullanarak ilk kez muhtemelen burada bazı oldukça büyük optimizasyonlar var, ama nerede olduklarını bilmiyorum ...

0-endeksi, girişi şu şekilde alır: list, index




1

TI-Basic , 12 bayt (12 belirteç)

Prompt X
Ans(X)E2/sum(Ans

1 endeksli

Listeyi alır Ansve kullanıcıdan dizini ister

Örnek çalışma

Açıklama:

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 bayt

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

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Girişi alır index;list,.... Açıklama:

\d+
$*

Tekli'ye dönüştür.

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

Listede dizin.

,

Listeyi topla.

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

İstenen değeri 10000 ile çarpın ve önce toplamın yarısını ekleyerek yuvarlama ile toplamı bölün.

+`^..?$
0$&

Sonucun en az üç hane içerdiğinden emin olun.

..$
.$&

Son ikinci konuma bir ondalık ayırıcı ekleyin.



1

Perl 6 , 21 bayt

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

Çevrimiçi deneyin!

Basit çözüm, çünkü $bparametre endeksli olan curried parametreleri kullanamıyorum . Bunun rotateyerine işlevi kullanarak iki parametreyi işlemek zorunda olmayan daha eğlenceli bir çözüm :

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

Çevrimiçi deneyin!

Ama maalesef iki bayt daha uzun



1

MathGolf , 7 6 bayt

§\Σ/♀*

0 tabanlı indeksleme.

Çevrimiçi deneyin.

Açıklama:

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

Simge , 53 bayt

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

Çevrimiçi deneyin!

Buradaki tek ilginç şey toplamı bulmak. Icon , jeneratör sahibi olan ilk dillerden biriydi. biriken !tüm liste değerlerini oluşturur . Normalde yazmak zorundayız , ancak ben var olmayan değişkenin olup olmadığını kontrol eden ve olmayan bir sonraki değeri listeden tüketene kadar çıkartan geri izleme kullandım .Lsevery s+:=!L&\zznon-null



1

Toplu, 111 bayt

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

Girdiyi dizin ve liste olarak komut satırı bağımsız değişkenleri olarak alır. Not: Sadece gelen endeks değerleri için çalışır 1üzere 9nedeniyle Toplu sınırlamalarına; ilk 10 öğeyi dizine ekleyebilecek 0 dizinli bir sürüm yazılabilir. Açıklama:

@shift

Dizini %0ve listeyi %1... %9(veya daha az) olarak değiştirin. Ancak Toplu işlerin shiftetkilemediğini unutmayın %*.

@set s=%*

Boşluğa ayrılmış tüm parametreleri alın.

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

Boşlukları +s olarak değiştirin ve aritmetik olarak değerlendirin, böylece toplamı alın, ancak dizini çıkarın. Sonra listeye dizin ekleyin, 10000 ile çarpın, toplamın yarısını ekleyin ve toplamla bölün. Son olarak ondalık basamakları oluşturmak için divmod'u iki kez 10 gerçekleştirin. ( %Aritmetik işleç, Toplu işte özel bir anlama sahiptir ve normalde iki callkatına çıkarılması gerekir , ancak daha sonra bir iki katına çıkarılması gerekir.)

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

Sonucu ve ondalık basamakları çıktılar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.