Pip , 62 59 56 bytes
55 bytes de código, +1 para -S
bandera.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Tenga en cuenta que esta solución funciona con la entrada de ÷
para división y *
multiplicación, aunque utiliza esos caracteres para dibujar ASCII-art /
y x
, respectivamente. OP ha aclarado que esto está bien.Pruébalo en línea!
¿Cómo?
Aquí hay una versión parcialmente separada y comentada . Tenga en cuenta que a
y b
son los argumentos de la línea de comandos, es decir, el operador y el tamaño, respectivamente. El -S
indicador controla cómo se generan las listas: primero se une a las nuevas líneas, pero se une a cualquier lista anidada en los espacios.
[ 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
Y aquí están las secciones individuales:
Multiplicación
Para cada fila de la figura, generamos una cadena de espacios y luego reemplazamos dos de ellos con el carácter de entrada. Para la fila i
, queremos reemplazar los espacios en el índice i
y b-1-i
; pero tenga en cuenta que este último puede usar el índice negativo -1-i
. (Es aún más corto porque la variable v
está preinicializada a 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
Adición
Usando la estrategia de mi Draw a hollow square answer, definimos una función que envuelve a +
en b/2
copias de su argumento y devuelve el resultado como una lista de caracteres. (La división de enteros //
no es necesaria porque el operador de repetición de cadenas X
se trunca automáticamente a entero). Primero, llamamos a esta función en un espacio, dando [" ";" ";"+";" ";" "]
; luego, asignamos la misma función a ese resultado, dando [" ";" ";"+";" ";" "]
en la mayoría de las líneas pero ["+";"+";"+";"+";"+"]
en la línea central. Esta lista anidada se genera, debido a la -S
bandera, con espacios entre todos los caracteres en una fila y líneas nuevas entre filas.
(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
División
Cada fila tiene espacios entre b-1
y 0
, seguidos del carácter de entrada 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
Sustracción
Haga una fila separada por espacios del carácter de entrada. Guarda una copia para más tarde.
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
Igual a
El paso de resta almacenó la mitad de lo que necesitamos, y
solo el doble.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
Los x
valores ficticios están allí para rellenar la lista principal de modo que la indexación modular proporcione un índice único para cada carácter de entrada +-*÷=
.
= 10
?