Diberikan input dari integer positif tunggal, output "jumlah lintas-alternatif" yang sesuai dengan integer itu.
Ambil contoh input n=5
. Untuk menemukan jumlah lintas-alternatif, pertama-tama buat kisi persegi lebar dan tinggi n
yang, membaca dari kiri ke kanan dan atas ke bawah, dimulai dari 1
dan bertambah dengan satu posisi masing-masing:
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
Kemudian, ambil jumlah dari kisi-kisi yang membentuk "salib" (yaitu, kedua diagonal digabungkan):
1 5
7 9
13
17 19
21 25
1 5 7 9 13 17 19 21 25
Akhirnya, ambil jumlah bolak-balik dari urutan ini:
1+5-7+9-13+17-19+21-25
-11
Contoh lain, untuk n=6
(hanya untuk menunjukkan seperti apa bentuk salib untuk nomor genap 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
Karena ini adalah kode-golf , kode terpendek dalam byte akan menang.
Berikut adalah output yang benar untuk n=1
ke n=100
, yang dapat Anda gunakan sebagai uji kasus:
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
Jawaban:
Jelly,
211911107 byteCobalah online!
Ide
Asumsikan untuk sesaat bahwa istilah pertama dari jumlah akhir dikurangi daripada ditambahkan.
Biarkan n menjadi bilangan bulat positif.
Bahkan kasus
Perbedaan antara elemen-elemen diagonal pada bagian bawah dari baris adalah bilangan asli ganjil n ÷ 2 . Karena 1 + 3 + 5 +… + (2k + 1) = k 2 , mereka berjumlah (n ÷ 2) 2 = n 2 ÷ 4 .
Dalam contoh ini
Jadi, jumlahnya adalah 2 × n 2 ÷ 4 = n 2 ÷ 2 .
Kasus aneh
Perbedaan antara elemen diagonal pada baris yang sesuai dari atas dan bawah (
1
dan5
, dan21
dan25
;7
dan9
,17
dan19
) adalah sama, sehingga mereka akan membatalkan dalam jumlah bolak-balik.Dalam contoh ini
Yang tersisa adalah negatif dari elemen pusat, yang merupakan rata-rata aritmatika dari angka pertama dan terakhir, sehingga dapat dihitung sebagai - (n 2 + 1) ÷ 2 .
Kasus umum
Karena ~ x = - (x + 1) untuk integer komplemen dua ( ~ menunjukkan bitwise TIDAK), rumus untuk kasus aneh dapat ditulis ulang sebagai ~ n 2 ÷ 2 .
Juga, karena suku pertama ( 1 ) dari jumlah asli ditambahkan bukannya dikurangi, rumus di atas meninggalkan kesalahan 2 , yang harus diperbaiki.
Oleh karena itu, penjumlahan silang ke - n adalah n 2 ÷ 2 + 2 jika n adalah genap, dan ~ n 2 ÷ 2 + 2 jika ganjil.
Akhirnya, bitwise TIDAK adalah involusi, yaitu, ~~ x = x untuk semua x . Dengan cara ini ~~~ x = ~ x , ~~~~ x = x , dan, secara umum, ~ n x (artinya ~ diterapkan n kali) adalah x jika n adalah genap dan ~ x jika ganjil.
Dengan demikian, kita dapat menulis ulang rumus umum kita sebagai ~ n n 2 ÷ 2 + 2 untuk semua bilangan bulat positif n .
Kode
sumber
JavaScript,
403822 byteMenggunakan solusi bentuk tertutup baru-ketinggalan jaman, mewah itu saja kemarahan!
Berkat ThomasKwa, saya bisa menghilangkan fungsi rekursif saya yang mahal.
sumber
(n%2?3-n*n:4+n*n)/2
Jelly, 12 byte
Coba di sini .
sumber
CJam, 13
15byteDua byte off berkat Dennis.
Cobalah online!
sumber
2%{~}&
dengan{~}*
menghemat dua byte.Minkolang 0,15 ,
261513 byteMenggunakan algoritma gila Dennis, dan bermain golf dua byte lagi berkat dia. Orang itu bertanggung jawab untuk mengurangi separuh jumlah byte!
Coba di sini!
Penjelasan
Lihat jawaban Dennis untuk penjelasan mengapa itu berhasil. Dalam komentar pada jawaban ini, ia menyarankan perbaikan lain yang berfungsi karena
:
adalah divisi integer, jadi saya bisa meniadakan bagian atas tumpukan dan tidak khawatir tentang +1 dari melakukan komplemen biner. Selanjutnya, n dan n ^ 2 memiliki paritas yang sama, yang menghilangkan kebutuhan untuk swap.sumber
GolfScript, 12 byte
Ini menggunakan algoritma dari jawaban Jelly saya . Cobalah online!
Bagaimana itu bekerja
sumber
ES7, 17 byte
Port sederhana jawaban @ Dennis's Python 2.
Saat menulis jawaban ini saya berhasil golf port ES6 saya hingga 17 byte juga!
sumber
MATL , 13
27byteMenggunakan formula luar biasa Dennis:
Cobalah online!
Pendekatan langsung ( 27 byte ):
sumber
Pure Bash, 28
Nah, sekarang @Dennis telah menunjukkan kepada kita semua cara melakukan ini, ini perlu diperbarui:
Jawaban sebelumnya:
Utilitas Bash + GNU, 77
Inilah awalnya:
N dilewatkan sebagai parameter baris perintah.
paste
sangat berguna di sini untuk menghasilkan jumlah bolak-balik. The-d
pilihan memungkinkan daftar karakter pemisah, yang digunakan siklis.sumber
$[-1**$1*$1*$1+4>>1]
bahkan lebih pendek.Julia,
4140251916 byteIni adalah fungsi anonim yang menerima integer dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel.
Pendekatan di sini, dirancang oleh Dennis, adalah sebagai berikut. Pertama kita mendapatkan paritas n , yaitu n (mod 2), dan meniadakannya. Ini memberi kita 0 untuk input genap dan -1 untuk ganjil. Kami kemudian bitwise XOR dengan n 2 . Ketika n adalah genap, ini hanya n 2 karena XOR dengan 0 hanyalah angka. Ketika n ganjil, XOR dengan -1 sama dengan negasi bitwise. Jadi pada titik ini kita memiliki n 2 atau bitwise BUKAN dari n 2 . Kami integer membagi ini dengan 2 dan menambahkan 2 untuk mendapatkan hasilnya.
Menyimpan satu byte berkat Sp3000 pada versi sebelumnya, dan menyimpan 9 berkat Dennis yang satu ini!
sumber
Jolf, 13 byte
Coba di sini!
sumber
Python 2, 24 byte
Ini menggunakan algoritma dari jawaban Jelly saya , dengan sedikit modifikasi:
Alih-alih menerapkan
~
n kali, kami menerapkan-
n kali (dengan mengalikan dengan (-1) n ). Ini setara karena ~ x = -x - 1 dan lantai pembagian bilangan bulat dengan Python, jadi ~ x / 2 = (-x - 1) / 2 = -x / 2 .sumber
Pyth, 11 byte
Cobalah online di Pyth Compiler .
Bagaimana itu bekerja
Ini menggunakan algoritma dari jawaban Jelly saya , dengan sedikit modifikasi:
Alih-alih menerapkan
~
n kali, kami menerapkan-
n kali (dengan mengalikan dengan (-1) n ). Ini setara karena ~ x = -x - 1 dan lantai pembagian bilangan bulat di Pyth, jadi ~ x / 2 = (-x - 1) / 2 = -x / 2 .sumber
dc, 17
Menggunakan rumus yang sama dicoba dan diuji dari Dennis:
Cobalah onlineOh, mengapa kotak pasir Ideone bash tidak termasukdc
?Tes baris perintah:
sumber
?2^1+2~2*1-*2+p
menghemat dua byte.GS2, 9 byte
Ini menggunakan algoritma dari jawaban Jelly saya . Cobalah online!
sama pendeknya, tetapi terutama tidak mengandung karakter non-ASCII.
Bagaimana itu bekerja
sumber
J, 16 byte
Ini menggunakan algoritma yang sama dengan jawaban Jelly saya. Mengujinya dengan J.js .
sumber
Lua, 33 byte ( Coba online )
Bagaimana itu bekerja:
sumber
Dyalog APL, 13 byte
Ini menggunakan algoritma yang sama dengan jawaban Jelly saya. Uji di TryAPL .
sumber