Scrivi un programma o una funzione che contiene un elenco di numeri interi positivi. Ognuno di questi numeri interi rappresenta la lunghezza laterale di un quadrato su un piano 2D. Ogni quadrato può essere spostato su qualsiasi coordinata intera nel piano, ma non può ruotare e non può sovrapporsi ad altri quadrati.
Utilizzando un diverso carattere ASCII stampabile per ogni quadrato (escluso lo spazio utilizzato per il vuoto), il programma / funzione deve stampare ogni singola disposizione dei quadrati che abbia una linea orizzontale o verticale di simmetria riflettente. Se tale disposizione non esiste, non è necessario stampare nulla.
I quadrati sono personaggi diversi solo per poter essere separati. Solo la forma creata dall'unione di tutti i quadrati deve essere simmetrica. Puoi presumere che l'elenco non conterrà più di 94 elementi (poiché ci sono 94 caratteri).
Ad esempio, se l'input fosse [2, 1, 2, 2, 2]
, un possibile output è:
DD--
DD--
Z
FFPP
FFPP
Questa forma ha una linea orizzontale di simmetria riflettente; le sue metà superiore e inferiore sono immagini speculari. Ecco alcune altre possibilità: (Nota che i quadrati non devono essere toccati e che tutti i personaggi possono essere usati purché non siano fatti due quadrati dello stesso personaggio.)
55
55
%%
%%
@
HH
HH
((
((
G
11 33
11 33
22 44
22 44
La linea di simmetria potrebbe anche essere il confine tra i caratteri, ad esempio per [2, 4]
:
!!!!
!!!! ++
!!!! ++
!!!!
Alcuni insiemi di quadrati sono impossibili da disporre simmetricamente, ad esempio [1, 2, 3]
:
AAA BB C
AAA BB (these can't be vertically or horizontally symmetric => no output)
AAA
E ricorda che la forma complessiva può essere simmetrica anche se non lo sono i confini quadrati. ad es. un output valido per[2, 1, 1, 1, 1, 4]
è:
AA----
AA----
BC----
DE----
Allo stesso modo, un output valido per [1, 1, 2, 3, 5]
è:
44444
44444
44444
44444
44444
33301
33322
33322
Appunti
- L'elenco di input avrà sempre da 1 a 94 elementi.
- Prendi l'input in modo ragionevole: stdin, riga di comando, file di testo, funzione arg. Può essere leggermente formattato per soddisfare le tue esigenze, ad esempio
{1, 2, 3, 4}
o[1 2 3 4]
. - Uscita su stdout o simile. Qualsiasi quantità di spazi iniziali o finali o di nuove linee va bene purché la forma risultante abbia la linea di simmetria.
- Una linea diagonale di simmetria non conta (altrimenti sarebbe super facile). Inoltre, deve essere una simmetria riflessiva, non rotazionale o di transizione.
- Onestamente non sono sicuro di quanto sia difficile dal punto di vista computazionale. È possibile pubblicare risposte parziali che risolvono alcuni sottogruppi del problema (soprattutto se si desidera mostrare un algoritmo particolarmente intelligente). Questi non sono idonei a vincere.
- Ad esempio, potresti supporre che l'input abbia sempre almeno una disposizione simmetrica (quindi elenchi come
[1, 2, 3]
non vengono mai inseriti). - Oppure, ad esempio, puoi prendere in considerazione solo le disposizioni in cui i contorni quadrati, nonché la forma complessiva, sono simmetrici. In questo caso,
[1, 1, 2, 3, 5]
avrebbe alcun output. - Se vuoi impazzire, potresti estendere l'idea a rettangoli o persino a poliomino .
- Ad esempio, potresti supporre che l'input abbia sempre almeno una disposizione simmetrica (quindi elenchi come
punteggio
Il tuo punteggio è la dimensione del programma in byte . Vince il punteggio più basso. Tiebreaker risponde per prima.
[2, 4, 6, 7, 8, 9, 11, 15, 16, 17, 18, 19, 24, 25, 27, 29, 33, 35, 37, 42, 50, 112]
, anche se poiché la domanda dà molta più libertà probabilmente ci sono altre soluzioni.