Bei einer Eingabe einer einzelnen positiven Ganzzahl wird die dieser Ganzzahl entsprechende "alternierende Quersumme" ausgegeben.
Nehmen Sie das Beispiel der Eingabe n=5
. Um die alternierende Quersumme zu finden, erstellen Sie zunächst ein quadratisches Gitter mit Breite und Höhe n
, das von links nach rechts und von oben nach unten beginnt 1
und sich an jeder Position um eins erhöht:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
Nehmen Sie dann die Summen aus dem Raster, die ein "Kreuz" bilden (dh beide Diagonalen kombiniert):
1 5
7 9
13
17 19
21 25
1 5 7 9 13 17 19 21 25
Schließlich nehmen Sie die alternierende Summe dieser Sequenz:
1+5-7+9-13+17-19+21-25
-11
Ein weiteres Beispiel für n=6
(um nur zu zeigen, wie das Kreuz für gerade Zahlen aussieht n
):
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30
31 32 33 34 35 36
1 6
8 11
15 16
21 22
26 29
31 36
1+6-8+11-15+16-21+22-26+29-31+36
20
Da es sich um Code-Golf , wird der kürzeste Code in Bytes gewinnen.
Hier sind die richtigen Ausgaben für n=1
to n=100
, die Sie als Testfälle verwenden können:
1
4
-3
10
-11
20
-23
34
-39
52
-59
74
-83
100
-111
130
-143
164
-179
202
-219
244
-263
290
-311
340
-363
394
-419
452
-479
514
-543
580
-611
650
-683
724
-759
802
-839
884
-923
970
-1011
1060
-1103
1154
-1199
1252
-1299
1354
-1403
1460
-1511
1570
-1623
1684
-1739
1802
-1859
1924
-1983
2050
-2111
2180
-2243
2314
-2379
2452
-2519
2594
-2663
2740
-2811
2890
-2963
3044
-3119
3202
-3279
3364
-3443
3530
-3611
3700
-3783
3874
-3959
4052
-4139
4234
-4323
4420
-4511
4610
-4703
4804
-4899
5002
Antworten:
Jelly,
211911107 BytesProbieren Sie es online!
Idee
Nehmen Sie für eine Sekunde an, dass der erste Term der Endsumme nicht addiert, sondern subtrahiert wird.
Sei n eine positive ganze Zahl.
Auch Fall
Die Unterschiede zwischen den diagonalen Elementen in der unteren Hälfte der Reihen sind die ersten n od 2 ungeraden natürlichen Zahlen. Da 1 + 3 + 5 +… + (2k + 1) = k 2 , summieren sie sich zu (n ≤ 2) 2 = n 2 ≤ 4 .
In diesem Beispiel
Somit ist die Summe 2 × n 2 ≤ 4 = n 2 ≤ 2 .
Seltsamer Fall
Die Unterschiede zwischen den diagonalen Elementen in den entsprechenden Zeilen von oben und unten (
1
und5
und21
und25
;7
und9
und17
und19
) sind gleich, sodass sie sich in der alternierenden Summe ausgleichen.In diesem Beispiel
Alles, was übrig bleibt, ist das Negativ des zentralen Elements, das das arithmetische Mittel der ersten und letzten Zahl ist, sodass es berechnet werden kann als - (n 2 + 1) ÷ 2 .
Allgemeiner Fall
Da ~ x = - (x + 1) für Zweierkomplement-Ganzzahlen ( ~ bedeutet bitweise NICHT), kann die Formel für den ungeraden Fall als ~ n 2 ÷ 2 umgeschrieben werden .
Da der erste Term ( 1 ) der ursprünglichen Summe addiert statt subtrahiert wird, hinterlassen die obigen Formeln einen Fehler von 2 , der korrigiert werden muss.
Daher ist die n- te alternierende Quersumme n 2 ≤ 2 + 2, wenn n gerade ist, und ~ n 2 ≤ 2 + 2, wenn sie ungerade ist.
Schließlich ist bitweises NICHT eine Involution, dh ~~ x = x für alle x . Auf diese Weise ist ~~~ x = ~ x , ~~~~ x = x , und im Allgemeinen ist ~ n x (was bedeutet, dass ~ n- mal angewendet wird) x, wenn n gerade ist, und ~ x, wenn es ungerade ist.
Daher können wir unsere allgemeine Formel für alle positiven ganzen Zahlen n als ~ n n 2 ÷ 2 + 2 umschreiben .
Code
quelle
JavaScript,
403822 BytesDie Verwendung dieser neuen, ausgefallenen Lösung in geschlossener Form ist der letzte Schrei!
Dank ThomasKwa kann ich meine teure rekursive Funktion eliminieren.
quelle
(n%2?3-n*n:4+n*n)/2
Gelee, 12 Bytes
Probieren Sie es hier aus .
quelle
CJam, 13
15BytesZwei Bytes weniger dank Dennis.
Probieren Sie es online!
quelle
2%{~}&
durch werden{~}*
zwei Bytes gespeichert.Minkolang 0.15 ,
261513 BytesIch benutze Dennis 'verrückten Algorithmus und habe dank ihm zwei weitere Bytes abgespielt. Dieser Typ ist für die Halbierung der Byteanzahl verantwortlich!
Probieren Sie es hier aus!
Erläuterung
Siehe Dennis 'Antwort für die Erklärung, warum das funktioniert. In einem Kommentar zu dieser Antwort schlug er eine weitere Verbesserung vor, die funktioniert, weil
:
es sich um eine Ganzzahldivision handelt, sodass ich die Spitze des Stapels negieren und mir keine Sorgen um die +1 machen kann, wenn ich das binäre Komplement mache. Außerdem haben n und n ^ 2 die gleiche Parität, so dass kein Swap erforderlich ist.quelle
GolfScript, 12 Bytes
Dies verwendet den Algorithmus aus meiner Gelee-Antwort . Probieren Sie es online!
Wie es funktioniert
quelle
ES7, 17 Bytes
Einfacher Port von @ Dennis's Python 2 Antwort.
Während ich diese Antwort schrieb, schaffte ich es auch, meinen ES6-Port auf 17 Bytes zu golfen!
quelle
MATL , 13
27BytesMit Dennis 'tollen Formeln:
Probieren Sie es online!
Direkter Ansatz ( 27 Bytes ):
quelle
Pure Bash, 28
Nun, da @Dennis uns alle gezeigt hat, wie das geht, muss Folgendes aktualisiert werden:
Vorherige Antwort:
Bash + GNU-Dienstprogramme, 77
Hier ist ein Anfang:
N wird als Befehlszeilenparameter übergeben.
paste
ist hier wirklich praktisch, um die Wechselsumme zu erzeugen. Die-d
Option erlaubt eine Liste von Trennzeichen, die zyklisch verwendet werden.quelle
$[-1**$1*$1*$1+4>>1]
ist noch kürzer.Julia,
4140251916 BytesDies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu.
Der Ansatz, den Dennis hier entwickelt hat, ist folgender. Zuerst erhalten wir die Parität von n , dh n (mod 2) und negieren sie. Dies ergibt 0 für gerade Eingaben und -1 für ungerade. Wir haben dann bitweise XOR mit n 2 . Wenn n gerade ist, ist dies nur n 2, da XOR mit 0 nur die Zahl ist. Wenn n ungerade ist, entspricht XOR mit -1 der bitweisen Negation. An diesem Punkt haben wir entweder n 2 oder das bitweise NICHT von n 2 . Wir teilen dies durch 2 und addieren 2, um das Ergebnis zu erhalten.
Dank Sp3000 in einer früheren Version ein Byte und dank Dennis in dieser Version 9 Byte gespart!
quelle
Jolf, 13 Bytes
Probieren Sie es hier aus!
quelle
Python 2, 24 Bytes
Dies verwendet den Algorithmus von meiner Gelee-Antwort mit einer geringfügigen Änderung:
Anstatt
~
n- mal anzuwenden, wenden wir-
n- mal an (durch Multiplizieren mit (-1) n ). Dies ist äquivalent, da in Python ~ x = -x - 1 und Ganzzahlunterteilung sind, also ~ x / 2 = (-x - 1) / 2 = -x / 2 .quelle
Pyth, 11 Bytes
Probieren Sie es online in der Pyth-Compiler .
Wie es funktioniert
Dies verwendet den Algorithmus aus meiner Gelee-Antwort mit einer geringfügigen Änderung:
Anstatt
~
n- mal anzuwenden, wenden wir-
n- mal an (durch Multiplizieren mit (-1) n ). Dies ist äquivalent, da in Pyth ~ x = -x - 1 und Ganzzahlunterteilung sind, also ~ x / 2 = (-x - 1) / 2 = -x / 2 .quelle
dc, 17
Mit der gleichen bewährten Formel von Dennis:
Probieren Sie es online ausOh, warum enthält die Ideone-Bash-Sandbox nichtdc
?Befehlszeilentest:
quelle
?2^1+2~2*1-*2+p
spart zwei Bytes.GS2, 9 Bytes
Dies verwendet den Algorithmus aus meiner Gelee-Antwort . Probieren Sie es online!
ist ebenfalls kurz, enthält jedoch keine Nicht-ASCII-Zeichen.
Wie es funktioniert
quelle
J, 16 Bytes
Dies verwendet den gleichen Algorithmus wie meine Gelee-Antwort. Testen Sie es mit J.js .
quelle
Lua, 33 Bytes ( Online testen )
Wie es funktioniert:
quelle
Dyalog APL, 13 Bytes
Dies verwendet den gleichen Algorithmus wie meine Gelee-Antwort. Testen Sie es auf TryAPL .
quelle