MATL , 55 53 52 51 byte
|95cy4*Y"DXytPEt0*yvG0>?P_]!'\/ 'w)95JG|G0<yEq:++&(
Provalo online!
Spiegazione
Lasciate Ndenotare l'input. Il codice procede in tre passaggi.
Innanzitutto , la prima riga di caratteri di 4*Nsottolineatura è costruita come una stringa e viene visualizzata (che la rimuove dallo stack).
In secondo luogo , il "telaio" della tenda viene costruito utilizzando i due tipi di barre. Per fare ciò, viene creato un array 2D numerico che contiene 1e 2corrispondente ai due tipi di barre e 0per lo spazio.
Questo viene fatto concatenando quattro matrici:
- Una matrice di identità di dimensioni
abs (N);
- Una matrice della stessa dimensione contenente
2nell'antidiagonale;
- Una matrice nulla della stessa dimensione;
- Una copia della matrice 2.
La concatenazione verticale di queste quattro matrici fornisce, usando N=3come esempio, la seguente 4*N × Nmatrice:
1 0 0
0 1 0
0 0 1
0 0 2
0 2 0
2 0 0
0 0 0
0 0 0
0 0 0
0 0 2
0 2 0
2 0 0
(che, trasposto, inizia ad assomigliare alla tenda).
Ora ci occupiamo del segno dell'input. Se è positivo, trasponiamo semplicemente la matrice e l'indice sopra nella stringa '\/ '. L'indicizzazione è basata su 1 e modulare, quindi 1diventa '\', 2diventa '/'e 0diventa ' ', producendo l'array di caratteri 2D
\ / /
\ / /
\/ /
D'altra parte, se l'input è negativo, capovolgiamo verticalmente e neghiamo aritmeticamente la 4*N × Nmatrice, producendo
-2 0 0
0 -2 0
0 0 -2
0 0 0
0 0 0
0 0 0
-2 0 0
0 -2 0
0 0 -2
0 0 -1
0 -1 0
-1 0 0
L'indice -1ora fa riferimento a '/'e -2a '\'. Cioè, i due tipi di barre sono stati scambiati, come richiesto. Anche in questo caso trasporre e indicizzare nella stringa '\/ 'dà quindi alla tenda invertita:
\ \ /
\ \ /
\ \/
In terzo luogo , i caratteri di sottolineatura devono essere riempiti in parte dell'ultima riga dell'array di caratteri 2D. La posizione orizzontale di questa linea dipende dal segno dell'input e la sua lunghezza è abs(N).
Una volta che gli spazi corrispondenti sono stati sostituiti da caratteri di sottolineatura, il risultato viene visualizzato implicitamente, sotto la linea iniziale di caratteri di sottolineatura che era già visualizzata nel primo passaggio.
3?