Spiral pertama, lalu diagonal


8

Diberi nomor input positif n, buat spiral angka dari 1hingga n^2, dengan 1di kiri atas, berputar ke dalam searah jarum jam. Ambil jumlah diagonal (jika nganjil, angka tengah n^2dihitung dua kali) dan hasilkan angka itu.

Contoh untuk n = 1:

1

(1) + (1) = 2

Contoh untuk n = 2:

1 2
4 3

(1+3) + (4+2) = 4 + 6 = 10

Contoh untuk n = 4:

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

(1+13+15+7) + (10+16+14+4) = 36 + 44 = 80

Contoh dari n = 5:

 1  2  3  4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

(1+17+25+21+9) + (13+23+25+19+5) = 73 + 85 = 158

Aturan dan klarifikasi lebih lanjut

  • Ini adalah OEIS A059924 dan ada beberapa solusi bentuk tertutup pada halaman itu.
  • Input dan output dapat dianggap sesuai dengan tipe integer asli bahasa Anda.
  • Input dan output dapat diberikan dalam format apa pun yang nyaman .
  • Anda dapat memilih untuk 0-indeks atau 1-indeks, karena saya di sini dalam contoh saya, untuk pengiriman Anda. Silakan sebutkan yang Anda lakukan.
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online sehingga orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Jawaban:


21

R , 43 34 byte

function(n)(8*n^3-3*n^2+4*n+3)%/%6

Cobalah online!

The Oei halaman daftar rumus berikut untuk a(n):

(16*n^3 - 6*n^2 + 8*n + 3 - 3*(-1)^n)/12

Namun, saya melewatkan itu untuk sampai ke bagian PROG di mana kode PARI berikut ditemukan:

floor((16*n^3 - 6*n^2 + 8*n + 3 - 3*(-1^n))/12))

Secara alami, +3-3*(-1^n)adalah sama +6sehingga kita dapat menyederhanakan rumus yang ditautkan, pertama-tama dengan menguranginya menjadi

(16*n^3-6*n^2+8*n+6)/12 -> (8*n^3-3*n^2+4*n+3)/6

dan menggunakan %/%, pembagian integer, bukan /untuk menghilangkan kebutuhan floor.


1
+3-3*(-1)^ntidak benar-benar sama dengan 6, meskipun perbedaannya hilang dalam pembagian integer.
fergusq

@fergusq Anda benar, tetapi rumus yang diberikan sebagai ekspresi dalam PARI (yang menjadi dasar solusi saya) memiliki +3-3*(-1^n)yang sama dengan +6. Saya akan memperbarui jawaban saya untuk membuatnya lebih jelas.
Giuseppe

@Giuseppe Ini +6jika naneh, tapi +0ketika nbahkan
Bergi

3
@Bergi 3-3*(-1^n)selalu 6tetapi 3-3*(-1)^nmemiliki perilaku bergantian itu. Rumus asli memiliki yang terakhir, yang membuat penggunaan pembagian bilangan bulat tidak perlu, karena selalu dapat dibagi oleh 12
Giuseppe

1
Ah benar Aneh juga bahwa penulis asli mengabaikan ini, bukan?
Bergi

5

Python 2 , 30 byte

Menyimpan beberapa byte dengan porting pendekatan Giuseppe .

lambda n:((8*n-3)*n*n+4*n+3)/6

Cobalah online!

Python 2 ,  36  34 byte

Disimpan beberapa byte lagi berkat @LeakyNun .

lambda n:((8*n-3)*n*n+4*n+n%2*3)/6

Cobalah online!




@ LeakyNun Terima kasih dan terima kasih.
Tn. Xcoder

2
30 byte kredit untuk Giuseppe untuk pendekatan
Leaky Nun

@ LeakyNun Saya memperbarui dengan itu juga
Tn. Xcoder

3

Mathematica, 19 byte

((8#-3)#*#+4#+3)/6&

Anda dapat menjalankannya dengan sintaks berikut:

((8#-3)#*#+4#+3)/6&[5]

Di mana 5bisa diganti dengan input.

Anda dapat mencobanya di Wolfram Sandbox (Salin-Tempel + Sel Evaluasi)


3

Mathematica, 19 byte

((8#-3)#*#+4#+3)/6&

Cobalah online!

Menyimpan beberapa byte dengan porting pendekatan Giuseppe.

Mathematica, 58 byte

Saya selalu menikmati pertanyaan dengan jawaban yang diberikan thanx to oeis (untuk pertanyaan dan jawaban yang bagus)

LinearRecurrence[{3,-2,-2,3,-1},{0,2,10,34,80},2#][[#+1]]&

Bukankah lebih pegolf untuk menggunakan formulir tertutup?
Leaky Nun

1
banyak jawaban menggunakan penyederhanaan saya, jadi Anda dapat melakukan hal yang sama
Giuseppe



1

Cubix , 33 byte

I:u8**.../\*3t3n*3t+u@O,6+3+t3*4p

Cobalah online!

versi kubus:

      I : u
      8 * *
      . . .
/ \ * 3 t 3 n * 3 t + u
@ O , 6 + 3 + t 3 * 4 p
. . . . . . . . . . . .
      . . .
      . . .
      . . .

Implements algoritma yang sama seperti saya jawaban R . Saya menduga ini bisa diturunkan.




1

Excel, 35 30 byte

Disimpan 5 byte menggunakan pendekatan Giuseppe .

=INT((8*A1^3-3*A1^2+4*A1+3)/6)

Percobaan pertama:

=(8*A1^3-3*A1^2+4*A1+3*MOD(A1,2))/6

Berevolusi dari implementasi langsung formula dari OEIS (37 byte):

=(16*A1^3-6*A1^2+8*A1+3-3*(-1)^A1)/12

+3-3*(-1)^A1logika dapat diubah menjadi 6*MOD(A1,2).

=(16*A1^3-6*A1^2+8*A1+6*MOD(A1,2))/12

Tidak menyimpan byte, tetapi memungkinkan penghapusan faktor umum untuk 2 byte.


1

05AB1E ,  13  12 byte

Menggunakan teknik konversi basis yang sama dengan pengiriman Jelly Leaky Nun

Mungkin ada cara yang lebih pendek untuk membuat daftar koefisien

-1 byte berkat Datboi (gunakan spasi dan bungkus untuk mengalahkan kompresi (!))

8 3(4 3)¹β6÷

Cobalah online!

Bagaimana?

8 3(4 3)¹β6÷               stack: []
8            - literal            ['8']
  3          - literal            ['8','3']
   (         - negate             ['8',-3]
    4        - literal            ['8',-3,'4']
      3      - literal            ['8',-3,'4','3']
       )     - wrap               [['8',-3,'4','3']]
        ¹    - 1st input (e.g. 4) [['8',-3,'4','3'], 4]
         β   - base conversion    [483]
          6  - literal six        [483,6]
           ÷ - integer division   [80]
             - print TOS           80

13-an saya ...

•VŠ•S3(1ǝ¹β6÷

•2ùë•₂в3-¹β6÷

•мå•12в3-¹β6÷

Semua menggunakan kompresi untuk menemukan daftar koefisien.


8 3(4 3)¹β6÷untuk mengamankan 1 byte (meskipun tidak ada kompresi mewah)
Datboi




0

MATL , 12 byte

[DcKI]6/iZQk

Cobalah di MATL Online!

Penjelasan

Pendekatan yang sama dengan jawaban Giuseppe .

[DcKI]   % Push array [8, -3, 4, 3]
6/       % Divide each entry by 6
i        % Push input
ZQ       % Evaluate polynomial
k        % Round down. Implicitly display

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.