Pip , 62 59 56 bytes
55 bytes de código, +1 para -S
sinalizador.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Observe que esta solução funciona com entrada de ÷
para divisão e *
multiplicação, embora use esses caracteres para desenhar ASCII-art /
e x
, respectivamente. O OP esclareceu que está tudo bem. Experimente online!
Quão?
Aqui está uma versão parcialmente espaçada e comentada . Observe que a
e b
são os argumentos da linha de comando, ou seja, o operador e o tamanho, respectivamente. O -S
sinalizador controla como as listas são produzidas: ele se une às novas linhas primeiro, mas se une a qualquer lista aninhada nos espaços.
[ 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
E aqui estão as seções individuais:
Multiplicação
Para cada linha da figura, geramos uma sequência de espaços e substituímos dois deles pelo caractere de entrada. Para linha i
, queremos substituir os espaços no índice i
e b-1-i
; mas observe que o último pode usar o índice negativo -1-i
. (É ainda mais curto porque a variável v
é pré-inicializada para 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
Adição
Usando a estratégia de minha resposta Desenhar um quadrado vazio , definimos uma função que envolve a +
em b/2
cópias de seu argumento e retorna o resultado como uma lista de caracteres. (A divisão inteira //
não é necessária porque o operador de repetição de string é X
automaticamente truncado para inteiro.) Primeiro, chamamos essa função em um espaço, dando [" ";" ";"+";" ";" "]
; então, mapeamos a mesma função para esse resultado, fornecendo [" ";" ";"+";" ";" "]
na maioria das linhas, mas ["+";"+";"+";"+";"+"]
na linha central. Essa lista aninhada é gerada, devido ao -S
sinalizador, com espaços entre todos os caracteres em uma linha e novas linhas entre as linhas.
(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
Divisão
Cada linha tem entre b-1
e 0
espaços, seguidos pelo caractere 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
Subtração
Faça uma linha separada por espaço do caractere de entrada. Salve uma cópia para mais 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
O passo da subtração armazenava metade do que precisamos - y
apenas o dobro.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
Os x
valores fictícios estão lá para preencher a lista principal, para que a indexação modular forneça um índice exclusivo para cada caractere de entrada +-*÷=
.
= 10
?