正方形のチェス盤を作成したいとします。隣接するタイルは、標準のチェス盤のように黒と白を交互に並べる必要があり、左下隅は黒または白のどちらでもかまいません。
プログラムは、黒のタイルの数と白のタイルの数の2つの正の整数を受け取ります。これらは常に1024未満になります。すべてのタイルを使用する必要はありません。
指定された量のタイルを使用して構築できるチェス盤パターンの最大の辺の長さを出力します。
テストケース:
12, 15 -> 5
8, 8 -> 4
4, 0 -> 1
正方形のチェス盤を作成したいとします。隣接するタイルは、標準のチェス盤のように黒と白を交互に並べる必要があり、左下隅は黒または白のどちらでもかまいません。
プログラムは、黒のタイルの数と白のタイルの数の2つの正の整数を受け取ります。これらは常に1024未満になります。すべてのタイルを使用する必要はありません。
指定された量のタイルを使用して構築できるチェス盤パターンの最大の辺の長さを出力します。
テストケース:
12, 15 -> 5
8, 8 -> 4
4, 0 -> 1
回答:
b=>w=>((b<w?b:w)*2|b!=w)**.5|0
黒い正方形の数と白い正方形の数を考える、次のように計算されます。
偶数サイズの、我々は、必要のために各種類の二乗(例えば、:黒四角および白四角)。
奇数サイズの、我々は必要一種の二乗と他の種類の二乗(例えばため:黒四角及び白四角、またはその逆) 。パラメータに設定されている場合に片側に、この余分な正方形を表します。
«Ḥ+nƽ
ボードの最大サイズを返すダイアディックリンク。
« | Minimum
Ḥ | Doubled
+n | Plus 1 if inputs not equal
ƽ | Integer square root
Arnauldの回答は、これが機能する理由を説明しています。彼の賛成投票も検討してください!
x#y=floor$sqrt$min(x+y)$1+2*min x y
この答えは、次の式を計算します。
この式はなぜ機能するのですか?さて、次のことに注目することから始めましょう:
偶数辺の長さのすべての正方形は、タイルでタイリングできます。
そして
奇数の長さのすべての正方形を並べて表示することができますつの1 × 1の正方形にタイルを割り当てます。
ここで、これらのタイルをチェス盤に置くと、それぞれが1つの黒い正方形と白い正方形の上に置かれることに注意してください。したがって、偶数のチェス盤を作成する場合、すべてのタイルに他の色のペアが必要です。奇数のチェス盤を作成する場合、すべてのタイルに1つの他の色のペアが必要です。これは、答えは決して超えないことを教えてくれる。は、作成できるペアの最大数であり、は、ペアを必要としない最後の正方形用です。これの問題は、場合、奇数の場合の余分な二乗がないことです。私たちは別の条件を追加して:私たちの結果は、以上のことはできません。つまり、私たちが利用できるよりも多くのタイルを持つ正方形を作ることはできません。
したがって、2つのオプションのうち小さい方を選択します。
我々は、これが同じであることに気づくことができるアルノーの製剤場合ため= B、次いで2 分(、bは)だけであり、+のB。
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
最高の整数平方根を見つけます。
Ë≠+ß·tï
オンラインそれを試してみたり、すべてのテストケースを確認してください。
説明:
JavaScriptの回答で使用された式@Arnauldの自明な導関数を使用して、バイトを保存します。
Ë # 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
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
12, 12。