Escreva um programa ou função que inclua uma lista de números inteiros positivos. Cada um desses números inteiros representa o comprimento lateral de um quadrado em um plano 2D. Cada quadrado pode ser movido para quaisquer coordenadas inteiras no plano, mas não pode girar e não pode se sobrepor a outros quadrados.
Usando um caractere ASCII imprimível diferente para cada quadrado (excluindo o espaço usado para o vazio), seu programa / função precisa imprimir qualquer arranjo único dos quadrados que possua uma linha horizontal ou vertical de simetria reflexiva. Se não existir esse arranjo, nada deverá ser impresso.
Os quadrados são caracteres diferentes, apenas para que possam ser separados. Somente a forma feita pela união de todos os quadrados precisa ser simétrica. Você pode assumir que a lista não conterá mais de 94 elementos (pois existem 94 caracteres).
Por exemplo, se a entrada foi [2, 1, 2, 2, 2]
, uma saída possível é:
DD--
DD--
Z
FFPP
FFPP
Essa forma tem uma linha horizontal de simetria reflexiva; suas metades superior e inferior são imagens espelhadas. Aqui estão algumas outras possibilidades: (Observe que os quadrados não precisam ser tocados e que qualquer caractere pode ser usado, desde que não sejam feitos dois quadrados do mesmo caractere.)
55
55
%%
%%
@
HH
HH
((
((
G
11 33
11 33
22 44
22 44
A linha de simetria também pode ser o limite entre os caracteres, por exemplo, para [2, 4]
:
!!!!
!!!! ++
!!!! ++
!!!!
Alguns conjuntos de quadrados são impossíveis de organizar simetricamente, por exemplo [1, 2, 3]
:
AAA BB C
AAA BB (these can't be vertically or horizontally symmetric => no output)
AAA
E lembre-se de que a forma geral pode ser simétrica, mesmo que os limites quadrados não sejam. por exemplo, uma saída válida para [2, 1, 1, 1, 1, 4]
é:
AA----
AA----
BC----
DE----
Da mesma forma, uma saída válida para [1, 1, 2, 3, 5]
é:
44444
44444
44444
44444
44444
33301
33322
33322
Notas
- A lista de entrada sempre terá de 1 a 94 elementos.
- Tome entrada de qualquer maneira razoável: stdin, linha de comando, arquivo de texto, função arg. Pode ser ligeiramente formatado para atender às suas necessidades, por exemplo,
{1, 2, 3, 4}
ou[1 2 3 4]
. - Saída para stdout ou similar. Quaisquer quantidades de espaços à esquerda / à direita ou novas linhas são boas, desde que a forma resultante tenha a linha de simetria.
- Uma linha diagonal de simetria não conta (caso contrário, isso seria super fácil). Além disso, tem que ser simetria reflexiva, não rotacional ou transitória.
- Sinceramente, não tenho certeza do quão computacionalmente difícil essa tarefa é. Você pode postar respostas parciais que resolvem algum subconjunto do problema (especialmente se você quiser exibir um algoritmo particularmente inteligente). Estes não são elegíveis para ganhar.
- Por exemplo, você pode supor que a entrada sempre tenha pelo menos um arranjo simétrico (portanto, listas como
[1, 2, 3]
nunca são inseridas). - Ou, por exemplo, você pode considerar apenas arranjos em que os limites quadrados, bem como a forma geral, são simétricos. Nesse caso,
[1, 1, 2, 3, 5]
não teria saída. - Se você quiser enlouquecer, pode estender a idéia para retângulos ou até poliaminos .
- Por exemplo, você pode supor que a entrada sempre tenha pelo menos um arranjo simétrico (portanto, listas como
Pontuação
Sua pontuação é o tamanho do seu programa em bytes . A pontuação mais baixa vence. O desempatador segue a resposta postada primeiro.
[2, 4, 6, 7, 8, 9, 11, 15, 16, 17, 18, 19, 24, 25, 27, 29, 33, 35, 37, 42, 50, 112]
, embora, como a pergunta dê muito mais liberdade, provavelmente haja outras soluções.