Ein Megachess Board

8

Sie möchten ein quadratisches Schachbrett erstellen. Benachbarte Kacheln müssen sich wie ein Standardschachbrett schwarz und weiß abwechseln, und die untere linke Ecke kann entweder schwarz oder weiß sein.

Ihr Programm akzeptiert zwei positive ganze Zahlen, die Anzahl der schwarzen und die Anzahl der weißen Kacheln. Diese sind immer kleiner als 1024. Sie müssen nicht alle Kacheln verwenden.

Geben Sie die maximale Seitenlänge eines Schachbrettmusters aus, das mit der angegebenen Anzahl von Kacheln erstellt werden kann.

Testfälle:

12, 15 -> 5
8, 8 -> 4    
4, 0 -> 1
Ad-hoc-Garf-Jäger
quelle
Hallo! Ich habe Ihre Frage bearbeitet, um zu sagen, was ich dachte, dass Sie gemeint haben. Ist dies nicht der Fall, können Sie es erneut bearbeiten. Willkommen bei PPCG!
CG
2
Ich denke, das ist eine nette Frage, aber leider schlecht gestellt. OP bedeutet, dass Sie durch einige schwarze und einige weiße Kacheln (0 bis 1000 für jede Farbe) die Abmessungen des größten Schachbretts ermitteln, das Sie daraus herstellen können. Interessante Testfälle: Eingabe [10,15] und Ausgabe [ 4] und auch Eingabe [12,12] und Ausgabe [4]
J42161217
4
Sie haben auch diese letzte Woche gepostet , wo Sie zum Sandkasten geleitet wurden
xnor
8
Letzter Testfall sollte 1. sein
Nick Kennedy
2
@ SriotchilismO'Zaic, manchmal akzeptieren wir auch die kürzeste Lösung in einer bestimmten Sprache. "Beste Erklärung" ist jedoch kein gültiges Kriterium für die Annahme einer Lösung.
Shaggy

Antworten:

10

JavaScript (ES7), 30 Byte

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

Probieren Sie es online aus!

Bei gegebener Anzahl der schwarzen Quadrate b und der Anzahl der weißen Quadrate w wird berechnet:

s=2×min(b,w)+k
mit:
k={0if b=w1if bw

Für eine noch Größen s , wir brauchen s2/2 Quadrate jeder Art (zB für s=8 : 32 schwarze Quadrate und 32 weiße Quadrate).

Für ungeradee Größen s , brauchen wir s2/2 Quadrate einer Art und s2/2 Quadrate der anderen Art (zB für s=5 : 12 schwarze Quadrate und 13 weiße Quadrate, oder umgekehrt) . Der Parameter k wird auf 1 gesetzt, wenn max(b,w)min(b,w)+1, die dieses zusätzliche Quadrat auf einer Seite darstellt.

Arnauld
quelle
5

Haskell , 35 Bytes

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

Probieren Sie es online aus!

Erläuterung

Diese Antwort berechnet die folgende Formel:

min(a+b,2min(a,b)+1)

Warum funktioniert diese Formel? Lassen Sie uns zunächst Folgendes beachten:

Jedes Quadrat mit gleichmäßiger Seitenlänge kann mit 2×1 Kacheln gekachelt werden.

und

Jedes Quadrat mit ungerader Länge kann gekachelt werden. Ersparen Sie ein einzelnes 1×1 Quadrat durch 2×1 Kacheln.

Jetzt stellen wir fest, dass, wenn wir diese 2×1 Kacheln auf ein Schachbrett legen, jedes auf einem schwarzen Quadrat und auf einem weißen Quadrat liegt. Wenn wir also ein gerades Schachbrett herstellen, muss jede Kachel ein Paar der anderen Farbe haben, und wenn wir ein ungerades Schachbrett herstellen, benötigt jede Kachel außer einer ein Paar der anderen Farbe. Dies sagt uns, dass die Antwort niemals mehr als 2min(a,b)+1. 2min(a,b)ist die maximale Anzahl von Paaren, die wir bilden können, und+1steht für das letzte Quadrat, das kein Paar benötigt. Das Problem dabei ist, dass wenna=bwir nicht das zusätzliche Quadrat für den ungeraden Fall haben. Also fügen wir eine weitere Bedingung hinzu: Unser Ergebnis kann nicht mehr alsa+b. Das heißt, wir können kein Quadrat erstellen, das mehr Kacheln enthält, als wir zur Verfügung haben.

Wir nehmen also nur die kleinere der beiden Optionen.

min(a+b,2min(a,b)+1)

a=b2min(a,b)a+b

Ad-hoc-Garf-Jäger
quelle
3

Ruby , 36 Bytes

->x,y{'%i'%[x+y,x-~x,y-~y].min**0.5}

Probieren Sie es online aus!

x-~xist eine Golfversion von 2*x+1; Wir subtrahieren die Zwei-Komplement-Negation von x von sich selbst. Danach verwende ich nur die Formel dieser Antwort , reduziere aber die beiden verschachtelten mins zu einer und verwende dann die Zeichenfolgenformatierung, um sie auf eine Ganzzahl zu kürzen.

Histokrat
quelle
2

Retina 0,8,2 , 50 Bytes

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

Probieren Sie es online aus! Link enthält Testfälle. Erläuterung:

O#`\d+

Sortieren Sie die Zahlen in aufsteigender Reihenfolge. Nennen wir sie lund h.

\d+
$*

In unary konvertieren.

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

Berechnen l + max(h, l + 1). Dies entspricht 2 * min(b, w) + (b != w). Siehe @ Arnauld's Antwort, warum dies funktioniert.

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

Finden Sie die höchste ganzzahlige Quadratwurzel.

Neil
quelle
2

05AB1E , 8 7 Bytes

Ë≠+ß·tï

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erklärung:

Verwendet eine triviale Ableitung der Formel @Arnauld, die in seiner JavaScript-Antwort verwendet wird , um ein Byte zu speichern:

s=2×min(b+k,w+k)
k={0if b=w1if bw

Ë        # 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
Kevin Cruijssen
quelle
1

Japt , 11 Bytes

Port of Arnauld's JS-Lösung. Nimmt die Eingabe als Array auf.

ñÍÌÑ+Ur¦)¬f

Versuch es

ñÍÌÑ+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
Zottelig
quelle
1

R , 32 Bytes

min(sum(n<-scan()),2*n+1)^.5%/%1

Probieren Sie es online aus!

Nimmt bund wvon stdin.

Verwendet die Formel aus dieser Antwort , nutzt jedoch das Verhalten von min, um das Minimum aller seiner Argumente zu übernehmen.

Giuseppe
quelle
1

Perl 6 , 29 26 Bytes

{0+|sqrt 2*@_.min+[!=] @_}

Vielen Dank an Jo King für -3 Bytes.

Probieren Sie es online aus!

bb94
quelle
[min] @_kann sein @_.minund Sie können das [!=]bis zum Ende verschieben, um auf den Klammern zu speichern. 26 Bytes
Jo King
0

Japt , 10 Bytes

Port of Arnauld's JS-Lösung.

mV Ñ|U¦V ¬

Probieren Sie es online aus!

alexz02
quelle
Willkommen bei PPCG und willkommen bei Japt! :) Beachten Sie jedoch, dass Sie das Ergebnis der Quadratwurzel auf den Boden legen müssen. Andernfalls schlägt dies für solche wie fehl 12, 12.
Shaggy