Vũ điệu của nhiều chiều


19

Thử thách

Cho một nmảng các số nguyên và hoán vị của các nsố tự nhiên đầu tiên , hoán vị các kích thước mảng tương ứng.

Chi tiết

Thử thách này được lấy cảm hứng từ MATLAB permute. trình diễn Phép hoán vị được đưa ra dưới dạng danh sách các số nguyên, ví dụ: [1,3,2]1 được ánh xạ thành 1, 2 được ánh xạ thành 3 và 3 được ánh xạ thành 2 (ở đây imục nhập là giá trị iđược ánh xạ tới). Nhưng bạn có thể sử dụng các định dạng khác thuận tiện, ví dụ như chu kỳ hoặc như một chức năng. Nếu thuận tiện hơn, bạn cũng có thể sử dụng lập chỉ mục dựa trên 0.

Mảng có thể được coi là một "hình chữ nhật" đầy đủ m1 x m2 x ... x mn(nghĩa là bạn có thể cho rằng nó không bị rách / lởm chởm ).

Bạn có thể cho rằng nnó không quá lớn, vì nhiều ngôn ngữ có giới hạn số lượng kích thước trong một mảng lồng nhau.

Nếu ngôn ngữ của bạn không hỗ trợ các mảng nhiều chiều, bạn cũng có thể lấy một chuỗi đại diện cho mảng làm đầu vào.

Ví dụ

  • Bất kỳ nmảng hai chiều nào với hoán vị danh tính [1,2,3,...,n]sẽ không thay đổi.
  • Các mảng [[10,20,30],[40,50,60]]với hoán vị [2,1]được ánh xạ tới [[10,40],[20,50],[30,60]].
  • Các mảng [[[1,2],[3,4]],[[5,6],[7,8]]]với hoán vị [2,3,1]được ánh xạ tới [[[1,3],[5,7]],[[2,4],[6,8]]].

Câu trả lời:



9

Haskell , 168 byte

plà 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 Ints và một danh sách lồng nhau đại diện cho một mảng nhiều chiều của Ints.

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 pcó 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 akhai báo, trong mọi trường hợp, pcó 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 Intxử lý các mảng có thứ nguyên 1, pchỉ đơ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 pvới các thứ nguyên n thứ nguyên để xác định nó cho mảng n + 1 .
    • p(x:r)mlầ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ả ntrong đó 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<ysau đó, kích thước đầu tiên nđã được đặt chính xác và nchỉ được trả về.
    • Nếu x>y, thì chiều thứ nhất và thứ hai của nnhu cầu được hoán đổi, được thực hiện với transposechứ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í.

3

Python 2 , 312 byte

Điều này sử dụng chỉ mục 0 cho hoán vị

from numpy import*
from itertools import*
z=range
def f(i,r):
	l=array(i).shape;R={b:a for a,b in enumerate(r)};r=len(r);m=eval('['*r+'0'+q('for k in z(l[R[%s]])]',r-1,-1,-1))
	for d in product(*[z(p) for p in l]):exec'm'+q('[d[R[%s]]]',r)+'=i'+q('[d[%s]]',r)
	return m
q=lambda s,*j:''.join(s%(j)for j in z(*j))

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

-2 byte nhờ @Jonathan Frech.


Bạn không cần dấu ngoặc đơn để gọi exec (lưu hai byte) , vì đó là câu lệnh trong Python 2.
Jonathan Frech

Ngoài ra còn có một không gian thừa trong z(p) for.
Jonathan Frech

1
Sử dụng map(z,l), s%jprintcho 301 byte - Hãy thử nó trên mạng!
Ông Xcoder

3

Python 2 , 41 25 byte

import numpy
numpy.einsum

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

Vectơ hoán vị pđược đưa ra dưới dạng một chuỗi các chữ cái. Vì vậy, [2,3,1]có thể được đưa ra như 'bca'.

Cảm ơn @EriktheOutgolfer đã lưu 16 byte!


Điều này có hỗ trợ hơn 26 chiều không?
Erik the Outgolfer

Thực tế không quá 52 kích thước: chữ hoa + chữ thường.
rahnema1

2

JavaScript (ES6), 136 132 byte

(a,p,v=[],r=[],g=(a,[d,...p],_,h=(r,[i,...v])=>1/v[0]?h(r[i]=r[i]||[],v):r[i]=a)=>1/d?a.map((e,i)=>g(e,p,v[d]=i)):h(r,v))=>g(a,p)&&r

Chỉ số 0. Giải thích: glặp lại đệ quy trên mảng axây dựng một mảng vcác chỉ số được sắp xếp lại bằng cách sử dụng hoán vị p. Một khi đã phết, hsau đó chèn đệ quy phần tử vào mảng kết quả rbằng cách sử dụng các chỉ số được hoán vị.

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.