B←{'/\ '['\/'⍳⍺⍺⍵]}
C←⊢,⌽B
C(⊢⍪⊖B)⊃,/{C⊖A↑⊖' /'[⍵≤∘.+⍨⍳⍵+1]}¨⌽⍳A←⎕
Hãy thử trực tuyến!
Giả sử ⎕IO←0
, là tiêu chuẩn trên nhiều hệ thống, vì vậy chương trình được lập chỉ mục 0.
Đây là một tradfn nhận đầu vào thông qua STDIN.
Giải trình
(hơi lỗi thời)
Lưu ý rằng đó ⍺
là đối số bên trái, ⍵
là đối số bên phải và ⍺⍺
là toán tử bên trái.
B
là một chức năng giúp phản chiếu những viên kim cương. Nó nhận chuỗi là đối số bên phải và hàm ngược lại là bên trái ( B
toán tử cũng vậy).
B←{'/\ '['\/'⍳⍺⍺⍵]}
⍺⍺⍵ Apply ⍺⍺ on ⍵
'\/'⍳ Find the index of the reflected string in '\/' (if the character is not found in `'\/'`, then return an index out of the bounds of the string, ie `2` if the character is a space)
'/\ '[ ] Use these indexes on '/\ ' to reflect the '/\' characters
Và bây giờ chúng ta đi đến phần chính của chương trình.
A←⎕ Assign the input to variable A
⍳ Create a range 0 .. A-1
⌽ Reverse it so that it becomes A-1 .. 0
¨ For each element do (the right argument is the element):
⍳⍵+1 Create a range 0 .. ⍵
∘.+⍨ Create an addition table using the range to result in a matrix like so:
0+0 0+1 0+2 .. 0+⍵
1+0 1+1 1+2 .. 1+⍵
2+0 2+1 2+2 .. 2+⍵
...
⍵+0 ⍵+1 ⍵+2 .. ⍵+⍵
⍵≤ The elements of the matrix that are greater than or equal to the ⍵,
this creates a triangle matrix that looks like this:
0 0 .. 0 1
0 0 .. 1 1
..
1 1 .. 1 1
' /'[...] Index it in ' /' to get a character matrix
(ie replace 0s with spaces and 1s with '/'s)
⊖ Flip this vertically
A↑ Pad the top spaces
Điều này là cần thiết để đảm bảo rằng tất cả các hình tam giác được tạo cho mọi phần tử trong phạm vi ⌽⍳A
có cùng chiều cao để sau này chúng có thể được nối với nhau.
⊖ Flip the matrix vertically again to go back to the original state
(⊢, ) Concatenate it with
⌽B itself, but flipped horizontally
,/ Concatenate all triangles formed by the range operator
⊃ The resulting matrix is nested, so this operator "un-nests" it
Bây giờ phần trên cùng bên trái của mẫu đã hoàn thành. Tất cả những gì còn lại là lật nó theo chiều dọc và sau đó theo chiều ngang.
(⊢⍪⊖B) Concatenate the resulting matrix with itself but flipped vertically
(the vertically flipped matrix is concatenated below of the original matrix)
Now the left part of the pattern is complete
(⊢,⌽B) Concatenate the resulting matrix with itself flipped horizontally
Và đó là nó! Đầu ra là một ma trận ký tự có /\
s và được đệm bằng khoảng trắng.