Berapa banyak Wazir yang dapat ditempatkan di Papan Catur N × N?


30

Misalkan bidak catur peri baru bernama Wazir diperkenalkan ke catur. Wazir dapat berpindah dari posisi ( x , y ) ke:
 ( x +1, y )
 ( x , y +1)
 ( x -1, y )
 ( x , y -1)

Artinya, mereka bergerak secara ortogonal seperti benteng, tetapi hanya selangkah demi selangkah seperti raja. Berapa banyak wazir yang dapat ditempatkan di papan catur N × N sehingga tidak ada dua wazir yang dapat saling menyerang?

 Pada papan 1 × 1, hanya ada 1 bagian seperti itu.
 Pada papan 2 × 2, bisa ada 2 buah seperti itu.
 Pada papan 3 × 3, bisa ada 5 buah seperti itu.

Dengan N, kembalikan jumlah wazir yang dapat ditempatkan di papan catur N × N.

Ini adalah urutan OEIS A000982 .

Lebih banyak kasus uji

725

832

1005000


4
Jadi unta adalah untuk benteng apa raja untuk ratu? Yaitu hanya bisa bergerak secara orthogonal, dan hanya satu langkah dalam satu waktu.
Adám

2
@ SashaR Bolehkah saya menulis ulang pertanyaan Anda sebagai tantangan golf kode yang tepat?
Adám

2
Yakin! Dengan begitu saya juga bisa melihat bagaimana cara menulis pertanyaan terkait pertanyaan di masa depan
Sasha R

15
Sebagai pengguna baru situs ini, Anda sangat beruntung saat ini. Banyak pertanyaan pemrograman (di luar topik) di situs ini telah ditutup dan diturunkan secara permanen, tidak diedit sebagai tantangan dan dibatalkan seperti ini. Seperti yang sudah dijelaskan orang lain, situs ini hanya untuk kompetisi pemrograman, bukan untuk meminta pekerjaan rumah. Anda dapat menggunakan kotak pasir (di codegolf.meta.stackexchange.com/questions/2140/… ) sebelum memposting tantangan untuk menghindari kesalahan umum di waktu berikutnya; dan perhatikan bahwa sebagian besar pengguna di situs ini, seperti yang telah Anda lihat, menggunakan bahasa "tidak dapat dibaca".
user202729

16
Pertanyaan ini cukup membingungkan karena Camel sudah menjadi nama catur peri standar untuk bidak seperti ksatria yang membuat lompatan lebih lama dan bidak yang Anda gambarkan sudah memiliki nama bidak peri: Wazir .
Mark S.

Jawaban:


33

Spasi , 45 byte

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

Cobalah online!

Ngomong-ngomong, ini adalah bukti bahwa rumus ⌈n² / 2⌉ benar.

  • Kami selalu dapat menempatkan setidaknya ⌈n² / 2⌉ wazir : hanya meletakkannya dalam pola kotak-kotak! Dengan asumsi ubin kiri atas berwarna putih, ada ubin putih ⌈n² / 2⌉ dan ⌊n² / 2⌋ ubin hitam di papan n × n . Dan jika kita menempatkan wazir di ubin putih, tidak ada dua dari mereka yang saling menyerang, karena setiap wazir hanya "melihat" ubin hitam.

    Inilah cara kami menempatkan 13 wazir di papan 5 × 5 (setiap W adalah wazir).

              13 wazir di papan 5 × 5

  • Kita tidak bisa melakukan yang lebih baik : mari kita sewenang-wenang mengotak-atik kotak-kotak dengan 2 × 1 kartu domino, secara opsional menggunakan potongan 1 × 1 untuk sudut terakhir papan catur yang panjangnya aneh, seperti:

              penutup domino papan 5 × 5

    Kami membutuhkan ⌈n² / 2⌉ domino untuk menutupi papan catur. Jelas, menempatkan dua wazir pada satu domino membuatnya sehingga mereka dapat saling menyerang! Jadi setiap domino hanya dapat memuat paling banyak satu wazir, artinya kita tidak mungkin menempatkan lebih dari ⌈n² / 2⌉ wazir di papan tulis.


Anda tidak memerlukan prinsip lubang pigeon untuk bagian terakhir: Anda memiliki ubin persis ⌈n² / 2⌉, dan paling banyak unta per ubin, sehingga Anda memiliki paling banyak unta ⌈n² / 2⌉.
ShreevatsaR

8
@ShreevatsaR Apa yang menjamin Anda bahwa Anda tidak dapat menempatkan x> ⌈n² / 2⌉ unta di ubin ⌈n² / 2⌉? Ini prinsip pigeonhole ...
frarugi87

2
Saya pikir pada awalnya kode tidak dimuat, jadi saya me-refresh halaman, dan masih tidak. Kemudian saya menyadari nama bahasa apa yang tertulis di bagian atas.
Arthur

7
Saya menghargai bahwa Anda pergi dan mengubah milik Anda Cmenjadi Wdalam ilustrasi bukti Anda.
Giuseppe

4
Saya juga menghargai bahwa W semua ada di WHITE SPACES dengan jawaban di WHITESPACE.
corsiKa



9

APL (Dyalog) , 9 7 6 byte

Sekarang gunakan formula Pak Xcoder.

Ini adalah fungsi tacit awalan anonim yang mengambil N sebagai argumen.

2÷⍨×⍨

Cobalah online!

×⍨ kuadrat N (selfie multiplikasi lit, yaitu kalikan sendiri)

2÷⍨ bagi dengan 2

 langit-langit (bulat)


Wow! Saya tidak tahu bagaimana Anda melakukan ini !! Tidak mendapatkan logika meskipun mendesah
Sasha R

Sial, seseorang sudah menemukan polanya.
Feathercrown

1
Huh, baru sadar rumusnya ada di halaman OEIS. Mungkin seharusnya tidak menghubungkannya.
Feathercrown


6

dc , 6 byte

2^2~+p

2^: kotak; 2~: bagi dengan 2, mendorong hasil bagi lalu sisanya; +p: tambahkan sisanya ke hasil bagi & cetak.

Cobalah online!




5

C (gcc) , 23 18 17 byte

  • Menyimpan satu byte berkat Tahg ; bermain golf n/2+n%2untuk n+1>>1.
f(n){n=n*n+1>>1;}

Cobalah online!

C (gcc) , 22 byte (tidak menggunakan perilaku tidak terdefinisi)

f(n){return n*n+1>>1;}

Cobalah online!

Beberapa orang benar-benar tidak suka mengeksploitasi bahavior compiler tertentu yang tidak ditentukan saat menggunakan flag compiler tertentu. Melakukan hal itu akan menghemat byte.


3
Cara aneh memberikan jawaban IMO, tetapi: f (n) {n = n * n + 1 >> 1;} untuk menyimpan byte.
Tahg

1
@ Ahg Terima kasih; meskipun dengan cara apa Anda menemukan cara saya memberikan jawaban yang aneh?
Jonathan Frech

2
Saya tidak berpikir mengubah argumen input adalah cara normal untuk mengembalikan nilai dalam C.
Tahg

2
@YSC Namun menurut pendapat kompiler itu dapat dimengerti dan menciptakan executable yang berfungsi.
Jonathan Frech

5
@YSC Kami percaya di sini di PPCG bahwa, jika program bekerja pada satu penerjemah, itu adalah pengiriman yang valid. Ini bekerja pada penerjemah online, oleh karena itu valid tanpa pernyataan lebih lanjut
Conor O'Brien


4

Python 3 , 19 byte

lambda x:-(-x*x//2)

Cobalah online!

lambda x:-(-x*x//2)  # Unnamed function
lambda x:            # Given input x:
            x*x      # Square
           -         # Negate
               //2   # Halve and Floor (equivalent of Ceil)
         -(       )  # Negate again (floor -> ceil)

-1 byte terima kasih kepada Tn. Xcoder


x**2->x*x
Mr. Xcoder

@ Mr.Xcoder Facepalm terima kasih
HyperNeutrino

Bagaimana dengan lambda x:x*x+1>>1?
Alix Eisenhardt

Atau lambda x:x*x+1//2 Penafian: Saya tidak tahu sintaks atau urutan operasi bahasa ini, jadi saya rasa; Saya katakan tambahkan 1 sebelum Anda //2 bukannya meniadakan dua kali.
Dan Henderson

@DanHenderson Anda masih membutuhkan tanda kurung jika tidak diuraikan sebagai (x*x) + (1//2), jadi itu sebenarnya tidak lebih pendek.
Skyler

4

bahasa mesin x86_64 (Linux), 9 8 byte

0:       97                      xchg   %eax,%edi
1:       f7 e8                   imul   %eax
3:       ff c0                   inc    %eax
5:       d1 f8                   sar    %eax
7:       c3                      retq

Untuk Mencoba secara online! , kompilasi dan jalankan program C berikut.

#include<stdio.h>
const char *f="\x97\xf7\xe8\xff\xc0\xd1\xf8\xc3";
int main() {
  for(int i=1; i<10; i++) {
    printf("%d\n", ((int(*)())f)(i));
  }
}

3

J , 8 byte

Fungsi awalan diam-diam anonim.

2>.@%~*:

Cobalah online!

*: kotak

>. plafon (bulat)
@ setelah
2... %~ membaginya dengan dua


Solusi alternatif: <.@-:@*:dan*:<.@%2:
Conor O'Brien

2
@ ConorO'Brien‽ 2>.@%~*:Dari mana saya mendapatkannya? Saya tidak bisa membacanya - sepertinya garis berisik bagi saya ...
Adám

>.@-:@*:mendapatkan suara saya.
Jonah

1
@Jonah Jika Anda menyipitkan mata, Anda dapat melihat unta.
Adám


3

R , 22 21 byte

cat((scan()^2+1)%/%2)

Cobalah online!

Kuadrat, kenaikan, bilangan bulat integer. Peasy mudah.

Masukan dari stdin; itu dapat mengambil input spasi atau baris baru dan itu akan menghitung max wazirs untuk setiap ukuran input board. Output ke stdout.

-1 byte berkat plannapus


@plannapus sudah diperbaiki, terima kasih.
Giuseppe






2

Cubix , 11 byte

Iu*:^\)2,O@

Heheh, :^\)

Cobalah online!

Perluas ke kubus berikut:

    I u
    * :
^ \ ) 2 , O @ .
. . . . . . . .
    . .
    . .

Algoritma yang sama yang banyak digunakan.

  • ^Iu : baca input sebagai int dan ubah arah
  • :* : dup atas tumpukan, gandakan
  • \) : ubah arah, kenaikan
  • 2, : push 2, bilangan bulat integer
  • O@ : cetak output sebagai int, end program.





1

Japt , 4 byte

Sudah duduk di sini sejak tantangan ditutup.

²Ä z

Cobalah

Penjelasan: Kotak, tambahkan 1, pembagian lantai dengan 2


Alternatif

²ÄÁ1

Cobalah

Penjelasan: Kotak, tambahkan 1, bit-shift ke kanan dengan 1.


1

Komentator , 19 byte

//{-//-}! {-#  -}<!

Cobalah online!

Siapa yang butuh bahasa golf? Saya punya bahasa yang membingungkan!

Versi tidak disatukan:

5//{-8}//{5-}
print(10!= 5)
x={-1,3,4} # Smiley :-}
print(5<!=10)*/ # Weird comparision.

Cobalah online!

Bagaimana cara kerjanya? Saya akan jelaskan, dengan input 5

//                         - Take input.                           Tape: [5 0 0]
  {-//-}!                  - Square the input.                     Tape: [25 0 0]
  {-                         - Move one along the tape
    //                       - Copy the input to the tape.         Tape: [5 5 0]
      -}                     - Move one back along the tape
        !                    - Take the product of the tape.       Tape: [25 5 0]
         <space>           - Increment the tape head.              Tape: [26 5 0]
                 {-#  -}<! - Halve the tape head (floor division). Tape: [13 2 0]
                 {-          - Move one along the tape
                   #         - Set the tape head to 2.             Tape: [26 2 0]
                      -}     - Move one back along the tape
                        <!   - Reduce the tape by floor division.  Tape: [13 2 0]

1

OCaml , 19 byte

let f n=(n*n+1)/2;;

Cobalah online!

Saya agak kecewa nama diubah dari "unta" menjadi "wazir" sebelum saya berhasil menulis ini, tapi saya pikir saya akan tetap mempostingnya.


1

TI-Basic, 7 byte

round(Ans²/2,0

Atau (8 byte):

int(Ans²/2+.5

-int(-.5Ans²juga berfungsi
Oki

@Oki Tentu saja. Saya hanya berharap mereka memiliki ceil(fungsi.
Timtech

1

/// , 35 byte

/I///,*/+,//+/I//**,/,A//*/A//,//,I

Cobalah online!

Mengambil input dalam simbol unary menggunakan *, dan output dalam simbol unary menggunakan A. Ini diizinkan untuk beberapa bahasa tertentu, termasuk /// ( meta )

Karena tidak ada cara untuk mengambil input di ///, input harus di-hardcode:

/I/«put input here»//,*/+,//+/I//**,/,A//*/A//,//,I

untuk input = 4.


Penjelasan: (sebelum membaca, Anda perlu tahu bahwa satu-satunya sintaks ///adalah /pattern/replacement/, yang menggantikan setiap kemunculan patternoleh replacement; dan \untuk melarikan diri; karakter lain dicetak ke output)

Untuk n=4:

/I/****//,*/+,//+/I//**,/,A//*/A//,//,I    Start program.
/I/****/                                   Replace all `I` in the program by the input.

/,*/+,//+/****//**,/,A//*/A//,//,****      Remaining part of the program.
/,*/+,/                                    Use the `,` as a scanner, scan through `*` after it and convert to `+`.
       /+/****//**,/,A//*/A//,//++++,      Note that only `*` in the second group is affected.
       /+/****/                            Replace all `+` (which is just created) by `n` asterisks (from the first `I` group)

/**,/,A//*/A//,//****************,         Now at the last of the program before the `,` there are `n²` asterisks.
/**,/,A/                                   Scan the `,` to the left to perform division by 2:
                                           replace each `**` by a `A` as the scanner `,` pass through.
/*/A//,//,AAAAAAAA                         Remaining program.
/*/A/                                      If there is any `*` remaining (if `n²` is odd), replace it with `A`.
     /,//                                  Remove the scanner `,`.
          AAAAAAAA                         Output the result.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.