メガチェスボード


8

正方形のチェス盤を作成したいとします。隣接するタイルは、標準のチェス盤のように黒と白を交互に並べる必要があり、左下隅は黒または白のどちらでもかまいません。

プログラムは、黒のタイルの数と白のタイルの数の2つの正の整数を受け取ります。これらは常に1024未満になります。すべてのタイルを使用する必要はありません。

指定された量のタイルを使用して構築できるチェス盤パターンの最大の辺の長さを出力します。

テストケース:

12, 15 -> 5
8, 8 -> 4    
4, 0 -> 1

おい!あなたの質問を編集して、私があなたが何を意味するのかと考えました。そうでない場合は、再度編集できます。PPCGへようこそ!
— CG One Handed

2
これはいい質問だと思いますが、残念ながらあまりよく言われていません。OPは、いくつかの黒いタイルといくつかの白いタイル(すべての色で0〜1000)を与えることによって、それらから作成できる最大のチェス盤の寸法を見つけることを意味します。興味深いテストケース:入力[10、15]および出力[ 4]およびInput [12,12]およびOutput [4]
— J42161217 '16

4
先週、サンドボックスに誘導された場所も投稿しました
— XNOR

8
最後のテストケースは1でなければなりません
— ニック・ケネディ

2
@ SriotchilismO'Zaic、特定の言語で最短の解決策を受け入れることもあります。ただし、「最良の説明」は、ソリューションを受け入れるための有効な基準ではありません。
— Shaggy

回答:


10

JavaScript(ES7)、30バイト

b=>w=>((b<w?b:w)*2|b!=w)**.5|0

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

黒い正方形の数bと白い正方形の数を考えるw、次のように計算されます。

s=⌊2×分(b、w)+k⌋
有する:
k={0もし b=w1もし b≠w

偶数サイズのs、我々は、必要s2/2のために各種類の二乗(例えば、s=8:32黒四角および32白四角)。

奇数サイズのs、我々は必要⌊s2/2⌋一種の二乗と⌈s2/2⌉他の種類の二乗(例えばためs=5:12黒四角及び13白四角、またはその逆) 。パラメータkに設定されている1場合にメートルaバツ(b、w)≥メートル私ん(b、w)+1片側に、この余分な正方形を表します。



5

Haskell、35バイト

x#y=floor$sqrt$min(x+y)$1+2*min x y

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

説明

この答えは、次の式を計算します。

⌊分(a+b、2分(a、b)+1)⌋

この式はなぜ機能するのですか?さて、次のことに注目することから始めましょう:

偶数辺の長さのすべての正方形は、2×1タイルでタイリングできます。

そして

奇数の長さのすべての正方形を並べて表示することができます1×1つの1 × 1の正方形に2×1タイルを割り当てます。

ここで、これらの2×1タイルをチェス盤に置くと、それぞれが1つの黒い正方形と白い正方形の上に置かれることに注意してください。したがって、偶数のチェス盤を作成する場合、すべてのタイルに他の色のペアが必要です。奇数のチェス盤を作成する場合、すべてのタイルに1つの他の色のペアが必要です。これは、答えは決して超えないことを教えてくれる⌊2分(a、b)+1⌋。2分(a、b)は、作成できるペアの最大数であり、+1は、ペアを必要としない最後の正方形用です。これの問題は、a=b場合、奇数の場合の余分な二乗がないことです。私たちは別の条件を追加して:私たちの結果は、以上のことはできません⌊a+b⌋。つまり、私たちが利用できるよりも多くのタイルを持つ正方形を作ることはできません。

したがって、2つのオプションのうち小さい方を選択します。

⌊分(a+b、2分(a、b)+1)⌋

我々は、これが同じであることに気づくことができるアルノーの製剤場合ため= B、次いで2 分(、bは)だけであり、+のB。a=b2分(a、b)a+b



2

Retina 0.8.2、50バイト

O#`\d+
\d+
$*
(1*),(1?\1)1*
$1$2
^(^1|11\1)*1*
$#1

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

O#`\d+

番号を昇順に並べ替えます。それらlを呼び出しましょうh。

\d+
$*

単項に変換します。

(1*),(1?\1)1*
$1$2

計算しl + max(h, l + 1)ます。これはと同等2 * min(b, w) + (b != w)です。これが機能する理由については、@ Arnauldの回答を参照してください。

^(^1|11\1)*1*
$#1

最高の整数平方根を見つけます。


2

05AB1E、8 7 バイト

Ë≠+ß·tï

オンラインそれを試してみたり、すべてのテストケースを確認してください。

説明:

JavaScriptの回答で使用された式@Arnauldの自明な導関数を使用して、バイトを保存します。

s=⌊2×分(b+k、w+k)⌋
k={0もし b=w1もし b≠w

Ë        # Check if the two values of the (implicit) input-pair are the same
         #  (1 if truthy; 0 if falsey)
 ≠       # Falsify (!= 1), so 1 becomes 0 and vice-versa
  +      # Add that to each of the (implicit) input-values
   ß     # Only leave the minimum of that
    ·    # Double it
     t   # Take the square root
      ï  # And truncate/floor it by casting to an integer

1

Japt、11バイト

ArnauldのJSソリューションのポート。入力を配列として受け取ります。

ñÍÌÑ+Ur¦)¬f

それを試してみてください

ñÍÌÑ+Ur¦)¬f     :Implicit input of array U
ñ               :Sort by
 Í              :  Subtracting from 2
  Ì             :Last element (Yes, there are more straightforward ways of getting the minimum but I like this method and it doesn't cost any bytes)
   Ñ+           :Multiply by 2 and add
     Ur         :U reduced by
       ¦        :  Testing for inequality
        )       :End reduce
         ¬      :Square root
          f     :Floor



0

Japt、10バイト

ArnauldのJSソリューションのポート。

mV Ñ|U¦V ¬

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


PPCGへようこそ、Japtへようこそ!:)ただし、平方根の結果をフロアする必要があることに注意してください。そうでなければ、これはのようなもののために失敗します12, 12。
— シャギー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.