Pip , 62 59 56 octets
55 octets de code, +1 pour l' -S
indicateur.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Notez que cette solution fonctionne avec l'entrée de ÷
pour la division et *
pour la multiplication, bien qu'elle utilise ces caractères pour dessiner l'art ASCII /
et x
, respectivement. OP a clarifié que cela allait. Essayez-le en ligne!
Comment?
Voici une version partiellement espacée et commentée . Notez que a
et b
sont les arguments de la ligne de commande, c'est-à-dire l'opérateur et la taille respectivement. L' -S
indicateur contrôle la façon dont les listes sont sorties: il rejoint d'abord les sauts de ligne, mais joint toutes les listes imbriquées sur les espaces.
[ 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
Et voici les sections individuelles:
Multiplication
Pour chaque ligne de la figure, nous générons une chaîne d'espaces, puis remplaçons deux d'entre eux par le caractère d'entrée. Pour la ligne i
, nous voulons remplacer les espaces à l'index i
et b-1-i
; mais notez que ce dernier peut utiliser l'indice négatif -1-i
. (Il est encore plus court car la variable v
est préinitialisée à 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
Une addition
En utilisant la stratégie de mon Dessinez un carré creux réponse, on définit une fonction qui enveloppe un +
dans des b/2
copies de son argument et renvoie le résultat sous la forme d' une liste de caractères. (La division entière //
n'est pas nécessaire car l'opérateur de répétition de chaînes X
tronque automatiquement en entier.) Premièrement, nous appelons cette fonction sur un espace, donnant [" ";" ";"+";" ";" "]
; ensuite, nous mappons la même fonction à ce résultat, donnant [" ";" ";"+";" ";" "]
sur la plupart des lignes mais ["+";"+";"+";"+";"+"]
sur la ligne centrale. Cette liste imbriquée est ensuite sortie, en raison de l' -S
indicateur, avec des espaces entre tous les caractères d'une ligne et des sauts de ligne entre les lignes.
(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
Division
Chaque ligne a entre b-1
et des 0
espaces, suivis du caractère saisi 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
Soustraction
Créez une ligne séparée par des espaces du caractère saisi. Enregistrez une copie pour plus tard.
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
Équivaut à
L'étape de soustraction a stocké la moitié de ce dont nous avons besoin - y
juste le doubler.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
Les x
valeurs fictives sont là pour remplir la liste principale afin que l'indexation modulaire donne un index unique pour chaque caractère d'entrée dans +-*÷=
.
= 10
?