Pip , 62 59 56 byte
55 byte di codice, +1 per la -Sbandiera.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Si noti che questa soluzione funziona con ingresso ÷per divisione e *per la moltiplicazione, sebbene utilizzi tali caratteri ASCII per disegnare dell'arte /e x, rispettivamente. OP ha chiarito che va bene. Provalo online!
Come?
Ecco un parzialmente distanziata e commentata . Si noti che ae bsono gli argomenti della riga di comando, cioè l'operatore e le dimensioni rispettivamente. Il -Sflag controlla la modalità di output degli elenchi: si unisce prima ai newline, ma unisce tutti gli elenchi nidificati negli spazi.
[ Build a list of all possible figures:
sXbRA_AEv-_aM,b 0 - Multiplication
(Y^aWR_Xb/2s)My 1 - Addition
RVsX,b.a 2 - Division
YaXbJs 3 - Subtraction
x 4 - Empty
yRL2 5 - Equals
x 6 - Empty
] @ Aa Index, mod 7, with ASCII value of a
Ed ecco le singole sezioni:
Moltiplicazione
Per ogni riga nella figura, generiamo una stringa di spazi e quindi sostituiamo due di essi con il carattere di input. Per riga i, vogliamo sostituire gli spazi nell'indice ie b-1-i; ma nota che quest'ultimo può usare l'indice negativo -1-i. (È ancora più breve perché la variabilev è preinizializzata in negati v e 1.)
sXbRA_AEv-_aM,b
M,b Map this function to range(b):
sXb Space, repeated b times
_ Function arg
AE (Implicitly) convert to list and append element...
v-_ -1 minus function arg
RA Replace the characters at those indices...
a ... with input character
The resulting list is output with one item per line
aggiunta
Usando la strategia dal mio Disegna una risposta quadrata vuota , definiamo una funzione che racchiude +in b/2copie del suo argomento e restituisce il risultato come un elenco di caratteri. (La divisione dei numeri interi //non è necessaria perché l'operatore di ripetizione delle stringhe Xsi tronca automaticamente in numero intero.) Innanzitutto, chiamiamo questa funzione su uno spazio, dando [" ";" ";"+";" ";" "]; quindi, mappiamo la stessa funzione a quel risultato, dando [" ";" ";"+";" ";" "]sulla maggior parte delle linee ma ["+";"+";"+";"+";"+"]sulla linea centrale. Questo elenco nidificato viene quindi emesso, a causa del -Sflag, con spazi tra tutti i caratteri su una riga e le nuove righe tra le righe.
(Y^aWR_Xb/2s)My
Anonymous function:
_Xb/2 Function arg, repeated b/2 times (implicitly rounded down)
aWR Wrap a in two copies of the above
^ Split resulting string into list of chars
Y Yank that function into y
( s) Apply function y to space
My Map y to that result
Divisione
Ogni riga ha spazi tra b-1e 0, seguiti dal carattere di input a.
RVsX,b.a
,b Range(b)
sX Space, repeated that many times (works itemwise)
.a Concatenate a (itemwise)
RV Reverse (puts the larger number of spaces at the beginning)
Outputs newline-separated
Sottrazione
Crea una riga separata dallo spazio del carattere di input. Salva una copia per dopo.
YaXbJs
aXb b copies of a
Js Join on space
Y Yank into y (overwrites the function from earlier, but we're done using it anyway)
This is a string, so it just gets output
È uguale a
La fase di sottrazione memorizzava la metà di ciò di cui abbiamo bisogno - ysolo il doppio.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
I xvalori fittizi sono lì per riempire l'elenco principale in modo che l'indicizzazione modulare fornisca un indice univoco per ciascun carattere di input in +-*÷=.
= 10?