Скільки вазирів можна розмістити на шаховій дошці N × N?


30

Припустимо, новий шаховий твір під назвою Вазір представлений у шахах. Вазири можуть переміщатися з положення ( x , y ) в:
 ( x +1, y )
 ( x , y +1)
 ( x -1, y )
 ( x , y -1)

Тобто вони рухаються ортогонально, як грак, але лише один крок за часом, як король. Скільки таких вазорів можна розмістити на шаховій дошці N × N, щоб жодна з двох тазових нападів не могла напасти один на одного?

 На дошці 1 × 1 може бути лише 1 такий шматок.
 На дошці 2 × 2 може бути 2 таких штуки.
 На дошці 3 × 3 може бути 5 таких штук.

Враховуючи N, поверніть кількість вазорів, які можна розмістити на шаховій дошці N × N.

Це послідовність OEIS A000982 .

Більше тестових випадків

725

832

1005000


4
Тож верблюд - до Ладдя, що король - королева? Тобто можна рухатися лише ортогонально і лише один крок за один раз.
Адам

2
@SashaR Чи можу я переписати ваше запитання як належне завдання для гольфу з кодом?
Адам

2
Звичайно! Таким чином я також можу побачити, як слова кодування пов'язаних питань у майбутньому
Саша R

15
Як новий користувач цього сайту, вам цього разу дуже пощастило. Дуже багато питань (програм, що не стосуються тематики) на цьому веб-сайті були назавжди закриті та неприйнятні, не відредаговані як виклик та схвалено, як цей. Як уже пояснювали інші, цей сайт призначений лише для змагань з програмування, а не для домашніх завдань. Ви можете використовувати пісочницю (на codegolf.meta.stackexchange.com/questions/2140/… ) перед тим, як опублікувати виклик, щоб уникнути поширених помилок наступного разу; і зауважте, що більшість користувачів цього сайту, як ви бачили, використовують "нечитабельні" мови.
користувач202729

16
Це запитання досить заплутане тим, що верблюд - це вже стандартне казкове шахове ім'я для твору, як лицар, який робить більш тривалі стрибки, а деталь, яку ви описуєте, вже має казкову назву шахів: Вазір .
Марк С.

Відповіді:


33

Пробіл , 45 байт

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

Спробуйте в Інтернеті!

До речі, ось доказ того, що формула ⌈n² / 2⌉ правильна.

  • Ми завжди можемо розмістити принаймні ⌈n² / 2⌉ вазони : просто викладіть їх у шаховому порядку! Якщо припустити, що ліворуч плитка біла, на плиті n × n є білі плитки ⌈n² / 2⌉ та чорні плитки ⌊n² / 2⌋ . І якщо ми розмістимо вазори на білій плитці, жодна з них не нападає один на одного, так як кожен вазір "бачить" чорну плитку.

    Ось як ми розміщуємо 13 вазонів на дошці 5 × 5 (кожен W - це вазір).

              13 вазонів на дошці 5 × 5

  • Ми не можемо зробити нічого кращого : давайте довільно плитку шахівницею розмірами 2 × 1 доміно, необов'язково використовуючи 1 × 1 шматок для остаточного куточка шахової дошки непарної довжини, наприклад:

              чохол доміно з дошки 5 × 5

    Для покриття шахової дошки нам потрібні доміно ⌈n² / 2⌉. Зрозуміло, що нанесення двох візорів на одне доміно дозволяє зробити це нападом один на одного! Таким чином , кожен доміно може містити тільки більш одного Вазір, тобто ми не можемо , можливо розмістити більш ⌈n² / 2⌉ вазирів на борту.


Для останньої частини вам не потрібен принцип голубого отвору: у вас рівно ⌈n² / 2⌉ плитки, і не більше верблюда на плитку, тож у вас є не більше ⌈n² / 2⌉ верблюдів.
ShreevatsaR

8
@ShreevatsaR Що гарантує вам, що ви не можете помістити x> ⌈n² / 2⌉ верблюдів у плитку ⌈n² / 2⌉? Це принцип
голуба

2
Спочатку я думав, що код не завантажується, тому я оновив сторінку, і вона все ще не стала. Тоді я зрозумів, яка назва мови написана вгорі.
Артур

7
Я розумію , що ви пішли і змінили ваш C's , щоб Wв твоєму доказі ілюстрації.
Джузеппе

4
Я також ціную, що всі W знаходяться на БІЛИХ ПРОСТОРЯХ з відповіддю в WHITESPACE.
corsiKa



9

APL (Діалог) , 9 7 6 байт

Тепер використовується формула містера Xcoder.

Це анонімна функція негласного префікса, яка бере аргумент N.

2÷⍨×⍨

Спробуйте в Інтернеті!

×⍨ квадрат N (selfie множення літ., тобто множення на себе)

2÷⍨ ділимо на 2

 стеля (заокруглення)


Нічого не знаю, як ти це зробив !! Не зрозумів логіки, хоч зітхаючи
Саша Р

Дарн, хтось уже з’ясував схему.
Feathercrown

1
Ага, щойно зрозумів, що формула знаходиться на сторінці OEIS. Напевно, це не повинно було пов'язати.
Feathercrown

7

JS (ES6) / C # поліглот, 11 байт

n=>n*n+1>>1

Тестові справи



@Shaggy Дякую за те, що помітили!
Арнольд

1
Поліглот JS та C # здається надзвичайно рідкісним, враховуючи відмінності між ними. +1
caird coinheringaahing




5

C (gcc) , 23 18 17 байт

  • Збережено байт завдяки Таггу ; гольф n/2+n%2до n+1>>1.
f(n){n=n*n+1>>1;}

Спробуйте в Інтернеті!

C (gcc) , 22 байти (не використовується невизначена поведінка)

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

Спробуйте в Інтернеті!

Деякі люди дійсно не люблять використовувати певну поведінку певного компілятора під час використання конкретних прапорів компілятора. Це, однак, економить байти.


3
Незвичайний спосіб надання відповіді IMO, але: f (n) {n = n * n + 1 >> 1;}, щоб зберегти байт.
Тагг

1
@Tahg Спасибі; хоча яким чином ви вважаєте, що мій спосіб дати відповідь дивним?
Джонатан Фрех

2
Я не думав, що зміна аргументу введення є нормальним способом повернення значення у C.
Tahg

2
@YSC Тим не менш, на думку компілятора, це зрозуміло і створює виконуваний файл, який працює.
Джонатан Фрех

5
@YSC Ми вважаємо, що тут, на PPCG, якщо програма працює на одному інтерпретаторі, це дійсне подання. Він працює на веб-перекладачі, тому він дійсний без додаткових зауважень.
Conor O'Brien


4

Python 3 , 19 байт

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

Спробуйте в Інтернеті!

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 байт завдяки спадару Xcoder


x**2->x*x
Містер Xcoder

@ Mr.Xcoder Facepalm дякую
HyperNeutrino

Про що lambda x:x*x+1>>1?
Алікс Айзенхардт

Або lambda x:x*x+1//2 застереження: я не знаю синтаксису або порядку операцій цієї мови, тому я здогадався; Я кажу, додайте 1 перед вами, //2 а не двічі заперечуючи.
Ден Хендерсон

@DanHenderson Ви все ще потребуєте круглих дужок, інакше вони розбираються як (x*x) + (1//2), так що насправді це не коротше.
Skyler

4

x86_64 машинна мова (Linux), 9 8 байт

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

Для того, щоб спробувати його в Інтернеті! , компілювати та запустити наступну програму C.

#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 байт

Функція анонімного мовчання.

2>.@%~*:

Спробуйте в Інтернеті!

*: Майдан

>. стеля (округлюється вгору)
@ після
2%~ ділення на два


Альтернативні рішення: <.@-:@*:і*:<.@%2:
Conor O'Brien

2
@ ConorO'Brien‽ 2>.@%~*:Звідки я це взяв? Я не можу це прочитати - схоже на шум лінії для мене…
Adám

>.@-:@*:отримує мій голос.
Jonah

1
@Jonah Якщо ти косиш, ти можеш побачити верблюда.
Адам


3

R , 22 21 байт

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

Спробуйте в Інтернеті!

Квадрат, приріст, ціле ділення. Простенька.

Введення від stdin; це може зайняти простір або розділений новий рядок вхід, і він обчислить максимум тазорів для кожного вхідного розміру. Вихід у stdout.

-1 байт завдяки планнапусу


@plannapus виправлено, дякую.
Джузеппе



2

C # (.NET Core) , 14 12 байт

-2 байти завдяки Еміньї

n=>(n*n+1)/2

Спробуйте в Інтернеті!




Я помітив відповідь javascript, щоб зробити те саме, і ця зміна зробить наші відповіді байтом у еквіваленті байт.
мій займенник monicareinstate



2

Cubix , 11 байт

Iu*:^\)2,O@

Heheh, :^\)

Спробуйте в Інтернеті!

Розгортається на наступний куб:

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

Який той самий алгоритм, який використовують багато хто.

  • ^Iu : читати на вході як int та змінювати напрямки
  • :* : дуб вершини стека, множення
  • \) : зміна напрямку, прирощення
  • 2, : push 2, ціле ділення
  • O@ : вихід друку у вигляді int, кінцева програма.





1

Japt , 4 байти

Сиділи на них з моменту закриття виклику.

²Ä z

Спробуй це

Пояснення: Квадрат, додайте 1, ділить поверх на 2


Альтернатива

²ÄÁ1

Спробуй це

Пояснення: Квадрат, додайте 1, біт-зсув справа на 1.


1

Коментатор , 19 байт

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

Спробуйте в Інтернеті!

Кому потрібні мови для гольфу? У мене заплутані мови!

Безгольова версія:

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

Спробуйте в Інтернеті!

Як це працює? Поясню, із введенням 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

TI-Basic, 7 байт

round(Ans²/2,0

Як варіант (8 байт):

int(Ans²/2+.5

-int(-.5Ans²також працює
Окі

@Oki Це точно. Я просто хочу, щоб вони мали ceil(функцію.
Timtech

1

/// , 35 байт

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

Спробуйте в Інтернеті!

Здійснює введення в одинаковому використанні символу *, а вихідне в одинаковому з використанням символу A. Це дозволено для деяких конкретних мов, зокрема /// ( мета )

Оскільки немає можливості взяти вхід у ///, введення має бути жорстко закодовано:

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

для введення = 4.


Пояснення: (перед читанням потрібно знати, що єдиним синтаксисом ///є /pattern/replacement/, які замінюють кожне виникнення patternна replacement; і \для втечі; інші символи друкуються для виведення)

Для 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.