p
là một hàm (loại đa hình lớp) lấy một hoán vị là một danh sách của Int
s và một danh sách lồng nhau đại diện cho một mảng nhiều chiều của Int
s.
Gọi là p [2,1] [[10,20,30],[40,50,60]]
, tuy nhiên nếu mặc định kiểu không thành công, bạn có thể phải thêm một chú thích kiểu như :: [[Int]]
(lồng nhau một cách thích hợp) đưa ra loại kết quả.
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
Hãy thử trực tuyến!
Thử thách chơi gôn với các mảng lồng nhau có độ sâu tùy ý là một chút lúng túng trong Haskell, bởi vì kiểu gõ tĩnh có xu hướng cản trở. Trong khi các danh sách Haskell (với cú pháp chính xác giống như trong mô tả thử thách) có thể được lồng tốt, các danh sách có độ sâu lồng khác nhau là các loại không tương thích. Ngoài ra, các hàm phân tích cú pháp Haskell tiêu chuẩn yêu cầu biết loại giá trị mà bạn đang cố phân tích.
Kết quả là, dường như không thể tránh khỏi chương trình cần bao gồm các khai báo liên quan đến kiểu, tương đối dài dòng. Đối với phần chơi gôn, tôi quyết định xác định một loại lớpP
, sao cho p
có thể là đa hình trên loại mảng.
Trong khi đó, khai thác thử nghiệm của TIO cho thấy một cách để khắc phục vấn đề phân tích cú pháp.
Làm thế nào nó hoạt động
Để tổng hợp bản chất của thuật toán này: Nó thực hiện sắp xếp bong bóng trong danh sách hoán vị, hoán vị các kích thước lân cận khi các chỉ số hoán vị tương ứng được hoán đổi.
Như được đưa ra bởi class P a
khai báo, trong mọi trường hợp, p
có hai đối số, một hoán vị (luôn luôn có kiểu [Int]
) và một mảng.
- Hoán vị có thể được đưa ra dưới dạng trong mô tả thách thức, mặc dù cách thức hoạt động của thuật toán, việc lựa chọn các chỉ số là tùy ý, ngoại trừ thứ tự tương đối của chúng. (Vì vậy, cả hai công việc dựa trên 0 và 1-.)
- Cơ sở
instance P Int
xử lý các mảng có thứ nguyên 1, p
chỉ đơn giản trả về không thay đổi, vì một chiều chỉ có thể được ánh xạ tới chính nó.
- Cái khác
instance P a => P [a]
được định nghĩa đệ quy, gọi p
với các thứ nguyên n thứ nguyên để xác định nó cho mảng n + 1 .
p(x:r)m
lần đầu tiên gọi p r
đệ quy trên mọi phần tử của m
, đưa ra một mảng kết quả n
trong đó tất cả các kích thước ngoại trừ thứ nguyên đầu tiên đã được hoán vị chính xác tương đối với nhau.
- Các hoán vị còn lại cần được thực hiện trên
n
được đưa ra bởi x:y:z = x:sort r
.
- Nếu
x<y
sau đó, kích thước đầu tiên n
đã được đặt chính xác và n
chỉ được trả về.
- Nếu
x>y
, thì chiều thứ nhất và thứ hai của n
nhu cầu được hoán đổi, được thực hiện với transpose
chức năng. Cuối cùng p(x:z)
được áp dụng đệ quy cho mọi yếu tố của kết quả, đảm bảo kích thước đầu tiên ban đầu được chuyển sang đúng vị trí.
exec
(lưu hai byte) , vì đó là câu lệnh trong Python 2.