Este es el código de golf. El ganador es el código válido con el menor número de bytes.
Desafío
Dadas las entradas M y N , el ancho y la altura de una cuadrícula rectangular de cuadrados, genera un polígono que satisface lo siguiente:
- Los bordes del polígono están formados solo por bordes cuadrados: no hay bordes diagonales, todos son verticales u horizontales.
- El polígono no tiene agujeros: se puede llegar a cada cuadrado fuera del polígono mediante pasos ortogonales en cuadrados fuera del polígono, comenzando desde un cuadrado fuera del polígono en el límite exterior del rectángulo.
- El polígono no tiene auto-intersección: de los bordes cuadrados que se encuentran en un vértice, no más de 2 pueden ser parte del perímetro del polígono.
- El polígono está conectado: cualquier cuadrado en el polígono debe ser accesible desde cualquier otro cuadrado en el polígono a través de pasos ortogonales que permanecen dentro del polígono.
- El polígono tiene el perímetro máximo posible: de acuerdo con la fórmula que se muestra a continuación.
Su código debe funcionar para M y N de 1 a 255.
Fórmula para perímetro máximo
El desafío aquí es encontrar el más golfable de esos polígonos con el perímetro máximo. El perímetro máximo en sí mismo siempre está definido por la fórmula:
Esto es cierto porque para un perímetro máximo cada vértice cuadrado debe estar en el perímetro. Para un número impar de vértices esto no es posible y lo mejor que se puede lograr es un vértice menos (ya que el perímetro siempre es par).
Salida
Imprima la forma como una cadena de caracteres separados por nueva línea ( N filas de exactamente M caracteres). Aquí estoy usando espacio para cuadrados fuera del polígono y '#' para cuadrados dentro del polígono, pero puede usar cualquiera de los dos caracteres visualmente distintos, siempre que su significado sea consistente para todas las entradas.
Puede incluir hasta una nueva línea inicial y hasta una nueva línea final.
Si lo desea, puede generar M filas de exactamente N caracteres, y puede elegir M por N para algunas entradas y N por M para otras.
Ejemplos
Inválido debido a un agujero:
###
# #
###
Inválido debido a la intersección (tocando en diagonal: un vértice con 4 bordes cuadrados en el perímetro) y, por cierto, un agujero:
##
# #
###
No válido por estar desconectado:
#
# #
#
Polígono válido de perímetro máximo:
# #
# #
###
Créditos
Inicialmente subestimé la rapidez con la que se podía calcular el valor del perímetro máximo, y solo iba a pedir ese valor como la salida. Gracias a las personas maravillosamente útiles en el chat por explicar cómo calcular el perímetro máximo para N y M arbitrarios y ayudar a convertir esto en un desafío que durará más de una respuesta ...
Específicamente gracias a:
Sparr , Zgarb , feersum , jimmy23013 .