Pip , 62 59 56 byte
55 byte kode, +1 untuk -S
bendera.
[sXbRA_AEv-_aM,b(Y^aWR_Xb/2s)MyRVsX,b.aYaXbJsxyRL2x]@Aa
Perhatikan bahwa solusi ini bekerja dengan input ÷
untuk divisi dan *
untuk perkalian, meskipun menggunakan karakter tersebut untuk menggambar ASCII-art /
dan x
, masing-masing. OP telah mengklarifikasi bahwa ini baik-baik saja. Cobalah online!
Bagaimana?
Inilah versi yang diberi spasi dan dikomentari sebagian . Catat itu a
dan b
merupakan argumen baris perintah, yaitu operator dan ukurannya masing-masing. The -S
kontrol bendera bagaimana daftar adalah output: itu bergabung pada baris pertama, tetapi bergabung setiap daftar bersarang pada ruang.
[ 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
Dan inilah bagian-bagiannya:
Perkalian
Untuk setiap baris dalam gambar, kami menghasilkan string spasi dan kemudian ganti dua dengan karakter input. Untuk baris i
, kami ingin mengganti spasi di indeks i
dan b-1-i
; tetapi perhatikan bahwa yang terakhir dapat menggunakan indeks negatif -1-i
. (Ini bahkan lebih pendek karena variabel v
diinisialisasi ke 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
Tambahan
Menggunakan strategi dari saya Gambarlah persegi berongga jawaban, kita mendefinisikan sebuah fungsi yang membungkus +
di b/2
salinan argumen dan mengembalikan hasil sebagai daftar karakter. (Divisi integer //
tidak diperlukan karena operator pengulangan string X
secara otomatis memotong ke integer.) Pertama, kita memanggil fungsi ini pada spasi, memberi [" ";" ";"+";" ";" "]
; kemudian, kami memetakan fungsi yang sama untuk hasil itu, memberi [" ";" ";"+";" ";" "]
pada sebagian besar garis tetapi ["+";"+";"+";"+";"+"]
pada garis tengah. Daftar bersarang ini kemudian di-output, karena -S
flag, dengan spasi di antara semua karakter di baris dan baris baru di antara baris.
(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
Divisi
Setiap baris memiliki antara b-1
dan 0
spasi, diikuti oleh karakter input 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
Pengurangan
Buat baris karakter input yang dipisahkan spasi. Simpan salinan untuk nanti.
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
Sama dengan
Langkah pengurangan disimpan setengah dari apa yang kita butuhkan di - cukup y
gandakan.
yRL2 (Implicitly) convert y to list and repeat it twice
Outputs newline-separated
x
Nilai-nilai dummy ada untuk pad daftar utama sehingga pengindeksan modular memberikan indeks unik untuk setiap karakter input di +-*÷=
.
= 10
?