Isso é código de golfe. O vencedor é o código válido com o menor número de bytes.
Desafio
Dadas as entradas M e N , a largura e a altura de uma grade retangular de quadrados, produz um polígono que satisfaz o seguinte:
- As arestas do polígono são compostas apenas por arestas quadradas: não há arestas diagonais - todas são verticais ou horizontais.
- O polígono não possui furos: todos os quadrados fora do polígono podem ser alcançados por etapas ortogonais em quadrados fora do polígono, começando de um quadrado fora do polígono no limite externo do retângulo.
- O polígono não tem auto-interseção: das arestas quadradas que se encontram em um vértice, não mais que 2 podem fazer parte do perímetro do polígono.
- O polígono está conectado: qualquer quadrado no polígono deve ser acessível a partir de qualquer outro quadrado no polígono por meio de etapas ortogonais que permanecem dentro do polígono.
- O polígono tem o perímetro máximo possível: de acordo com a fórmula mostrada abaixo.
Seu código deve funcionar para M e N de 1 a 255.
Fórmula para o perímetro máximo
O desafio aqui é encontrar o polígono mais jogável com o perímetro máximo. O próprio perímetro máximo é sempre definido pela fórmula:
Isso é verdade porque, para um perímetro máximo, todo vértice quadrado deve estar no perímetro. Para um número ímpar de vértices, isso não é possível e o melhor que pode ser alcançado é um vértice a menos (uma vez que o perímetro é sempre par).
Resultado
Produza a forma como uma sequência de caracteres separados por nova linha ( N linhas de exatamente M caracteres). Aqui, estou usando espaço para quadrados fora do polígono e '#' para quadrados dentro do polígono, mas você pode usar dois caracteres visualmente distintos, desde que o significado deles seja consistente para todas as entradas.
Você pode incluir até uma nova linha inicial e até uma nova linha final.
Se desejar, você pode enviar M linhas com exatamente N caracteres e escolher M por N de saída para algumas entradas e N por M de saída para outras.
Exemplos
Inválido devido a um furo:
###
# #
###
Inválido devido à interseção (tocando na diagonal - um vértice com 4 arestas quadradas no perímetro) e, aliás, um buraco:
##
# #
###
Inválido por ter sido desconectado:
#
# #
#
Polígono válido do perímetro máximo:
# #
# #
###
Créditos
Inicialmente, subestimei a rapidez com que o valor do perímetro máximo podia ser calculado e pedia apenas esse valor como saída. Agradecemos às pessoas maravilhosamente úteis no chat por explicar como calcular o perímetro máximo para N e M arbitrários e ajudar a transformar isso em um desafio que durará mais de uma resposta ...
Especialmente graças a:
Sparr , Zgarb , feersum , jimmy23013 .