Un tablero de megachess

8

Desea crear un tablero de ajedrez cuadrado. Las fichas adyacentes deben alternar en blanco y negro como un tablero de ajedrez estándar, y la esquina inferior izquierda puede ser negra o blanca.

Su programa tomará dos enteros positivos, el número de fichas negras y el número de fichas blancas. Estos siempre serán inferiores a 1024. No tiene que usar todos los mosaicos.

Produzca la longitud máxima del lado de un patrón de tablero de ajedrez que se puede construir usando la cantidad dada de fichas.

Casos de prueba:

12, 15 -> 5
8, 8 -> 4    
4, 0 -> 1
Ad Hoc Garf Hunter
fuente
¡Oye! He editado tu pregunta para decir lo que pensé que querías decir. Si no es así, puede editarlo nuevamente. Bienvenido a PPCG!
CG One Handed
2
Creo que esta es una buena pregunta pero, desafortunadamente, está mal planteada. OP significa que al darle algunas fichas negras y algunas fichas blancas (de 0 a 1000 para cada color), descubrirá las dimensiones del tablero de ajedrez más grande que puede hacer con ellas. Casos de prueba interesantes: Entrada [10,15] y Salida [ 4] y también Entrada [12,12] y Salida [4]
J42161217
44
También publicaste esto la semana pasada , donde te dirigieron al sandbox
xnor
8
El último caso de prueba debería ser 1.
Nick Kennedy
2
@ SriotchilismO'Zaic, a veces también aceptamos la solución más corta en un idioma en particular. Sin embargo, la "mejor explicación" no es un criterio válido para aceptar una solución.
Shaggy

Respuestas:

10

JavaScript (ES7), 30 bytes

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

Pruébalo en línea!

Dado el número de cuadrados negros si y el número de cuadrados blancos w , esto calcula:

s=2×min(si,w)+k
con:
k={0 0Si si=w1Si siw

Incluso para tamaños s , necesitamos s2/ /2 plazas de cada tipo (por ejemplo, para s=8 : 32 cuadrados negros y 32 cuadrados blancos).

Para tamaños impar s , necesitamos s2/ /2 cuadrados de un tipo y s2/ /2 plazas del otro tipo (por ejemplo, para s=5 5 : 12 cuadrados negros y 13 cuadrados blancos, o al revés) . El parámetro k se establece en 1 si metrounaX(si,w)metroyonorte(si,w)+1, que representa este cuadrado adicional en un lado.

Arnauld
fuente
5

Haskell , 35 bytes

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

Pruébalo en línea!

Explicación

Esta respuesta calcula la siguiente fórmula:

min(una+si,2min(una,si)+1)

¿Por qué funciona esta fórmula? Bueno, comencemos señalando lo siguiente:

Cada cuadrado de longitud lateral uniforme se puede colocar en mosaico con 2×1 fichas.

y

Cada cuadro de longitud impar se puede colocar en mosaico, ahorre un solo cuadrado de 1×1 , por 2×1 fichas.

2×12min(una,si)+12min(una,si)+1una=siuna+si

Entonces, tomamos la menor de las dos opciones.

min(una+si,2min(una,si)+1)

una=si2min(una,si)una+si

Ad Hoc Garf Hunter
fuente
3

Ruby , 36 bytes

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

Pruébalo en línea!

x-~xes una versión de golf de 2*x+1; estamos restando la negación de dos complementos de x de sí misma. Después de eso, solo uso la fórmula de esta respuesta , pero colapso los dos mins anidados en uno, luego uso el formato de cadena para truncar a un entero.

histocrat
fuente
2

Retina 0.8.2 , 50 bytes

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

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

O#`\d+

Ordenar los números en orden ascendente. Vamos a llamarlos ly h.

\d+
$*

Convierte a unario.

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

Calcular l + max(h, l + 1). Este es el equivalente a 2 * min(b, w) + (b != w). Vea la respuesta de @ Arnauld para saber por qué esto funciona.

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

Encuentra la raíz cuadrada entera más alta.

Neil
fuente
2

05AB1E , 8 7 bytes

Ë≠+ß·tï

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

Utiliza una derivada trivial de la fórmula @Arnauld utilizada en su respuesta de JavaScript para guardar un byte:

s=2×min(si+k,w+k)
k={0 0Si si=w1Si siw

Ë        # 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
fuente
1

Japt , 11 bytes

Solución JS del puerto de Arnauld. Toma la entrada como una matriz.

ñÍÌÑ+Ur¦)¬f

Intentalo

ñÍÌÑ+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
Lanudo
fuente
1

R , 32 bytes

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

Pruébalo en línea!

Toma by wde stdin.

Utiliza la fórmula de esta respuesta , pero aprovechando el comportamiento de mintomar el mínimo de todos sus argumentos.

Giuseppe
fuente
1

Perl 6 , 29 26 bytes

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

Gracias a Jo King por -3 bytes.

Pruébalo en línea!

bb94
fuente
[min] @_puede ser @_.miny puede mover [!=]hasta el final para guardar en los corchetes. 26 bytes
Jo King
0

Japt , 10 bytes

Solución JS del puerto de Arnauld.

mV Ñ|U¦V ¬

Pruébalo en línea!

alexz02
fuente
¡Bienvenido a PPCG y bienvenido a Japt! :) Tenga en cuenta, sin embargo, que necesita anotar el resultado de la raíz cuadrada. De lo contrario, esto fallará para los gustos de 12, 12.
Shaggy