Erst spiralförmig, dann diagonal

8

nKonstruieren Sie bei einer positiven Eingangszahl eine Zahlenspirale von 1bis n^2, wobei sich 1oben links im Uhrzeigersinn eine Spirale nach innen dreht. Nehmen Sie die Summe der Diagonalen (wenn nungerade, wird die mittlere Zahl n^2zweimal gezählt) und geben Sie diese Zahl aus.

Beispiel für n = 1:

1

(1) + (1) = 2

Beispiel für n = 2:

1 2
4 3

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

Beispiel für 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

Beispiel für 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

Weitere Regeln und Klarstellungen

  • Dies ist OEIS A059924, und auf dieser Seite finden Sie einige geschlossene Lösungen.
  • Es kann davon ausgegangen werden, dass die Eingabe und Ausgabe in den nativen Integer-Typ Ihrer Sprache passt.
  • Die Eingabe und Ausgabe kann in jedem geeigneten Format erfolgen .
  • Sie können für Ihre Einreichung entweder 0-Index oder 1-Index wählen, wie ich hier in meinen Beispielen bin. Bitte geben Sie an, was Sie tun.
  • Entweder ein vollständiges Programm oder eine Funktion sind akzeptabel. Wenn es sich um eine Funktion handelt, können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
  • Wenn möglich, fügen Sie bitte einen Link zu einer Online-Testumgebung hinzu, damit andere Personen Ihren Code ausprobieren können!
  • Standardlücken sind verboten.
  • Dies ist daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Bytes) gewinnt.
AdmBorkBork
quelle

Antworten:

21

R , 43 34 Bytes

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

Probieren Sie es online aus!

Auf der OEIS-Seite wird die folgende Formel aufgeführt für a(n):

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

Ich habe dies jedoch direkt übersprungen, um zum Abschnitt PROG zu gelangen, in dem der folgende PARI-Code gefunden wird:

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

Dies +3-3*(-1^n)ist natürlich dasselbe, +6damit wir die verknüpfte Formel vereinfachen können, indem wir sie zunächst auf reduzieren

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

und Verwenden einer %/%ganzzahligen Division, anstatt /die Notwendigkeit zu beseitigen floor.

Giuseppe
quelle
1
+3-3*(-1)^nist nicht wirklich dasselbe wie 6, obwohl der Unterschied in der Ganzzahldivision verloren geht.
Fergusq
@fergusq Sie haben Recht, aber die Formel, die als Ausdruck in PARI angegeben ist (auf die ich meine Lösung stütze) +3-3*(-1^n), ist dieselbe wie +6. Ich werde meine Antwort aktualisieren, um dies deutlicher zu machen.
Giuseppe
@ Giuseppe Es ist, +6wenn nes seltsam ist, aber +0wann gerade nist
Bergi
3
@Bergi 3-3*(-1^n)ist immer 6aber 3-3*(-1)^nhat dieses abwechselnde Verhalten. Die ursprüngliche Formel hat die letztere, was die Verwendung der Ganzzahldivision unnötig macht, da sie immer durch 12 teilbar ist
Giuseppe
1
Ah richtig. Es ist allerdings seltsam, dass der ursprüngliche Autor dies übersehen hat, nicht wahr?
Bergi
5

Python 2 , 30 Bytes

Durch Portierung von Giuseppes Ansatz wurden einige Bytes gespeichert .

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

Probieren Sie es online aus!

Python 2 ,  36  34 Bytes

Gespeichert einige mehr Bytes dank @LeakyNun .

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

Probieren Sie es online aus!

Mr. Xcoder
quelle
1
36 Bytes
Leaky Nun
34 Bytes
Leaky Nun
@LeakyNun Danke und Danke.
Herr Xcoder
2
30 Bytes Credits an Giuseppe für die Annäherung
Leaky Nun
@LeakyNun Ich habe auch damit aktualisiert
Mr. Xcoder
3

Mathematica, 19 Bytes

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

Sie können es mit der folgenden Syntax ausführen:

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

Wo 5kann durch die Eingabe ersetzt werden.

Sie können es in der Wolfram-Sandbox ausprobieren (Kopieren, Einfügen + Zellen auswerten).

Mr. Xcoder
quelle
3

Mathematica, 19 Bytes

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

Probieren Sie es online aus!

Durch Portierung von Giuseppes Ansatz wurden einige Bytes gespeichert.

Mathematica, 58 Bytes

Ich genieße immer Fragen mit gegebenen Antworten danke an oeis (für die nette Frage und Antwort)

LinearRecurrence[{3,-2,-2,3,-1},{0,2,10,34,80},2#][[#+1]]&
J42161217
quelle
Wäre es nicht Golfspieler, die geschlossene Form zu verwenden?
Undichte Nonne
1
Viele Antworten verwenden meine Vereinfachung, also können Sie auch das Gleiche tun
Giuseppe
1

Cubix , 33 Bytes

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

Probieren Sie es online aus!

Würfelversion:

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

Implementiert den gleichen Algorithmus wie meine R-Antwort . Ich vermute, das kann man runtergolfen.

Giuseppe
quelle
1

Excel, 35 30 Bytes

5 Bytes mit Giuseppes Ansatz gespeichert .

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

Erster Versuch:

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

Entwickelt aus einer direkten Implementierung der Formel aus OEIS (37 Bytes):

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

+3-3*(-1)^A1Logik kann in geändert werden 6*MOD(A1,2).

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

Speichert keine Bytes, ermöglicht jedoch das Entfernen eines gemeinsamen Faktors für 2 Bytes.

Wernisch
quelle
1

05AB1E ,  13  12 Bytes

Verwendet die gleiche Basiskonvertierungstechnik wie Leaky Nun's Jelly Submission

Vielleicht gibt es einen kürzeren Weg, um die Liste der Koeffizienten zu erstellen

-1 Byte dank Datboi (benutze Leerzeichen und Wrap, um die Komprimierung zu übertreffen (!))

8 3(4 3)¹β6÷

Probieren Sie es online aus!

Wie?

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

Meine 13er ...

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

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

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

Alle verwenden Komprimierungen, um die Liste der Koeffizienten zu finden.

Jonathan Allan
quelle
8 3(4 3)¹β6÷um 1 Byte zu
sichern
0

MATL , 12 Bytes

[DcKI]6/iZQk

Probieren Sie es bei MATL Online aus!

Erläuterung

Gleicher Ansatz wie Giuseppes Antwort .

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