Сколько вазиров можно разместить на шахматной доске 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
Конечно! Таким образом, я также могу видеть, как в будущем можно связать вопросы, связанные с кодировкой слов
Саша Р

15
Как новый пользователь этого сайта, на этот раз вам очень повезло. Многие (не по теме) вопросы программирования на этом сайте были постоянно закрыты и отклонены, не отредактированы как вызовы и не одобрены как этот. Как уже объясняли другие люди, этот сайт предназначен только для соревнований по программированию, а не для того, чтобы задавать домашние задания. Вы можете использовать песочницу (по адресу codegolf.meta.stackexchange.com/questions/2140/… ) перед публикацией задачи, чтобы в следующий раз избежать распространенных ошибок; и обратите внимание, что большинство пользователей на этом сайте, как вы видели, используют «нечитаемые» языки.
user202729

16
Этот вопрос довольно запутанный, так как «Верблюд» - это уже стандартное название фейских шахмат для фигуры, похожей на рыцаря, которая делает более длинные прыжки, а у фигуры, которую вы описываете, уже есть феерическое шахматное имя: Вазир .
Марк С.

Ответы:


33

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

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

Попробуйте онлайн!

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

  • Мы всегда можем разместить как минимум ⌈n² / 2⌉ вазиров : просто выложите их в шахматном порядке! Предполагая, что верхний левый тайл имеет белый цвет, на доске n × n есть белые / 2 / белые плитки и 2/2 черные плитки . И если мы поместим вазиров на белые плитки, то ни один из них не нападет друг на друга, так как каждый вазир только «видит» черные плитки.

    Вот как мы размещаем 13 вазиров на доске 5 × 5 (каждый W - вазир).

              13 вазиров на доске 5 × 5

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

              обложка домино доски 5х5

    Нам нужно домино «/ 2», чтобы покрыть шахматную доску. Очевидно, что размещение двух вазиров на одном домино позволяет им атаковать друг друга! Таким образом , каждый домино может содержать только более одного Вазир, то есть мы не можем , возможно разместить более ⌈n² / 2⌉ вазиров на борту.


Для последней части вам не нужен принцип «голубиного отверстия»: у вас ровно ⌈n² / 2⌉ плиток и максимум верблюдов на плитку, поэтому у вас максимум mostn² / 2⌉ верблюдов.
ShreevatsaR

8
@ShreevatsaR Что гарантирует, что вы не можете положить x> ²n² / 2⌉ верблюдов в ⌈n² / 2⌉ тайлы? Это принцип
ямы

2
Сначала я подумал, что код не загружается, поэтому обновил страницу, но он все равно не загрузился. Тогда я понял, на каком языке написано название вверху.
Артур

7
Я ценю, что вы пошли и изменили свои Cна Wдоказательства.
Джузеппе

4
Я также ценю, что все буквы W находятся в БЕЛЫХ ПРОСТРАНСТВАХ с ответом в БЕЛОМ ПРОСТРАНСТВЕ.
CorsiKa


10

Пролог (SWI) , 22 19 байт

Сохранено 3 байта благодаря Кевину Круйссену

X*Y:-Y is(X*X+1)/2.

Попробуйте онлайн!



2
@KevinCruijssen: Дох! Я предложил такое же изменение другому пользователю, но почему-то я не принял мой собственный совет. Спасибо :)
Emigna

9

APL (Dyalog) , 9 7 6 байтов

Теперь использует формулу мистера Xcoder.

Это анонимная префиксная молчаливая функция, которая принимает N в качестве аргумента.

2÷⍨×⍨

Попробуйте онлайн!

×⍨ квадрат N (горит умножение селфи, т.е. умножение на себя)

2÷⍨ разделить на 2

 потолок (вверх)


Ух ты! Я понятия не имею, как ты это сделал !! Не вздохнул
Саша Р

Черт, кто-то уже узнал шаблон.
Feathercrown

1
Да, только что понял, что формула на странице OEIS. Вероятно, не следовало связывать это.
Feathercrown

7

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

n=>n*n+1>>1

Контрольные примеры



@ Shaggy Спасибо, что заметили!
Арно

1
JS и C # полиглот кажутся крайне редкими, учитывая различия между ними. +1
Caird Coneheringaahing




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, считаем, что, если программа работает с одним переводчиком, она является действительным представлением. Он работает на онлайн-переводчике, поэтому он действителен без каких-либо дополнительных замечаний.
Конор О'Брайен


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), так что на самом деле он не короче.
Скайлер

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:
Конор О'Брайен

2
@ ConorO'Brien‽ 2>.@%~*:Откуда я это взял ? Я не могу прочитать это - похоже на шум линии…
Адам

>.@-:@*:получает мой голос.
Иона

1
@Jonah Если ты покосишься, то увидишь верблюда.
Адам


3

R , 22 21 байт

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

Попробуйте онлайн!

Квадрат, приращение, целочисленное деление. Очень просто.

Ввод от stdin; он может принимать ввод с разделением пробелом или символом новой строки и вычислять максимальные значения wazirs для каждого размера платы ввода. Вывод на стандартный вывод.

-1 байт благодаря планнапу


@plannapus исправлено, спасибо.
Джузеппе



2

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

-2 байта благодаря Emigna

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

Попробуйте онлайн!




Я заметил, что ответ javascript делает то же самое, и это изменение сделало бы наши ответы байтовыми байтами эквивалентными.
мое местоимение monicareinstate



2

Cubix , 11 байт

Iu*:^\)2,O@

Heheh, :^\)

Попробуйте онлайн!

Расширяется до следующего куба:

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

Какой тот же алгоритм, который многие используют.

  • ^Iu : читать входные данные как int и менять направление
  • :* : дублируй вершину стека, умножь
  • \) : изменить направление, приращение
  • 2, : нажмите 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

OCaml , 19 байт

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

Попробуйте онлайн!

Я немного обескуражен, название изменилось с "верблюдов" на "wazirs", прежде чем мне удалось написать это, но я решил, что я все равно отправлю это.


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.