Marching Squares è un algoritmo di computer grafica, che viene utilizzato per recuperare isocontours 2D da una griglia di campioni (vedi anche il suo fratello maggiore Marching Cubes per le impostazioni 3D). L'idea è di elaborare ogni cella della griglia in modo indipendente e determinare i contorni che attraversano quella cella in base ai valori ai suoi angoli.
Il primo passo in questo processo è determinare quali bordi sono collegati da contorni, in base al fatto che gli angoli siano al di sopra o al di sotto del valore del contorno. Per semplicità, prenderemo in considerazione solo i contorni lungo il valore 0, in modo tale da interessarci se gli angoli sono positivi o negativi. Ci sono casi per distinguere:24 = 16

Fonte immagine: Wikipedia
L'identificazione di bianco e nero non ha molta importanza qui, ma per sicurezza dire che il bianco è positivo e il nero è negativo. Ignoreremo i casi in cui uno degli angoli è esattamente 0.
I punti della sella (casi 5 e 10) forniscono una piccola difficoltà in più: non è chiaro quali diagonali debbano essere usate solo guardando gli angoli. Questo può essere risolto trovando la media dei quattro angoli (cioè un'approssimazione del valore centrale) e scegliendo le diagonali in modo tale che i contorni separino il centro dagli angoli con il segno opposto. Se la media è esattamente 0, è possibile scegliere entrambi i casi.
Normalmente, questi 16 casi sono semplicemente memorizzati in una tabella di ricerca. Questo è ottimo per l'efficienza, ma ovviamente preferiremmo che il codice fosse breve qui. Quindi il tuo compito è quello di eseguire questo passaggio di ricerca e stampare una rappresentazione ASCII del caso nel minor codice possibile.
La sfida
Ti vengono dati i valori dei quattro angoli (numeri interi diversi da zero) in un ordine fisso a tua scelta. Dovresti quindi generare il layout corretto dei contorni, risolvendo correttamente i casi dei punti della sella.
È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
L'input può essere preso in qualsiasi formato stringa o elenco conveniente.
I 16 casi saranno rappresentati nell'arte ASCII usando uno dei seguenti blocchi 5x5:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Non è necessario stampare spazi bianchi iniziali o finali, ma è possibile stampare una nuova riga opzionale.
Questo è il golf del codice, quindi vince la risposta più breve (in byte).
Casi test
I casi di test presuppongono che l'input sia dato nell'ordine in alto a sinistra , in alto a destra , in basso a sinistra , in basso a destra . I casi di test sono presentati in 9 gruppi, uno corrispondente a ciascuna delle 9 rappresentazioni fornite sopra (nello stesso ordine, a partire dalla cella vuota, per finire con i due punti della sella).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Inoltre, i seguenti casi di test possono restituire uno dei punti della sella (a scelta):
[1, -4, -2, 5]
[-1, 4, 2, -5]