N×Nチェス盤にいくつのワジールを配置できますか?


30

Wazirという名前の新しい妖精のチェスの駒がチェスに導入されたとします。ワジラーは、位置(xy)から次の位置に移動できます:
 (x +1、y
 (xy +1)
 (x -1、y
 (xy -1)

つまり、彼らはルークのように直角に動きますが、王のように一度に1歩だけです。N×Nチェス盤にこのようなワジールをいくつ配置して、2人のワジールが互いに攻撃できないようにすることができますか?

 1×1ボードでは、このようなピースは1つしかありません。
 2×2ボードでは、このようなピースが2つあります。
 3×3ボードでは、このようなピースが5つあります。

Nを指定すると、N×Nチェス盤に配置できるワジラーの数を返します。

これは、OEISシーケンスA000982です。

より多くのテストケース

725

832

1005000


4
それで、ラクダはルークに、王は女王に何をするのでしょうか?つまり、直交方向にしか移動できず、一度に1ステップしか移動できません。
アダム

2
@SashaRあなたの質問を適切なコードゴルフチャレンジとして書き直してもいいですか?
アダム

2
もちろん!そうすることで、将来質問に関連する質問をどのようにコーディングするかを見ることができます
サーシャR

15
このサイトの新規ユーザーとして、今回は非常に幸運でした。このサイトの(トピック外の)プログラミングに関する質問の多くは、チャレンジとして編集されるのではなく、このように投票されて永久に閉じられ、投票されました。他の人がすでに説明したように、このサイトはプログラミングのコンテストのみのためであり、宿題を尋ねるためではありません。チャレンジを投稿する前に、サンドボックスを(codegolf.meta.stackexchange.com/questions/2140/…で)使用して、次によくある間違いを避けることができます。このサイトのほとんどのユーザーは、これまで見てきたように、「判読不能」な言語を使用していることに注意してください。
user202729

16
この質問は、キャメルがすでに長いジャンプをする騎士のような作品の標準的な妖精のチェス名であり、あなたが説明する作品がすでに妖精のチェス名であるWazirであるという点でかなり混乱しています。
マーク

回答:


33

空白、45バイト

   
	
		   
			 
 	  
   	
	      	 
	 	 	
 	

オンラインでお試しください!

ところで、heren²/2⌉の式が正しいことの証明がここにあります。

  • 少なくとも⌈n²/2⌉のワジールをいつでも配置できます。それらを市松模様に配置するだけです!左上のタイルが白であると仮定すると、n×nボードには⌈n²/2⌉の白いタイルと⌊n²/2⌋の黒いタイルがあります。そして、白いタイルにワジールを配置しても、すべてのワジールが黒のタイルを「見る」だけなので、2つはお互いを攻撃していません。

    5×5のボードに13個のワジールを配置する方法を次に示します(各Wはワジールです)。

              5×5ボード上の13個のワジール

  • これ以上のことはできません。チェッカーボードを2×1ドミノの駒で任意に並べてみましょう。オプションで、奇数長のチェス盤の最後のコーナーに1×1の駒を使用します。

              5×5ボードのドミノカバー

    チェス盤を覆うには⌈n²/2⌉ドミノが必要です。明らかに、1つのドミノに2つのワジラーを置くと、お互いを攻撃できるようになります!各ドミノが唯一の私たちがすることはできません意味、最も1 wazirに含めることができますので、おそらくボード上より⌈n²/2⌉wazirsより置きます。


最後の部分に鳩の巣の原理は必要ありません。タイルは正確に⌈n²/2⌉あり、タイルごとに最大でラクダがあるため、最大で⌈n²/2⌉のラクダがあります。
シュリーバツァー

8
@ShreevatsaR>n²/2⌉タイルにx>⌈n²/2⌉のラクダを配置できないことを保証するものは何ですか?それは鳩の巣の原理です
...-frarugi87

2
最初はコードが読み込まれないと思ったので、ページを更新しましたが、まだ読み込まれませんでした。それから、一番上に言語名が書かれていることに気付きました。
アーサー

7
証明図でCをに変更したことを感謝しますW
ジュゼッペ

4
また、WがすべてWHITE SPACEにあり、WHITESPACEに答えがあることも感謝しています。
corsiKa



9

APL(Dyalog)9 7 6バイト

現在、Xcoder氏の式を使用しています。

これは、引数としてNを取る匿名プレフィックス暗黙関数です。

2÷⍨×⍨

オンラインでお試しください!

×⍨ 平方N(照明の乗算セルフィー、つまり自己乗算)

2÷⍨ 2で割る

 天井(切り上げ)


うわー、私はあなたがこれをどうやってやったのか分からない!! ため息をつい
サーシャR

くそー、誰かがすでにパターンを発見しました。
フェザークラウン

1
ええ、式がOEISページにあることに気付きました。おそらくそれをリンクすべきではなかったでしょう。
フェザークラウン

7

JS(ES6)/ C#ポリグロット、11バイト

n=>n*n+1>>1

テストケース



@Shaggy気づいてくれてありがとう!
アーナルド

1
JSとC#のポリグロットは、両者の違いを考えると非常にまれに思えます。+1
ケアニアンコイリンガリング




5

C(gcc)23 18 17バイト

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;}。
-Tahg

1
@Tahgありがとう。でも、どうやって答えを出すのがおかしいと思いますか?
ジョナサンフレッチ

2
入力引数を変更することは、Cで値を返す通常の方法だとは思いませんでした。
Tahg

2
@YSCしかし、コンパイラの意見では、理解可能であり、動作する実行可能ファイルを作成します。
ジョナサンフレッチ

5
@YSCここでは、PPCGについて、プログラムが1つのインタープリターで機能する場合、それは有効な提出物であると考えています。それはオンライン通訳で動作するため、それ以上の発言なしで有効です。
コナーオブライエン


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)

Xcoder氏のおかげで-1バイト


x**2->x*x
ミスターXcoder

@ Mr.Xcoder Facepalmありがとう
HyperNeutrino

どうlambda x:x*x+1>>1
アリックスアイゼンハルト

またはlambda x:x*x+1//2 免責事項:この言語の構文や操作の順序がわからないので、推測しました。 //2 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:
コナーオブライエン

2
@ ConorO'Brien‽ 2>.@%~*:どこから入手したの?それを読むことができません–私には回線ノイズのように見えます…
アダム

>.@-:@*:私の投票を取得します。
ジョナ

1
@ジョナ目を細めると、ラクダが見えます。
アダム


3

R22 21バイト

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

オンラインでお試しください!

平方、増分、整数除算。簡単です。

stdinからの入力。スペースまたは改行で区切られた入力を取ることができ、各入力ボードサイズの最大ワジラーを計算します。stdoutへの出力。

プランナパスのおかげで-1バイト


@plannapus修正、ありがとうございます。
ジュゼッペ






2

Cubix、11バイト

Iu*:^\)2,O@

へへ、 :^\)

オンラインでお試しください!

次のキューブに展開します。

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

これは多くの人が使用しているのと同じアルゴリズムです。

  • ^Iu :入力をintとして読み取り、方向を変更します
  • :* :スタックの一番上、乗算
  • \) :方向の変更、増分
  • 2, :プッシュ2、整数除算
  • O@ :出力をintとして出力し、プログラムを終了します。






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(機能があればいいのにと思います。
ティムテック

1

///、35バイト

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

オンラインでお試しください!

symbolを使用して単項で入力を取り*、symbolを使用して単項で出力しAます。これは、///(meta)を含む特定の言語で許可されます

///に入力を取得する方法はないため、入力はハードコーディングする必要があります。

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

入力= 4の場合


説明:(読む前に、の唯一の構文////pattern/replacement/であることに注意する必要があります; これはpatternreplacement; によるすべての出現を置換し\、エスケープします;他の文字は出力に出力されます)

のために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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.