pengantar
Aron Nimzowitsch adalah seorang pemimpin catur terkemuka dan penulis catur yang berpengaruh.
Dalam bukunya 'My System', bab pertama membahas tentang pentingnya pusat dan mengapa Anda harus mendominasinya. Alasan sederhananya adalah bahwa karya Anda memiliki gerakan langsung berikutnya yang lebih mungkin ketika berada di tengah yang lagi memberi pemain lebih banyak kekuatan.
Ini menjadi sangat jelas ketika melihat posisi ksatria yang berbeda dan potensi pergerakan selanjutnya (ditunjukkan dengan warna merah muda) di papan kosong:
Objektif
Mengevaluasi jumlah gerakan langsung potensial berikutnya dari seorang kesatria pada papan kosong berdasarkan posisinya.
Spesifikasi Input
Posisi ksatria.
Pertama x (kolom) dan kemudian y (baris). 0 0
adalah sudut kiri bawah.
Untuk mempermudah, saya mengubah label papan catur menjadi angka saja. Untuk contoh dan kasus uji kami, kami menggunakan indeks berbasis 0, namun Anda bebas untuk menggunakan indeks berbasis 1.
Anda dapat menggunakan semua jenis format input yang mungkin, array, argumen fungsi, dll.
Spesifikasi Keluaran
Jumlah langkah potensial langsung berikutnya untuk seorang ksatria di papan kosong.
Uji Kasus
3 4 => 8
4 6 => 6
7 7 => 2
1 0 => 3
Kasus uji menggunakan indeks berbasis 0. Kotak nilai penuh adalah:
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2
Jawaban:
Python 2 , 35 byte
Cobalah online!
Python 2 , 39 byte
Cobalah online!
Mengambil input yang diindeks 0.
Ekspresi
x*(7-x)/5
membawa nilai koordinat0..7
ke(
min(x,7-x,2)
melakukan hal yang sama, tetapi lebih lama.) Menjumlahkan ini untukx
dany
memberikan pola yang benar tetapi dengan angka yang salah(Lihat solusi Neil untuk alasan yang lebih baik mengapa ini memberi tentang pola yang tepat.)
Akhirnya, pemetaan
a -> 50/(8-a)-4
dengan pembagian lantai memberikan nilai yang tepatAlternatif solusi yang sama panjangnya dengan input 1-diindeks:
sumber
(7-a)*a/5
lebih pendek 3 byte darimin(a,7-a,2)
.*l
sebenarnya biaya Anda satu byte secara keseluruhan,lambda a,b:"23468"[(7-a)*a/5+(7-b)*b/5]
hanya 41 byte.x*(9-x)/6
, satu-diindeks.<strike>
seperti orang lain untuk menunjukkan perkembangan golf?MATL ,
17141312 byteTerima kasih kepada @Neil selama 1 byte!
Input berbasis 1.
Cobalah online!
Penjelasan
Ini menghitung jarak Euclidean dari input ke masing-masing posisi 64 di papan catur, dan menemukan berapa banyak dari nilai-nilai itu yang sama dengan akar kuadrat dari 5.
Karena koordinat adalah nilai integer, kita dapat yakin bahwa dua nilai floating-point yang mewakili akar kuadrat dari 5 (yang dihitung dari koordinat dan yang dihitung secara langsung) memang sama.
sumber
double
. Ant itu menyimpan byteMathematica
6343 byteDengan 20 byte disimpan berkat saran dari Martin Ender!
Di atas ditemukan jumlah kotak yang berjarak 1 hop dari sel yang diberikan pada grafik tur ksatria lengkap.
g=KnightTourGraph[8,8,VertexLabels->"Name",Axes->True]
menampilkan grafik tur knight lengkap, dengan nama dan koordinat titik. Perhatikan bahwa Mathematica default ke pengindeksan berbasis satu untuk koordinat.
#+1+8#2&[r,f]
konversi mengembalikan titik yang sesuai dengan kuadrat di peringkat (baris)r
,, dan file (kolom)f
,, menggunakan nilai-nilai berbasis nol sebagai input.Misalnya
#+1+8#2&[2,1]
mengembalikan 11.EdgeCount
memberikan jumlah tepi pada grafik lingkungan.Tepi untuk peringkat 2, file 1 (persegi 11):
Tepi yang disorot:
Metode 2: Jarak Euclidean
70 byte
Metode ini lebih panjang, tetapi mungkin menarik. Pendekatannya adalah memeriksa jarak Euclidean antara pusat papan catur dan sel yang diminati.
Contoh
2
8
Untuk membantu memvisualisasikan bagaimana jarak dari pusat papan catur cukup untuk menetapkan nilai.
Lingkaran [{4.5, 4.5}, 4],
Lingkaran [{4.5, 4.5}, 4.6], Ratakan [f / @ {2, 3, 4, 6, 8}, 1]}, Sumbu -> True, AxesOrigin -> {-1, -1}]
Angka 2.2, 3, 4, dan 4.6 adalah jari-jari lingkaran.
sumber
KnightTourGraph
Mathematica dan bawaannya ... :-)#
di akhir kode sumber Anda (tepat sebelum]
). Anda harus dapat menggunakanIncidenceList
bukanEdgeList@NeighborhoodGraph
sekalipun. (Atau, ada jugaEdgeCount
, tapi saya pikir itu berakhir lebih lama.)EdgeCount[8~KnightTourGraph~8,#+1+8#2<->_]&
EdgeCount
sangat keren!JavaScript (ES6), 38 byte
Mengambil input yang diindeks 0. Penjelasan: Lihatlah kuadrat jarak ke pusat:
Jumlah kotak yang dapat dijangkau jatuh ke dalam lima pita:
Saya sebenarnya menghitung 24.5 - (3.5 - x) ** 2 - (3.5 - y) ** 2 = (7 - x) * x + (7 - y) * y karena ini perhitungan yang lebih pendek, tetapi yang dilakukannya hanyalah membalikkan urutan band.
sumber
x*(7-x)
sebagai hanya operasi yang terlihat seperti busur ke bawah0..7
dan kebetulan kurva cocok, tetapi ini menjelaskan mengapa itu menghasilkan pola yang bagus ketika dijumlahkan untukx
dany
.Jelly, 10 byte
1-diindeks. Membawa argumen tunggal dari formulir
[x,y]
. Coba di sini.Dennis menyimpan satu byte!
sumber
Mathematica,
4440 byteSaat ini saya punya tiga solusi pada jumlah byte yang sama:
Semua itu adalah fungsi yang tidak disebutkan namanya yang mengambil pasangan koordinat seperti
{3, 4}
, yang berbasis 1.Saya mencoba membuat formula yang agak eksplisit. Pola umum di seluruh papan terlihat seperti ini:
Nilai aktual dari warna tersebut (dari yang paling terang ke yang paling gelap) adalah
2, 3, 4, 6, 8
. Itu adalah:Kami pertama-tama mengeksploitasi simetri dengan menggeser asal ke pusat, mengambil nilai absolut dan mengurangi hasilnya
4
. Ini memberi kita koordinat0.5
untuk3.5
meningkat dari setiap sudut. Untuk membuat koordinat pusat sama, kita perlu memetakan0.5
dan1.5
untuk nilai yang berbeda2.5
dan3.5
ke nilai yang sama. Ini mudah dilakukan dengan mengalikan dengan0.8
(memberi{0.4, 1.2, 2., 2.8}
) dan memberi dasar pada hasilnya. Jadi sekarang kita punya{0, 1, 2, 2}
jarak dari pusat. Jika kami menambahkan koordinat di setiap sel, kami mendapatkan tabel ini:Ini memiliki nilai unik untuk semua hasil yang mungkin berbeda, jadi kami cukup menggunakannya sebagai indeks
2[3,4,6,8]
.Pada versi kedua kami menggunakan plafon sebagai ganti lantai. Dengan cara ini
2
,,3
dan4
sudah benar, tetapi kami mendapatkan5
dan6
bukannya6
dan8
, jadi kami memperbaikinya secara manual dengan aturan substitusi.Akhirnya, dalam versi ketiga, kami memperluas
5
dan6
ke atas ke6
dan8
melalui eksponensial, diikuti oleh operasi lantai lain.sumber
APL, 21 karakter
Dalam Bahasa Inggris:
(⍳8 8)
: 8x8 peringkat-2 array yang berisi koordinat semua sel;+/¨×⍨(⍳8 8)-⊂⍵
: kuadrat dari jarak euclidean sel yang diberikan sehubungan dengan setiap sel di papan;5=
: matriks 0/1, di mana 1s muncul pada jarak kuadrat sama dengan 5;+/,
: jumlah matriks yang diratakanTes (asal 1):
Dalam bentuk ini:
argumen kiri dapat menentukan dimensi papan. Maka
8 8 f
akan bekerja untuk papan catur persegi standar. Tetapi pada papan yang lebih besar dan persegi panjang, kotak uji akan memberikan hasil yang berbeda. Misalnya, pada papan 12x10:sumber
≢⍸5=+/¨×⍨-∘⎕¨⍳8 8
Cobalah online!Java -
160150 byteTidak Disatukan:
Kode ungolfed identik kecuali untuk mengubah batas-batas loop for untuk menghemat 4 byte. Bekerja dengan mengulangi setiap gerakan yang dimungkinkan dan melakukan pemeriksaan batas (> 0 dan <8). Menggunakan fakta bahwa offset adalah (1, 2), (2, 1), (-1, 2), (-2, 1), dll. Dan dapat memeriksa 2 gerakan untuk setiap nilai i dan j.
Sunting: 10 byte disimpan berkat saran dari Leaky Nun dan u902383.
sumber
int m=0,i=-1,j;
untuk menyimpan beberapa byteC, 44 Bytes
Tapi ini lebih baik:
sumber
;
. Tidak akan dikompilasi.Haskell,
4948 bytesumber
[0..7]
ke variabel selama 1 byte.Java, 81 karakter (113 byte)
Encode seluruh tabel hasil sebagai tabel unicode dan kemudian dapatkan byte yang tepat melakukan operasi bitwise.
Anda dapat melihatnya online di sini: https://ideone.com/K9BojC
sumber
Python, 94 byte
Menggunakan 1 pengindeksan berbasis.
Demo di https://repl.it/C6gV .
sumber
Pyth -
3315 byteTerima kasih kepada @LeakyNun untuk mengurangi ukuran saya hingga setengahnya.
Mengatur ulang peta dan
V
mungkin akan sedikit golf.Test Suite .
sumber
APL (Dyalog Unicode) , 15 byte SBCS
Cobalah online!
sumber
J , 23 bytes
Cobalah online!
Penghormatan kepada metode Lynn, dikonversi ke J
sumber
Sebenarnya, 18 byte
Cobalah online!
Ini mengimplementasikan rumus yang sama bahwa banyak jawaban yang lain telah menggunakan:
50/(8-x*(7-x)//5+y*(7-y))//5)-4
. Input diambil sebagai daftar:[x,y]
(atau literal iterable dengan Python, suka(x,y)
ataux,y
).Penjelasan:
sumber
Perl 6 , 44 byte
Cobalah online!
sumber