Pip , 62 59 56 bajtów
55 bajtów kodu, +1 dla -Sflagi.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Zauważ, że to rozwiązanie działa z danymi wejściowymi ÷dla dzielenia i *mnożenia, chociaż używa tych znaków do rysowania odpowiednio ASCII-art /i x. OP wyjaśniła, że to w porządku.Wypróbuj online!
W jaki sposób?
Oto częściowo rozstawiona i skomentowana wersja . Zauważ, że ai bsą argumentami wiersza poleceń, tj. Odpowiednio operatorem i rozmiarem. Te -Skontrole flag jak wykazy są wyprowadzane: łączy się na nowej linii pierwszej, ale dołącza żadnych zagnieżdżonych list na przestrzeniach.
[ 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
A oto poszczególne sekcje:
Mnożenie
Dla każdego wiersza na rysunku generujemy ciąg spacji, a następnie zastępujemy dwa z nich znakiem wejściowym. W przypadku wiersza ichcemy zastąpić spacje indeksem ii b-1-i; ale pamiętaj, że ten ostatni może używać indeksu ujemnego -1-i. (Jest nawet krótszy, ponieważ zmienna vjest wstępnie zainicjalizowana na 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
Dodanie
Stosując strategię z mojego Draw wydrążony kwadratowy odpowiedź, możemy zdefiniować funkcję, która owija +w b/2kopii jej argument i zwraca wynik w postaci listy znaków. (Dzielenie liczb całkowitych //nie jest konieczne, ponieważ operator powtarzania łańcuchów Xautomatycznie obcina się do liczb całkowitych.) Najpierw wywołujemy tę funkcję na spacji, podając [" ";" ";"+";" ";" "]; następnie mapujemy tę samą funkcję do tego wyniku, podając [" ";" ";"+";" ";" "]na większości linii, ale ["+";"+";"+";"+";"+"]na linii środkowej. Ta zagnieżdżona lista jest następnie wyprowadzana, z powodu -Sflagi, ze spacjami między wszystkimi znakami w wierszu i znakami nowej linii między wierszami.
(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
Podział
Każdy wiersz ma między b-1i 0spacje, po których następuje znak wejściowy 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
Odejmowanie
Utwórz oddzielony spacją wiersz znaku wejściowego. Zapisz kopię na później.
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
Równa się
Krok odejmowania przechowywał połowę tego, czego potrzebujemy - po yprostu dwukrotnie.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
Wartości zastępcze xsłużą do uzupełnienia głównej listy, dzięki czemu modułowe indeksowanie daje unikalny indeks dla każdego wprowadzanego znaku +-*÷=.
= 10?