Urutan belah ketupat


11

Bayangkan enumerasi unsur-unsur rhombi yang tumbuh [1],[1,3,1],[1,3,5,3,1],…(hanya bilangan ganjil sedemikian sehingga mereka selaras dengan baik). Ini akan terlihat seperti berikut, perhatikan bahwa Anda selalu mulai menghitung dengan 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)   …

Sekarang jika Anda mulai menjumlahkan kolom ( [1],[2],[1,3,5],[4],[5],[2,6,10],…) Anda mendapatkan urutan belah ketupat . Ini adalah 100 elemen pertama dari urutan kata:

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

Anda bebas memilih salah satu dari tiga metode input / output ini (Anda tidak perlu menangani input yang tidak valid):

  • Diberikan bilangan bulat n output elemen ke- n dalam urutan itu (0- atau 1-diindeks, pilihan Anda)
  • Diberikan integer n output pertama n elemen dari urutan itu
  • Cetak / kembalikan urutan tanpa batas

Testcases

Silakan merujuk ke 100 syarat pertama di atas, berikut adalah beberapa contoh yang lebih besar (1-diindeks):

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

Jawaban:


3

Snowman , 72 byte

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

Ini adalah subrutin yang mengambil input 1-diindeks dan mengembalikan output yang sesuai melalui permavar +.

Cobalah online!

((        // 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
))

Ini pada dasarnya menggunakan algoritma yang sama dengan jawaban Tn. Xcoder — satu-satunya perbedaan adalah bahwa di sini kita hanya menghasilkan kolom belah ketupat yang kita butuhkan, yaitu ceil (sqrt (n)) yang pertama. Untuk mengilustrasikan mengapa ini berhasil, berikut adalah input yang sesuai dengan masing-masing belah ketupat:

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

Perhatikan bahwa kolom kiri sesuai persis dengan langit-langit akar kuadrat dari setiap elemen di kolom kanan. Untuk mendapatkan indeks berbasis 1 dari sini, cukup kurangi kuadrat dari indeks belah ketupat sebelumnya.


2

Jelly , 10 byte

Ḥ€€’ŒBFị@×

Cobalah online!

Program penuh / tautan monadik mengembalikan istilah N (1-diindeks).

Saya perhatikan bahwa setiap jumlah adalah indeks kolom itu dalam daftar keseluruhan kolom (input itu sendiri) dikalikan dengan indeks kolom itu di Belah Ketupat yang sesuai, jadi tidak perlu benar-benar menghasilkan baris.

Bagaimana?

Ḥ €€ 'ŒBFị @ × ~ Program lengkap. Saya akan memanggil input N.

  € ~ Untuk setiap bilangan bulat X dalam kisaran [1, N].
Ḥ € ~ Gandakan setiap integer dalam rentang [1, X].
   '~ Pengurangan (kurangi 1).
    ŒB ~ Bouncing (berdasarkan elemen). Palindromize masing-masing.
      F ~ Ratakan.
       ị @ ~ Dapatkan elemen pada indeks N dalam daftar kami.
         × ~ Kalikan dengan N.


2

JavaScript (ES7), 42 41 byte

Disimpan 1 byte berkat @ovs

Diindeks 0. Ekspresi bentuk tertutup yang berasal dari A004737 .

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

Uji kasus


2

Befunge, 62 60 byte

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

Cobalah online!

Penjelasan

Kode sumber dengan jalur eksekusi disorot

*Kita mulai dengan membaca nomor elemen berbasis satu, n , dari stdin, dan menyimpan duplikat.
*Kemudian kita menentukan belah ketupat tempat kita berada, dengan menghitung bilangan bulat, r , hingga r*r >= n.
*Kolom diimbangi dari sisi kanan belah ketupat, c , adalah r*r - n.
*Untuk mendapatkan offset yang dipantulkan di sekitar sumbu tengah, kami memeriksa apakah c >= r.
*Dan jika ya, maka c yang direfleksikan menjadi r*2 - 2 - c.
*Setelah kita memiliki c yang direfleksikan , jumlah kolomnya adalah sederhana (c*2 + 1) * n.



1

Jelly , 8 byte

_.ạ²€ṂḤ×

Cobalah online!

Bagaimana itu bekerja

_.ạ²€ṂḤ×  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.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.