Mảng có thể được xáo trộn?


15

Lý lịch

Những người xử lý thẻ rất thành thạo có khả năng về một kỹ thuật trong đó họ cắt một bộ bài hoàn hảo làm đôi, sau đó xen kẽ các lá bài một cách hoàn hảo. Nếu họ bắt đầu với một bộ bài được sắp xếp và thực hiện kỹ thuật này hoàn hảo 52 lần liên tiếp, bộ bài sẽ được khôi phục lại theo thứ tự được sắp xếp. Thử thách của bạn là tham gia một cỗ bài một mảng số nguyên và xác định xem nó có thể được sắp xếp chỉ bằng cách xáo trộn Faro hay không.

Định nghĩa

Về mặt toán học, một shuffle Faro là một hoán vị trên 2 n phần tử (đối với bất kỳ số nguyên dương n ) nào đưa phần tử ở vị trí i (được lập chỉ mục 1) đến vị trí 2 i (mod 2 n +1). Chúng tôi cũng muốn có thể xử lý các danh sách có độ dài lẻ, vì vậy, trong trường hợp đó, chỉ cần thêm một yếu tố vào cuối danh sách (một Joker, nếu bạn có một tiện ích) và Faro xáo trộn danh sách mới như trên, nhưng bỏ qua phần tử giả được thêm vào khi kiểm tra thứ tự của danh sách.

Mục tiêu

Viết chương trình hoặc hàm lấy danh sách các số nguyên và trả về hoặc đưa ra sự thật nếu một số số lần xáo trộn Faro sẽ khiến danh sách đó được sắp xếp theo thứ tự không tăng dần (ngay cả khi số đó bằng 0 - các danh sách nhỏ sẽ cho sự thật). Nếu không, trả lại hoặc đầu ra một giả.

Ví dụ

[1,1,2,3,5,8,13,21]  => True
[5,1,8,1,13,2,21,3] => True
[9,36,5,34,2,10,1] => True
[1,0] => True
[0] => True
[] => True
[3,2,1] => True
[3,1,2] => False
[9,8,7,6,5,4,3,2,1,0] => True
[9,8,7,6,5,4,3,2,0,1] => False
[3,1,4,1,5,9,2,6,9] => False
[-1,-1,-1,-2] => True

Chấm điểm

Đây là để nguồn ngắn nhất tính bằng byte thắng.


Để tránh nhầm lẫn với bất kỳ người xử lý thẻ đồng nghiệp nào, cần lưu ý rằng có hai loại xáo trộn Faro. Một shuffle trong và một shuffle ra . Phương pháp được mô tả ở đây là một shuffle. Thật thú vị, chỉ mất 8 lần xáo trộn để trả lại một bộ bài về trật tự ban đầu. Thông tin thêm
BrainSteel

Đây không phải là "in-shuffle N + 1 lần và xem liệu có bất kỳ danh sách nào trên đường đi được sắp xếp không"?
lirtosiast

Trên thực tế, n lần là đủ, vì thực hiện 2 lần được đảm bảo để tìm tất cả các hoán vị có thể, nhưng bạn sẽ nhận được ít nhất một trong hai thứ tự tăng dần hoặc giảm dần trong n đầu tiên.
quintopia


1
không yếu tố đầu tiên luôn luôn ở vị trí đầu tiên?
Eumel

Câu trả lời:


3

Pyth - 26 25 24 byte

Sử dụng giảm tích lũy để áp dụng Faro shuffle nhiều lần và giữ tất cả các kết quả. Sau đó, nó ánh xạ qua nó và kiểm tra xem chúng có bất biến khi sắp xếp không, sau đó sử dụng tổng để kiểm tra xem có đúng không. Trả về giá trị dương hoặc bằng không.

smSI-db.usC_c2NQsC.tc2Qb

Phòng thử nghiệm .


3

MATL , 41 byte

itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx

Đầu ra là 1hoặc 0.

Giải trình

i              % get input array
tn2\           % is size odd?
?              % if that's the case
  YNh          % concat NaN at the end
]              % end if
tn             % get size of input array
t1+:           % vector 1:n+1, where n is input size, so loop will be entered even with []
"              % for loop
  x[]2e!PY)    % delete result from previous iteration and do the shuffling
  ttZN~)       % remove NaN, if there's any
  tS=A         % check if array is sorted
  t.           % copy the result. If true, break loop
]              % end for
wx             % remove unwanted intermediate result

Thí dụ

>> matl itn2\?YNh]tnt1+:"x[]2e!PY)ttZN~)tS=At.]wx
> [1,1,2,3,5,8,13,21]
1
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.