Пип , 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
прибавление
Используя стратегию из моего Рисования пустого квадратного ответа, мы определяем функцию, которая переносит a +
в 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
?