Questo è il codice golf. Il vincitore è il codice valido con il minor numero di byte.
Sfida
Dati gli input M e N , la larghezza e l'altezza di una griglia rettangolare di quadrati, genera un poligono che soddisfa quanto segue:
- I bordi poligonali sono costituiti solo da bordi quadrati: non ci sono bordi diagonali, tutti sono verticali o orizzontali.
- Il poligono non ha buchi: ogni quadrato esterno al poligono può essere raggiunto da gradini ortogonali su quadrati esterni al poligono, a partire da un quadrato esterno al poligono sul bordo esterno del rettangolo.
- Il poligono non ha autointersezione: dei bordi quadrati che si incontrano in corrispondenza di un vertice, non più di 2 possono far parte del perimetro del poligono.
- Il poligono è collegato: qualsiasi quadrato nel poligono deve essere raggiungibile da qualsiasi altro quadrato nel poligono tramite passaggi ortogonali che rimangono all'interno del poligono.
- Il poligono ha il perimetro massimo possibile: secondo la formula mostrata di seguito.
Il codice deve funzionare per M e N da 1 a 255.
Formula per il perimetro massimo
La sfida qui è trovare il più giocabile di quei poligoni con il perimetro massimo. Il perimetro massimo stesso è sempre definito dalla formula:
Questo è vero perché per un perimetro massimo ogni vertice quadrato deve trovarsi sul perimetro. Per un numero dispari di vertici questo non è possibile e il meglio che si può ottenere è un vertice in meno (poiché il perimetro è sempre pari).
Produzione
Stampa la forma come una stringa di caratteri separati da nuova riga ( N righe di esattamente M caratteri). Qui sto usando lo spazio per i quadrati all'esterno del poligono e "#" per i quadrati all'interno del poligono, ma è possibile utilizzare due caratteri visivamente distinti, a condizione che il loro significato sia coerente per tutti gli input.
È possibile includere fino a una nuova riga iniziale e fino a una nuova riga finale.
Se lo desideri, puoi invece generare M righe di esattamente N caratteri e puoi scegliere M per N output per alcuni input e N per M output per altri.
Esempi
Non valido a causa di un buco:
###
# #
###
Non valido a causa dell'intersezione (toccando in diagonale - un vertice con 4 bordi quadrati sul perimetro) e, per inciso, un foro:
##
# #
###
Non valido a causa della disconnessione:
#
# #
#
Poligono valido del perimetro massimo:
# #
# #
###
Titoli di coda
Inizialmente ho sottovalutato la rapidità con cui è stato possibile calcolare il valore del perimetro massimo e avrei semplicemente chiesto quel valore come output. Grazie alle persone meravigliosamente disponibili in chat per aver spiegato come elaborare il perimetro massimo per N e M arbitrari e aver contribuito a trasformare questo in una sfida che durerà per più di una risposta ...
In particolare grazie a:
Sparr , Zgarb , feersum , jimmy23013 .