Pip , 62 59 56 Bytes
55 Byte Code, +1 für -S
Flag.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Beachten Sie, dass diese Lösung funktioniert mit Eingang ÷
für die Division und *
für die Multiplikation, obwohl es diese Zeichen verwendet ASCII-Kunst zu ziehen /
und x
jeweils. OP hat klargestellt, dass dies in Ordnung ist. Probieren Sie es online!
Wie?
Hier ist eine teilweise beabstandete und kommentierte Version . Beachten Sie, dass a
und b
die Befehlszeilenargumente sind, dh der Operator bzw. die Größe. Das -S
Flag steuert, wie Listen ausgegeben werden: Es verbindet sich zuerst in Zeilenumbrüchen, verbindet sich jedoch mit verschachtelten Listen in Leerzeichen.
[ 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
Und hier sind die einzelnen Abschnitte:
Multiplikation
Für jede Zeile in der Figur erzeugen wir eine Folge von Leerzeichen und ersetzen dann zwei durch das Eingabezeichen. Für row i
möchten wir die Leerzeichen bei index i
und ersetzen b-1-i
. Beachten Sie jedoch, dass dieser den negativen Index verwenden kann -1-i
. (Es ist sogar noch kürzer , da die Variable v
zu negati vorinitialisiert ist 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
Zusatz
Mit Hilfe der Strategie von meiner Zeichnen Sie eine leere Quadrat Antwort definieren wir eine Funktion , die eine Wraps +
in b/2
Kopien ihres Arguments und gibt das Ergebnis als eine Liste von Zeichen. (Eine Ganzzahldivision //
ist nicht erforderlich, da der Operator für die Zeichenfolgenwiederholung X
automatisch auf eine Ganzzahl abschneidet.) Zuerst rufen wir diese Funktion für ein Leerzeichen auf und geben [" ";" ";"+";" ";" "]
; dann ordnen wir diesem Ergebnis die gleiche Funktion zu, wobei wir [" ";" ";"+";" ";" "]
auf den meisten Linien aber ["+";"+";"+";"+";"+"]
auf der Mittellinie angeben. Diese verschachtelte Liste wird dann aufgrund des -S
Flags mit Leerzeichen zwischen allen Zeichen in einer Zeile und Zeilenumbrüchen zwischen den Zeilen ausgegeben.
(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
Teilung
Jede Zeile enthält zwischen b-1
und 0
Leerzeichen, gefolgt vom Eingabezeichen 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
Subtraktion
Erstellen Sie eine durch Leerzeichen getrennte Zeile des Eingabezeichens. Speichern Sie eine Kopie für später.
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
Gleich
Der Subtraktionsschritt speicherte die Hälfte dessen, was wir brauchen y
- verdoppeln Sie ihn einfach.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
Die Dummy- x
Werte dienen zum Auffüllen der Hauptliste, sodass die modulare Indizierung einen eindeutigen Index für jedes eingegebene Zeichen in ergibt +-*÷=
.
= 10
?