Піп , 62 59 56 байт
55 байт коду, +1 для -S
прапора.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Зауважте, що це рішення працює з введенням ÷
для ділення та *
для множення, хоча воно використовує ці символи для малювання ASCII-art /
і x
, відповідно. ОП уточнила, що це нормально. Спробуйте в Інтернеті!
Як?
Ось частково розміщена та коментована версія . Зауважте, що a
і b
є аргументи командного рядка, тобто оператор та розмір відповідно. В -S
управлінні прапором , як списки вихід: він з'єднує на першому символ нового рядка, але з'єднує будь-які вкладені списки на просторах.
[ 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
Ось окремі розділи:
Множення
Для кожного рядка на рисунку генеруємо рядок пробілів, а потім замінюємо два з них на вхідний символ. Для рядка i
ми хочемо замінити пробіли в індексі i
та b-1-i
; але зауважте, що останні можуть використовувати негативний індекс -1-i
. (Це ще коротше, тому що змінна v
попередньо ініціалізується на 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
Доповнення
Використовуючи стратегію з моєї відповіді « Намалювати порожній квадрат» , ми визначаємо функцію, яка обертає +
в b/2
копії свого аргументу і повертає результат у вигляді списку символів. (Поділ цілого числа //
не потрібний, оскільки оператор повторення рядків X
автоматично скорочується до цілого числа.) Спочатку ми називаємо цю функцію на пробілі, даючи [" ";" ";"+";" ";" "]
; тоді ми відображаємо ту саму функцію до цього результату, надаючи [" ";" ";"+";" ";" "]
на більшості ліній, але ["+";"+";"+";"+";"+"]
на центральній лінії. Цей вкладений список виводиться через -S
прапор із пробілами між усіма символами в рядку та новими рядками між рядками.
(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
Відділ
У кожному рядку є пробіли b-1
та 0
пробіли, за якими вводиться символ введення 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
Віднімання
Складіть розділений пробілом рядок вхідного символу. Збережіть копію на потім.
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
Дорівнює
Крок віднімання зберігає половину того, що нам потрібно - y
просто подвоїти його.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
Макетні x
значення знаходяться там, щоб замінити основний список, щоб модульна індексація давала унікальний індекс для кожного вхідного символу +-*÷=
.
= 10
?