Mảng đường chéo Golfscript


11

Có cách nào trong Golfscript để đưa tất cả các đường chéo của một mảng thành một mảng không?

Ví dụ, cho mảng

[[1 2 3][4 5 6][7 8 9]]

trở về

[[7][4 8][1 5 9][2 6][3]]

(không nhất thiết phải theo thứ tự đó) và cho

["ABCD""EFGH""IJKL"]

trở về

["I""EJ""AFK""BGL""CH""D"]

(Không nhất thiết phải theo thứ tự đó). Giả sử độ dài của các mảng là như nhau.

Tôi đang vật lộn với việc tìm ra nó. Tôi đã thử làm một cái gì đó với =và lặp lại thông qua (length+1)ký tự thứ của chuỗi, nhưng điều đó không hiệu quả. Ai đó có thể giúp tôi?

Tôi muốn cách ngắn nhất để làm điều này, nếu có thể.


Đây không phải là trang web hỏi đáp thường xuyên của bạn; bạn cần phải có một tiêu chí chiến thắng Tôi đề nghị một nội dung phổ biến cho người mới bắt đầu.
Timtech

@Timtech Tôi hiểu. Tôi sẽ thử stackexchange thường xuyên.
Josiah Winslow

7
Các câu hỏi tư vấn về golf dành riêng cho ngôn ngữ đã chính thức về chủ đề: meta.codegolf.stackexchange.com/a/1725/20260
xnor

5
@xnor Bạn liên kết với câu trả lời sai ở đó. Đó là một trong những danh sách những lời khuyên chúng tôi có. Nhưng yêu cầu lời khuyên cụ thể cũng là về chủ đề vì vậy sẽ tốt hơn nếu mọi người có thể ngừng hạ thấp và đóng phiếu bầu này.
Martin Ender

7
@steveverrill Tôi không đồng ý rằng những điều này nên được thực hiện CW. Điều đó chỉ áp dụng cho các câu hỏi trong danh sách (trên thực tế, tôi thậm chí không đồng ý rằng những câu hỏi đó phải là CW), nhưng thực sự không có lý do nào cho câu hỏi tư vấn cụ thể về CW - về cơ bản chúng là các cuộc thi golf tối ưu hóa vi mô và mọi người trả lời họ xứng đáng được đại diện cho nó (cũng như người hỏi, nếu câu hỏi là thú vị).
Martin Ender

Câu trả lời:


8

Xem xét

[
    "ABCD"
    "EFGH"
    "IJKL"
]

Để có được đường chéo chính và các đường chéo phía trên nó, chúng ta có thể dịch chuyển char đầu tiên của hàng thứ hai và hai đầu tiên của thứ ba:

[
    "ABCD"
    "FGH"
    "KL"
]

Lưu ý rằng tất cả các cột tương ứng với một đường chéo, do đó, "nén" mảng (nghĩa là các hàng và cột hoán vị) sẽ tạo ra một mảng chứa bốn đường chéo đã nói ở trên:

[
    "AFK"
    "BGL"
    "CH"
    "D"
]

Chúng ta vẫn còn thiếu các đường chéo bên dưới đường chéo chính.

Nếu chúng ta nén chính A và lặp lại quy trình trên, chúng ta sẽ có được một mảng chứa đường chéo chính và tất cả các đường chéo bên dưới nó. Tất cả chỉ còn lại nó để tính tập hợp của cả hai mảng.

Để tất cả chúng cùng nhau:

[.zip]{:A,,{.A=>}%zip}/|


[.zip]{              }/  # For the original array and it's transpose, do the following:
       :A                # Store the array in A.
         ,,{    }%       # For each I in [ 0 1 ... len(A) ], do the following:
            .A=>         # Push A[I] and shift out its first I characters.
                  zip    # Transpose the resulting array.
                       | # Perform set union.

Hãy thử trực tuyến.

Cuối cùng, nếu chúng ta chỉ cần các đường chéo vì chúng ta đang tìm kiếm một chuỗi bên trong chúng (như trong Câu đố tìm kiếm từ mà tôi cho là đã truyền cảm hứng cho câu hỏi này), một cách tiếp cận "ít sạch hơn" cũng có thể phù hợp.

Bạn có thể dùng

..,n**\.0=,\,+)/zip

để có được tất cả các đường chéo, cộng với một số ký tự dòng không cần thiết.

Tôi đã giải thích quá trình chi tiết trong câu trả lời này .

Hãy thử trực tuyến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.