serin başlıksız dizi şey


19

F n (k) 'yi , her sayının n kez tekrarlandığı doğal sayıların [1, ∞) ilk k terimlerinin toplamı olarak tanımlayalım .

k       | 0    1    2    3    4    5    6    7    8    9
--------+-------------------------------------------------
f_1(k)  | 0    1    3    6    10   15   21   28   36   45
deltas  |   +1   +2   +3   +4   +5   +6   +7   +8   +9
--------+-------------------------------------------------
f_2(k)  | 0    1    2    4    6    9    12   16   20   25
deltas  |   +1   +1   +2   +2   +3   +3   +4   +4   +5
--------+-------------------------------------------------
f_3(k)  | 0    1    2    3    5    7    9    12   15   18
deltas  |   +1   +1   +1   +2   +2   +2   +3   +3   +3

Bunun bir kare dizi olarak anti-diyagonalleri OEIS dizisi A134546'ya benzer .

Meydan okuma

Negatif olmayan iki n ve k tamsayısını alan ve f n (k) çıkışları alan bir program / işlev yazın .

Özellikler

  • Standart I / O kuralları geçerlidir .
  • Standart boşluklar vardır yasak .
  • Çözümünüz n ve / veya k için 0 veya 1 dizinli olabilir, ancak lütfen hangisini belirtin.
  • Bu zorluk tüm dillerde en kısa yaklaşımı bulmak değil, her dilde en kısa yaklaşımı bulmakla ilgilidir .
  • Kodunuz bayt olarak puanlanacak , aksi belirtilmedikçe, genellikle UTF-8 kodlamasında .
  • Bu diziyi hesaplayan yerleşik işlevlere izin verilir, ancak yerleşik bir teknolojiye dayanmayan bir çözüm dahil edilmesi önerilir.
  • "Pratik" diller için bile açıklamalar teşvik edilmektedir .

Test senaryoları

Bu test örneklerinde n , 1-indekslenir ve k , 0-indekslenir.

n   k      fn(k)

1   2      3
2   11     36
11  14     17
14  21     28
21  24     27
24  31     38
31  0      0

Birkaç iyi biçimde:

1 2
2 11
11 14
14 21
21 24
24 31
31 0

1, 2
2, 11
11, 14
14, 21
21, 24
24, 31
31, 0

Referans uygulaması

Bu Haskell'de yazılmıştır .

f n k = sum $ take k $ replicate n =<< [1..]

Çevrimiçi deneyin!

Bu zorluk korumalı alandaydı.


Düzenlememin biçimlendirmeyi geliştirdiğini mi düşünüyorsunuz yoksa sadece tarayıcımda mı?
user202729

@ user202729 Heh ... tarayıcımda görünüyor ama formatımın çoğu tarayıcıda iyi göründüğünden şüpheliyim ... Sadece böyle tutacağım, hiçbir anlamı kaybetmez. Sadece tuhaf görünüyor. : P
totallyhuman

Biz olaya el gerekir mi f_n(0) = 0için kendeksli 0?
Cinaski

9
" serin başlıksız şey thingy " Lol, gördüğüm diziler için isimlerle gelen zor zamanlar yaşayan tek kişi ben değilim;;)
Kevin Cruijssen

3
@Fabian Hayır, ilk kterimleri değil, yalnızca tekrarlanan doğal sayılar listesindeki ilk terimleri toplarsınız n*k.
Martin Ender

Yanıtlar:


12

Yakut , 32 28 23 bayt

->n,k{k.step(0,-n).sum}

Çevrimiçi deneyin!

açıklama

Toplamı bir üçgenin alanı olarak görelim, örneğin n = 3 ve k = 10 ile:

*
*
*
**
**
**
***
***
***
****

Sonra satır yerine sütuna göre toplanır: ilk sütun k, daha sonra k-n, k-2nvb.


8

Python 2 , 34 28 bayt

lambda n,k:(k+k%n)*(k/n+1)/2

Çevrimiçi deneyin!

Martin Ender, Neil ve Bay Xcoder'a yardım ettikleri için teşekkürler.


1
k/nZaten aslında ihtiyacın yok - k-(k/n)*nsadece k%n. Toplu yanıtımı görün.
Neil


Teşekkürler. Bu kadar basit olabileceğini düşünmemiştim.
GB

8

Kabuk , 4 bayt

Σ↑ṘN

Çevrimiçi deneyin!

açıklama

Bu sadece meydan okumada referans uygulamasının doğrudan bir çevirisi olur:

   N  Start from the infinite sequence of all natural numbers.
  Ṙ   Replicate each element n times.
 ↑    Take the first k values.
Σ     Sum them.




5

Jöle , 5 bayt

Rxḣ³S

@ Mr.Xcoder'ın Jelly çözümünden bir bayt daha ama bu benim Jelly'deki ilk sunumum ve hala Jelly'in tutukluğunun operandları nasıl seçtiği konusunda kafam karıştı, bu yüzden hala memnunum. Girişlerin sırası Not ksonra n.

açıklama

Rxḣ³S
R           Range: [1,2,...,k]
 x          Times: repeat each element n times: [1,1,1,2,2,2,...,n,n,n]
  ḣ³        Head: take the first k elements. ³ returns the first argument.
    S       Sum

Çevrimiçi deneyin!



4

JavaScript (ES6),  24  21 bayt

Körili sözdiziminde girdi alır (n)(k). Yerine falsedöner0 .

n=>g=k=>k>0&&k+g(k-n)

Test senaryoları

Nasıl?

n =>             // main unamed function taking n
  g = k =>       // g = recursive function taking k
    k > 0 &&     // if k is strictly positive:
      k +        //   add k to the final result
      g(k - n)   //   subtract n from k and do a recursive call

Bu @ GB'nin Ruby cevabına benzer .

Zorluk, 'merdivenin' soldan sağa nasıl oluşturulacağını açıklarken, bu özyinelemeli işlev onu aşağıdan yukarıya doğru inşa eder. İle n = 2 ve k = 11 :

staircase


3

Toplu, 34 bayt

@cmd/cset/a(%2+%2%%%1)*(%2/%1+1)/2

Bulduğum kapalı formülü. İlk bağımsız değişken n1 dizinli, ikinci bağımsız değişken k0 dizinli.



3

Haskell , 28 bayt

n#k|m<-k`mod`n=sum[m,m+n..k]

Çevrimiçi deneyin!

Sadece bazı aralık parametreleriyle uğraşarak bulduğum bir yaklaşım. Kesinlikle en kısa değil ama çok farklı yaklaşımların olması çok güzel.



3

R , 37 33 31 bayt

Giuseppe sayesinde -6 bayt

function(n,k)sum(rep(1:k,,k,n))

Çevrimiçi deneyin!

Hiçbir şey fantezi. Kolları durumda k = 0.[0:k]


1
Burada parantezlerden kurtulabilirsiniz. Eğer sıralı argümanları kullanırsanız rep.default, [0:k]kullanarak kurtulabilirsiniz, rep(1:k,,k,n)ama sonra cevabınız temelde rturnbull's ama yerine R tabanıylaR + pryr
Giuseppe

1
Diş tellerinden hala kurtulabilirsiniz! {}
Giuseppe

[0: k] oyuncu değişikliği beni yakaladı ve parantezleri unuttum :)
NofP

2

C ++, 53 bayt

Sadece formülü kullanın. n1 dizinli ve k0 dizinlidir.

[](int n,int k){return k/n*(k/n+1)/2*n+k%n*(k/n+1);};

Çevrimiçi deneyin!


~Operatörü kötüye kullanarak birkaç bayt kaydedin . [](int n,int k){return-k/n*~(k/n)/2*n-k%n*~(k/n);};
ceilingcat

2

J , 13 bayt

1#.]{.(#1+i.)

Nasıl çalışır:

Sol argüman n, sağ argüman k.

i. bir liste oluşturur 0..k-1

1+ listenin her numarasına bir tane ekler, 1, 2, ..., k

# yukarıdakilerle bir kanca oluşturur, bu nedenle listenin her bir öğesinin n kopyası kopyalanır.

]{. ilkini al

1#. baz dönüşüm yoluyla toplamlarını bulabilirsiniz.

Çevrimiçi deneyin!


Kancayı seviyorum.
cole

2

Retina , 29 26 bayt

\d+
$*
(?=.*?(1+)$)\1
$'
1

Çevrimiçi deneyin! Bağlantı, test senaryolarını ve bunları tercih edilen girdisine yeniden biçimlendirmek için başlığı içerir ( kilk önce 0 dizinli , 1 dizinli nikinci). @ GB'nin Ruby cevabından ilham aldım. Açıklama:

\d+
$*

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

(?=.*?(1+)$)\1
$'

nİçindeki her dizeyi keşleştirin ve maçı maçtan sonraki her şeyle değiştirin. Bu k-n, k-2n, k-3nama nsen olsun da maçtan sonra, bu yüzden k,k-n , k-2nvb Bu aynı zamanda maçları n, basitçe (artık ihtiyaç duyulan) yok oluşunda.

1

Sonuçları toplayın ve ondalık sayıya dönüştürün.



2

Perl 6 , 39 bayt

->\n,\k{(0,{|($_+1 xx n)}...*)[^k].sum}

Dene

n ve k'nin ikisi de 1 tabanlıdır

Expanded:

-> \n, \k { # pointy block lambda with two parameters 「n」 and 「k」

  ( # generate the sequence

    0,         # seed the sequence (this is why 「k」 is 1-based)

    {          # bare block lambda with implicit parameter 「$_」
      |(       # slip this into outer sequence
        $_ + 1 # the next number
        xx n   # repeated 「n」 times (this is why 「n」 is 1-based)
      )
    }

    ...        # keep doing that until

    *          # never stop

  )[ ^k ]      # get the first 「k」 values from the sequence
  .sum         # sum them
}



1

05AB1E , 9 bayt

FL`}){I£O

Çevrimiçi deneyin!

açıklama

F           # n times do
 L`         # pop top of stack (initially k), push 1 ... topOfStack
   }        # end loop
    )       # wrap stack in a list
     {      # sort the list
      I£    # take the first k elements
        O   # sum



1

Clojure, 54 bayt

#(nth(reductions +(for[i(rest(range))j(range %)]i))%2)

2. bağımsız değişken k0 dizinli, (f 14 20)28 eşittir.


1

APL + WIN, 13 bayt

+/⎕↑(⍳n)/⍳n←⎕

N ve sonra k için ekran girişi istenir. Endeks kaynağı = 1.



1

Japt , 7 6 bayt

Başlangıçta GB'nin çözümünden ilham aldı ve bir limana dönüştü!

Alır kilk girdi olarak ve nikinci olarak.

õ1Vn)x

Dene


açıklama

Örtük tamsayı girişi U=k& V=n. Tamsayı dizisi (oluşturma õden) 1için Ubir aşama ile Vetkisiz ( n) ve ilave azaltmak ( x).


1

R , 27 bayt

Bu sırayı alan kve anonim işlev n. Her elemanın kezini tekrarlayan (dördüncü argüman ), üzerinden (ilk argüman ) oluşan bir uzunluk listesi k(üçüncü argüman ) oluşturur. Sonra bu listenin toplamını alır.rep1krepnrep

n1 dizinli ve k0 dizinlidir. İçin bir hata döndürür n<1.

pryr::f(sum(rep(1:k,,k,n)))

Çevrimiçi deneyin!


1

Befunge, 27 Bayt

&::00p&:10p%+00g10g/1+*2/.@

Çevrimiçi Deneyin

Girdi olarak k sonra n'yi alır. GB'nin cevabını matematiksel temeli olarak kullanır.

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.