Eşkenar dörtgen dizisi


11

Büyüyen eşkenar dörtgen unsurlarını saydığınızı düşünün [1],[1,3,1],[1,3,5,3,1],…(sadece tek sayıları güzel hizalanacak şekilde). Bu aşağıdaki gibi görünecektir, her zaman numaralandırmaya başladığınızı unutmayın 1:

                   01
       1        02 03 04
 1   2 3 4   05 06 07 08 09          …
       5        10 11 12
                   13
(1) (1,3,1)    (1,3,5,3,1)    (1,3,5,7,5,3,1)   …

Şimdi sütunları ( [1],[2],[1,3,5],[4],[5],[2,6,10],…) toplamaya başlarsanız eşkenar dörtgen dizisini alırsınız . Bunlar bahsedilen dizinin ilk 100 elementidir:

1,2,9,4,5,18,35,24,9,10,33,60,91,70,45,16,17,54,95,140,189,154,115,72,25,26,81,140,203,270,341,288,231,170,105,36,37,114,195,280,369,462,559,484,405,322,235,144,49,50,153,260,371,486,605,728,855,754,649,540,427,310,189,64,65,198,335,476,621,770,923,1080,1241,1110,975,836,693,546,395,240,81,82,249,420,595,774,957,1144,1335,1530,1729,1564,1395,1222,1045,864,679,490,297,100

IO

Bu üç giriş / çıkış yönteminden birini seçmekte özgürsünüz (geçersiz girişleri işlemenize gerek yoktur):

  • Bir tamsayıdır verilen n çıkış n bu sırayla inci elemanı (0- ya da 1-endeksli, tercih)
  • Bir tamsayı n çıkışı ilk önce bu dizinin n elemanı verildiğinde
  • Diziyi belirsiz bir şekilde yazdırın / döndürün

testcases

Lütfen yukarıdaki ilk 100 terime bakın, bazı büyük örnekler (1 dizinli):

101 -> 101
443 -> 1329
1000 -> 49000    
1984 -> 164672
2017 -> 34289
2018 -> 30270
3000 -> 153000

Yanıtlar:


3

Kardan adam , 72 bayt

((}1vn2nD#`nPnCdU!*2nM1`nR:#nSNaB#`nS2nMNdE;aM|#NdE2nP+#`nSNdE`|aA#nM*))

Bu, 1 indeksli girişi alan ve permavar aracılığıyla karşılık gelen çıkışı döndüren bir alt rutindir +.

Çevrimiçi deneyin!

((        // begin subroutine
 }        // we'll only need 3 variables - b, e, g
 1vn2nD   // b = 0.5
 #`       // retrieve input and swap, now b = input and e = 0.5
 nP       // power, resulting in b=sqrt(input)
 nC       // ceiling - this gives the index i of the rhombus we want
 dU!*     // keep a copy of i in the permavar ! for later use
 2nM1`nR  // generate the range [1, 2i)
 :        // map the following block over the range...
  #nS     // subtract i, resulting in e.g. [-3 -2 -1 0 1 2 3] for i=4
  NaB     // absolute value - [3 2 1 0 1 2 3]
  #`nS    // subtract from i, giving [1 2 3 4 3 2 1]
  2nMNdE  // double and decrement, [1 3 5 7 5 3 1]
 ;aM      // map
 |        // shove the rhombus columns into g
 #NdE2nP  // b = (i-2)^2
 +#`      // move b into e and replace it with the original input
 nSNdE    // subtract the two and decrement, giving input-(i-2)^2-1
 `|aA     // this is the index into the rhombus columns that we want
 #nM*     // multiply by the original input and return
))

Bu temelde Bay Xcoder'ın cevabı ile aynı algoritmayı kullanıyor - tek fark burada sadece ihtiyacımız olan eşkenar dörtgen sütunları (tavan (sqrt (n))) oluşturmamız. Bunun neden işe yaradığını göstermek için, her eşkenar dörtgene karşılık gelen girdiler şunlardır:

rhombus #   inputs
1           1
2           2 3 4
3           5 6 7 8 9
4           10 11 12 13 14 15 16
...

Sol sütunun tam olarak sağ sütundaki her bir öğenin kare kökünün tavanına karşılık geldiğine dikkat edin. 1 tabanlı dizini buradan almak için önceki rhombus dizininin karesini çıkarırız.


2

Jöle , 10 bayt

Ḥ€€’ŒBFị@×

Çevrimiçi deneyin!

Dönen tam bir program / monadik bağlantı olarak N inci terimi (1 endeksli).

Her toplamın, sütunların genel listesindeki (girişin kendisi) ilgili sütunun dizini, karşılık gelen Rhombus'ta bu sütunun diziniyle çarpıldığını fark ettim, bu yüzden gerçekten satırları oluşturmaya gerek yok.

Nasıl?

Ḥ €€ 'ŒBFị @ × ~ Tam program. N girişini arayacağım.

  € ~ [1, N] aralığındaki her bir tamsayı X için.
[€ ~ [1, X] aralığındaki her tamsayıyı iki katına çıkarın.
   '~ Azalma (çıkarma 1).
    ~B ~ Sıçrama (eleman olarak). Her birini palindromize edin.
      F ~ Düzleştirin.
       ~ @ ~ Listemizdeki N dizinindeki elemanı alın.
         × ~ N ile çarp.


2

JavaScript (ES7), 42 41 bayt

@Ovs sayesinde 1 bayt kaydedildi

0 endeksli. A004737'den türetilmiş kapalı biçimli bir ifade .

n=>((k=n**.5|0)-Math.abs(n+k*~k))*2*++n+n

Test senaryoları


2

Befunge, 62 60 bayt

&:1>:00p:*`|
00:-\*:g00:<>2-\-0v!`\g
*.@v+1<g00:<^*2g00_2*1+

Çevrimiçi deneyin!

açıklama

Yürütme yolları vurgulanmış kaynak kodu

*Biz , stdin'den tek temelli eleman numarasını ( n) okuyarak ve bir kopyayı kaydederek başlarız .
*Sonra hangi rhombus içinde olduğumuzu, bir tamsayı sayarak belirleriz, r , kadar r*r >= n.
*Eşkenar dörtgenin sağ tarafından sütun kayması, c , 'dir r*r - n.
*Bu ofseti merkez eksenin etrafına yansıtmak için, olup olmadığını kontrol ederiz c >= r.
*Ve eğer öyleyse, yansıyan c olur r*2 - 2 - c.
*Yansıyan c'ye ulaştığımızda , sütunun toplamı basitçe olur (c*2 + 1) * n.



1

Jöle , 8 bayt

_.ạ²€ṂḤ×

Çevrimiçi deneyin!

Nasıl çalışır

_.ạ²€ṂḤ×  Main link. Argument: n

_.        Subtract 0.5; yield (n - 0.5).
   ²€     Square each; yield [1², 2², ..., n²].
  ạ       Take the absolute differences of (n - 0.5) and each of the squares.
     Ṃ    Take the minimum.
      Ḥ   Unhalve; double the minimum.
       ×  Multiply the result by n.
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.