Bir N × N Satranç Tahtasında kaç tane Wazir yerleştirilebilir?


30

Diyelim ki Wazir adlı yeni bir satranç taşını satrançla tanıştır. Wazir'ler bir konumdan ( x , y ) şu noktalara hareket edebilir :
 ( x + 1, y )
 ( x , y + 1)
 ( x -1, y )
 ( x , y -1)

Yani, kale gibi ortogonal olarak hareket ederler, ama kral gibi bir anda sadece bir adım. Bir N × N satranç tahtasına bu tür kaç tane tel yerleştirilebilir, böylece hiçbir iki telsiz birbirlerine saldıramaz.

 1 × 1 tahtasında, sadece 1 adet parça olabilir.
 2 × 2 tahtasında, 2 adet olabilir.
 3 × 3'lük bir tahtanın üzerinde 5 adet parça olabilir.

Verilen N, N × N satranç tahtasına yerleştirilebilecek wazir sayısını döndürür.

Bu, OEIS dizisi A000982'dir .

Daha fazla test vakası

725

832

1005000


4
Yani Deve, Kralın Kraliçe'ye ne olduğunu Kale'ye mi götürüyor? Yani sadece dik olarak hareket edebilir ve bir seferde sadece bir adım.
Adám

2
@SashaR Sorunuzu doğru kod golf mücadelesi olarak yeniden yazabilir miyim?
Adám

2
Emin! Bu şekilde gelecekte kodlama ile ilgili soruları nasıl kelimelendireceğimi de görebiliyorum
Sasha R

15
Bu sitenin yeni bir kullanıcısı olarak, bu sefer çok şanslıydınız. Bu sitedeki pek çok (konu dışı) programlama sorusu kalıcı olarak kapatıldı ve reddedildi, meydan okuma olarak düzenlenmedi ve bunun gibi bir şey oylandı. Daha önce de açıklandığı gibi, bu site ödev istemek için değil, sadece yarışmaların programlanması içindir. Bir dahaki sefere sık karşılaşılan hatalardan kaçınmak için, sanal alanı ( codegolf.meta.stackexchange.com/questions/2140/… adresinde bulabilirsiniz ); ve bu sitedeki çoğu kullanıcının gördüğünüz gibi "okunamayan" dilleri kullandığını unutmayın.
user202729

16
Bu soru, Camel'in zaten daha uzun atlar yapan bir şövalye gibi bir parça için standart peri satranç adı olduğu ve zaten tanımladığınız parçanın bir peri satranç adı olduğu için kafa karıştırıcıdır : Wazir .
Mark S.

Yanıtlar:


33

Boşluk , 45 bayt

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

Çevrimiçi deneyin!

Bu arada, burada ²n² / 2⌉ formülünün doğru olduğuna dair bir kanıt.

  • Her zaman en az ²n² / 2⌉ wazir yerleştirebiliriz : sadece bir dama tahtası düzenine ! Sol üst karonun beyaz olduğu varsayımıyla, n × n üzerinde ²n² / 2⌉ beyaz fayans ve ²n² / 2⌋ siyah fayans vardır. panosunda . Ve beyaz fayansların üstüne teller koyarsak, her ikisi de sadece siyah fayansları “gördüğünde” hiçbiri birbirlerine saldırmıyor.

    İşte 5 x 5'lük bir tahtaya 13 wiradi yerleştiriyoruz (her W bir wazir).

              13 wazirs on a 5 × 5 board

  • Daha iyisini yapamayız : Dama tahtasını 2 × 1 domino parçalarıyla isteğe bağlı olarak döşeyelim, isteğe bağlı olarak tuhaf uzunlukta bir satranç tahtasının son köşesi için 1 × 1 parça kullanarak:

              domino cover of a 5 × 5 board

    Satranç tahtasını örtmek için ⌈n² / 2⌉ dominoya ihtiyacımız var. Açıkçası, iki domini bir dominoya koymak onu birbirlerine saldırabilmelerini sağlıyor! Böylece her domino en fazla bir tane wazir içerebilir, bu da muhtemelen tahtaya ⌈n² / 2⌉'den fazla wirir yerleştiremeyiz.


Son bölüm için güvercin deliği prensibine ihtiyacınız yoktur: tam olarak ⌈n² / 2⌉ fayansa ve karo başına en fazla deveye sahip olduğunuz için en fazla ²n² / 2⌉ deveye sahip olursunuz.
ShreevatsaR

8
@ShreevatsaR >n² / 2⌉ karolara x> ²n² / 2⌉ deve koyamazsınız ne sağlar? Bu güvercin deliği prensibi ...
frarugi87

2
İlk başta kodun yüklenmediğini düşünmüştüm, bu yüzden sayfayı yeniledim ve hala yüklemedi. Sonra hangi dilin adının üstüne yazıldığını anladım.
Arthur

7
Gittiğin ve kanıtlarını Caçıkladığın için değiştirdiğin için minnettarım W.
Giuseppe,

4
Ayrıca, W’lerin WHITESPACE’teki bir cevabı olan WHITE SPACES’de bulunduğunu takdir ediyorum.
corsiKa



9

APL (Dyalog) , 9 7 6 bayt

Şimdi Bay Xcoder'in formülünü kullanıyor.

Bu, N'yi argüman olarak alan adsız bir önek işlevidir.

2÷⍨×⍨

Çevrimiçi deneyin!

×⍨ kare N (lit. çarpma selfie, yani kendi kendine çarpma)

2÷⍨ 2'ye böl

 tavan (yuvarlak)


Vay! Bunu nasıl yaptın hiçbir fikrim yok !! iç çekerek
Sasha R

Kahretsin, birisi modeli zaten öğrendi.
Feathercrown

1
Huh, formülün OEIS sayfasında olduğunu henüz farkettim. Muhtemelen buna bağlanmamalıydı.
Feathercrown


6

dc , 6 bayt

2^2~+p

2^: kare; 2~: bölümü 2'ye bölün, kalan bölümü itip geri kalanı; +p: geri kalanı bölüme ekle ve yazdır.

Çevrimiçi deneyin!




5

C (gcc) , 23 18 17 bayt

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

Çevrimiçi deneyin!

C (gcc) , 22 bayt (tanımsız davranış kullanmıyor)

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

Çevrimiçi deneyin!

Bazı insanlar, belirli bir derleyicinin belirli bir derleyici bayrağı kullanırken tanımsız davranışını kullanmaktan gerçekten hoşlanmamaktadır. Bunu yapmak bayttan tasarruf sağlar.


3
Bir cevap IMO sağlamanın garip bir yolu, ancak: bir bayt kaydetmek için f (n) {n = n * n + 1 >> 1;}.
Tahg

1
@Tahg Teşekkürler; peki nasıl bir cevap tutabilirim yolunu buluyorsun?
Jonathan Frech

2
Girdi argümanını değiştirmenin C'ye bir değer döndürmenin normal bir yolu olduğunu
düşünmedim

2
@YSC Ancak derleyicinin görüşüne göre anlaşılabilir ve çalışan bir çalıştırılabilir oluşturur.
Jonathan Frech

5
@YSC PPCG'ye, programın bir tercüman üzerinde çalışması durumunda geçerli bir başvuru olduğuna inanıyoruz. Bir çevrimiçi tercüman üzerinde çalışır, bu nedenle başka bir açıklama yapmadan geçerlidir.
Conor O'Brien,


4

Python 3 , 19 bayt

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

Çevrimiçi deneyin!

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)

Bay Xcoder sayesinde -1 bayt


x**2->x*x
Bay Xcoder

@ Mr.Xcoder Facepalm teşekkürler
HyperNeutrino

Ne hakkında lambda x:x*x+1>>1?
Alix Eisenhardt 15

Veya lambda x:x*x+1//2 Feragatname: Bu dilin sözdizimini veya işlem sırasını bilmiyorum, bu yüzden tahmin ettim; //2 İki kere olumsuzlamak yerine
Dan Henderson,

@DanHenderson Yine de parantez gerekir, aksi halde ayrıştırılır (x*x) + (1//2), bu yüzden aslında kısa değildir.
Skyler

4

x86_64 makine dili (Linux), 9 8 bayt

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

İçin çevrimiçi deneyin! , aşağıdaki C programını derleyin ve çalıştırın.

#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 bayt

Anonim zımni önek işlevi.

2>.@%~*:

Çevrimiçi deneyin!

*: kare

>. tavandan
@ sonra (yuvarlak) sonra
2%~ ikiye bölerek


Alternatif çözümler: <.@-:@*:ve*:<.@%2:
Conor O'Brien

2
@ ConorO'Brien‽ 2>.@%~*:Bunu nereden aldım? Bunu okuyamıyorum - bana hat gürültüsü gibi görünüyor…
Adám

>.@-:@*:oyumu alır.
Jonah

1
@Jonah Eğer kısırsanız, bir deve görebilirsiniz.
Adám


3

R, 22 21 bytes

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

Try it online!

Square, increment, integer divide. Easy peasy.

Input from stdin; it can take space or newline separated input and it will compute the max wazirs for each input boardsize. Output to stdout.

-1 byte thanks to plannapus


@plannapus fixed, thank you.
Giuseppe






2

Cubix, 11 bytes

Iu*:^\)2,O@

Heheh, :^\)

Try it online!

Expands to the following cube:

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

Which is the same algorithm that many use.

  • ^Iu : read in input as int and change directions
  • :* : dup top of stack, multiply
  • \) : change direction, increment
  • 2, : push 2, integer divide
  • O@ : print output as int, end program.





1

Japt, 4 bytes

Been sitting on these since the challenge was closed.

²Ä z

Try it

Explanation: Square, add 1, floor divide by 2


Alternative

²ÄÁ1

Try it

Explanation: Square, add 1, bit-shift right by 1.


1

Commentator, 19 bytes

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

Try it online!

Who needs golfing languages? I've got confusing languages!

Ungolfed version:

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

Try it online!

How does it work? I'll explain, with 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 bytes

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

Try it online!

I'm a bit bummed the name got changed from "camels" to "wazirs" before I managed to write this, but I figured I'd post it anyway.


1

TI-Basic, 7 bytes

round(Ans²/2,0

Alternatively (8 bytes):

int(Ans²/2+.5

-int(-.5Ans² also works
Oki

@Oki It sure does. I just wish they had a ceil( function.
Timtech

1

///, 35 bytes

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

Try it online!

Takes input in unary using symbol *, and output in unary using symbol A. This is allowed for some specific languages, including /// (meta)

Because there is no way to take input in ///, input should be hardcoded:

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

for input = 4.


Explanation: (before reading, you need to know that the only syntax of /// are /pattern/replacement/, which replace every occurence of pattern by replacement; and \ for escaping; other characters is printed to output)

For 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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.