Biorąc pod uwagę jedną dodatnią liczbę całkowitą, wyślij „sumę alternatywną”, która odpowiada tej liczbie całkowitej.
Weź przykład z danych wejściowych n=5
. Aby znaleźć sumę alternatywną, najpierw utwórz kwadratową siatkę o szerokości i wysokości, n
która, czytając od lewej do prawej i od góry do dołu, zaczyna się 1
i zwiększa o jedną pozycję:
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
Następnie weź sumy z siatki, która tworzy „krzyż” (to znaczy oba przekątne połączone):
1 5
7 9
13
17 19
21 25
1 5 7 9 13 17 19 21 25
Na koniec weź na przemian sumę tej sekwencji:
1+5-7+9-13+17-19+21-25
-11
Kolejny przykład dla n=6
(aby pokazać, jak wygląda krzyż dla parzystych 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
Ponieważ jest to code-golf , wygra najkrótszy kod w bajtach.
Oto poprawne wyjścia do n=1
celu n=100
, który można wykorzystać jako przypadków testowych:
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
Odpowiedzi:
Galaretka,
211911107 bajtówWypróbuj online!
Pomysł
Załóżmy przez sekundę, że pierwszy składnik końcowej sumy jest odejmowany, a nie dodawany.
Niech n będzie dodatnią liczbą całkowitą.
Nawet skrzynka
Różnice między elementami ukośnymi w dolnej połowie rzędów są pierwszymi nieparzystymi liczbami naturalnymi n ÷ 2 . Ponieważ 1 + 3 + 5 +… + (2k + 1) = k 2 , sumują się do (n ÷ 2) 2 = n 2 ÷ 4 .
W tym przykładzie
Zatem suma wynosi 2 × n 2 ÷ 4 = n 2 ÷ 2 .
Dziwna sprawa
Różnice między elementami ukośnymi w odpowiednich rzędach od góry i od dołu (
1
i5
, i21
i25
oraz7
i9
i17
i19
) są takie same, więc zostaną skasowane na przemian.W tym przykładzie
Pozostaje tylko minus elementu centralnego, który jest średnią arytmetyczną pierwszej i ostatniej liczby, więc można go obliczyć jako - (n 2 + 1) ÷ 2 .
Ogólna sprawa
Ponieważ ~ x = - (x + 1) dla liczb całkowitych dopełniacza dwóch ( ~ oznacza bitowe NIE), wzór na przypadek nieparzysty można przepisać jako ~ n 2 ÷ 2 .
Ponadto, ponieważ pierwszy składnik ( 1 ) oryginalnej sumy jest dodawany zamiast odejmowany, powyższe formuły pozostawiają błąd 2 , który należy poprawić.
W związku z tym, n p przekrój alternatywnego sumie jest N 2 ÷ 2 + 2 , gdy n jest parzyste, i -n 2 ÷ 2 + 2 , jeśli jest nieparzysta.
Wreszcie bitowe NIE jest inwolucją, tj. ~~ x = x dla wszystkich x . W ten sposób ~~~ x = ~ x , ~~~~ x = x i, ogólnie rzecz biorąc, ~ n x (co oznacza, że ~ stosuje się n razy) to x, jeśli n jest parzyste, a ~ x, jeśli jest nieparzyste.
Zatem możemy przepisać naszą ogólną formułę jako ~ n n 2 ÷ 2 + 2 dla wszystkich liczb całkowitych dodatnich n .
Kod
źródło
JavaScript,
403822 bajtówKorzystając z tego nowatorskiego, fantazyjnego rozwiązania w formie zamkniętej, które jest wściekłe!
Dzięki ThomasKwa mogę wyeliminować moją kosztowną funkcję rekurencyjną.
źródło
(n%2?3-n*n:4+n*n)/2
Galaretka, 12 bajtów
Wypróbuj tutaj .
źródło
CJam, 13
15bajtówDwa bajty wyłączone dzięki Dennisowi.
Wypróbuj online!
źródło
2%{~}&
z{~}*
oszczędza dwa bajty.Minkolang 0,15 ,
261513 bajtówWykorzystując szalony algorytm Dennisa i dzięki niemu odjechał kolejne dwa bajty. Ten facet jest odpowiedzialny za zmniejszenie o połowę liczby bajtów!
Wypróbuj tutaj!
Wyjaśnienie
Zobacz odpowiedź Dennisa, aby wyjaśnić, dlaczego to działa. W komentarzu do tej odpowiedzi zasugerował kolejne ulepszenie, które działa, ponieważ
:
jest dzielenie liczb całkowitych, więc mogę negować szczyt stosu i nie martwić się o +1 z uzupełnieniem binarnym. Ponadto n i n ^ 2 mają tę samą parzystość, co eliminuje potrzebę wymiany.źródło
GolfScript, 12 bajtów
Wykorzystuje algorytm z mojej odpowiedzi Jelly . Wypróbuj online!
Jak to działa
źródło
ES7, 17 bajtów
Prosty port odpowiedzi @ Dennis na Python 2.
Pisząc tę odpowiedź, udało mi się też golfować mój port ES6 do 17 bajtów!
źródło
MATL , 13
27bajtówUżywając niesamowitych formuł Dennisa:
Wypróbuj online!
Bezpośrednie podejście ( 27 bajtów ):
źródło
Pure Bash, 28
Teraz, kiedy @Dennis pokazał nam, jak to zrobić, wymaga aktualizacji:
Poprzednia odpowiedź:
Narzędzia Bash + GNU, 77
Oto początek:
N jest przekazywany jako parametr wiersza polecenia.
paste
jest tu bardzo przydatny do tworzenia naprzemiennej sumy. Ta-d
opcja umożliwia listę znaków separatora, które są używane cyklicznie.źródło
$[-1**$1*$1*$1+4>>1]
jest jeszcze krótszy.Julia,
4140251916 bajtówJest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą. Aby go wywołać, przypisz go do zmiennej.
Podejście tutaj, opracowane przez Dennisa, jest następujące. Najpierw otrzymujemy parzystość n , tj. N (mod 2), i negujemy ją. To daje nam 0 dla parzystych danych wejściowych i -1 dla nieparzystych. Następnie bitowo XOR z n 2 . Kiedy n jest parzyste, jest to tylko n 2, ponieważ XOR z 0 jest tylko liczbą. Gdy n jest nieparzyste, XOR z -1 jest tym samym, co negacja bitowa. Więc w tym momencie albo n 2, albo bitowe NIE z n 2 . Liczbę całkowitą dzielimy przez 2 i dodajemy 2, aby uzyskać wynik.
Zapisałem bajt dzięki Sp3000 w poprzedniej wersji i zapisałem 9 dzięki Dennisowi na tym!
źródło
Jolf, 13 bajtów
Wypróbuj tutaj!
źródło
Python 2, 24 bajty
Wykorzystuje algorytm z mojej odpowiedzi Jelly , z niewielką modyfikacją:
Zamiast stosowania
~
n razy, stosujemy-
n razy (mnożąc przez (-1) n ). Jest to równoważne, ponieważ ~ x = -x - 1 i piętra dzielenia liczb całkowitych w Pythonie, więc ~ x / 2 = (-x - 1) / 2 = -x / 2 .źródło
Pyth, 11 bajtów
Wypróbuj online w kompilatorze Pyth .
Jak to działa
Wykorzystuje algorytm z mojej odpowiedzi Jelly , z niewielką modyfikacją:
Zamiast stosowania
~
n razy, stosujemy-
n razy (mnożąc przez (-1) n ). Jest to równoważne, ponieważ ~ x = -x - 1 i piętra dzielenia liczb całkowitych w Pyth, więc ~ x / 2 = (-x - 1) / 2 = -x / 2 .źródło
dc, 17
Używając tej samej wypróbowanej i przetestowanej formuły Dennis:
Wypróbuj onlineOch, dlaczego nie zawiera piaskownicy bash Ideonedc
?Test w wierszu poleceń:
źródło
?2^1+2~2*1-*2+p
oszczędza dwa bajty.GS2, 9 bajtów
Wykorzystuje algorytm z mojej odpowiedzi Jelly . Wypróbuj online!
jest równie krótki, ale w szczególności nie zawiera znaków spoza ASCII.
Jak to działa
źródło
J, 16 bajtów
Używa tego samego algorytmu, co moja odpowiedź Jelly. Przetestować go z J.js .
źródło
Lua, 33 bajty ( Wypróbuj online )
Jak to działa:
źródło
Dyalog APL, 13 bajtów
Używa tego samego algorytmu, co moja odpowiedź Jelly. Przetestuj na TryAPL .
źródło