Có phải là một shuffle?


19

Hôm qua tôi đã hỏi câu hỏi này về xáo trộn riffle. Có vẻ như câu hỏi hôm nay hơi khó nên câu hỏi này là một nhiệm vụ liên quan nhưng dễ dàng hơn nhiều.

Hôm nay bạn được yêu cầu xác định xem một hoán vị trong thực tế là một shuffle riffle. Định nghĩa của chúng tôi về xáo trộn riffle được điều chỉnh từ câu hỏi cuối cùng của chúng tôi:

Phần đầu tiên của shuffle là sự phân chia. Trong phân vùng chia bộ bài thành hai. Hai tiểu mục phải liên tục, loại trừ lẫn nhau và toàn diện. Trong thế giới thực muốn làm cho phân vùng của bạn càng gần càng tốt, tuy nhiên trong thử thách này, đây không phải là một sự cân nhắc, tất cả các phân vùng bao gồm cả các phân vùng bị suy biến (một phân vùng trống) đều được xem xét như nhau.

Sau khi chúng được phân vùng, các thẻ được ghép lại với nhau theo cách các thẻ duy trì trật tự tương đối của chúng trong phân vùng mà chúng là thành viên . Ví dụ: nếu thẻ A nằm trước thẻ B trong cỗ bài và thẻ AB nằm trong cùng một phân vùng, thẻ A phải ở trước thẻ B trong kết quả cuối cùng, ngay cả khi số lượng thẻ giữa chúng tăng lên. Nếu AB ở các phân vùng khác nhau, chúng có thể theo bất kỳ thứ tự nào, bất kể thứ tự bắt đầu của chúng, trong kết quả cuối cùng.

Mỗi shuffle riffle sau đó có thể được xem như là một hoán vị của bộ bài gốc. Ví dụ hoán vị

1,2,3 -> 1,3,2

là một shuffle riffle. Nếu bạn chia boong như vậy

1, 2 | 3

chúng tôi thấy rằng mọi thẻ trong 1,3,2đều có cùng thứ tự tương tự với mọi thẻ khác trong phân vùng của nó. 2vẫn là sau 1.

Mặt khác, hoán vị sau đây không phải là một shuffle riffle.

1,2,3 -> 3,2,1

Chúng ta có thể thấy điều này bởi vì tất cả hai phân vùng (không tầm thường)

1, 2 | 3
1 | 2, 3 

có một cặp thẻ không duy trì thứ tự tương đối của chúng. Trong phân vùng đầu tiên 12thay đổi thứ tự của họ, trong khi trong phân vùng thứ hai 23thay đổi thứ tự của họ.

Bài tập

Đưa ra một hoán vị thông qua bất kỳ phương pháp hợp lý nào, xác định xem nó đại diện cho một xáo trộn riffle hợp lệ. Bạn nên xuất hai giá trị hằng số riêng biệt một cho "Có, đây là xáo trộn riffle" và một cho "Không, đây không phải là xáo trộn riffle".

Đây là vì vậy câu trả lời sẽ được tính bằng byte với ít byte hơn.

Các trường hợp thử nghiệm

1,3,2 -> True
3,2,1 -> False
3,1,2,4 -> True
2,3,4,1 -> True
4,3,2,1 -> False
1,2,3,4,5 -> True
1,2,5,4,3 -> False
5,1,4,2,3 -> False
3,1,4,2,5 -> True
2,3,6,1,4,5 -> False

1
Đầu ra có thể không nhất quán, nhưng trung thực / giả dối trong ngôn ngữ của chúng tôi? Giống như (Python, trong đó, trong số các số nguyên chỉ có 0 là sai) 0cho sai nhưng có bất kỳ số nguyên nào [1, +∞)cho sự thật không?
Ông Xcoder

1
@ Mr.Xcoder Tôi không thích các giá trị trung thực / giả vì chúng khá khó xác định rõ. Câu trả lời nên bám sát các quy tắc hiện hành.
Phù thủy lúa mì

Trường hợp thử nghiệm đề xuất : [3,1,4,2,5].
Ørjan Johansen

9
Xin lỗi về điều này, nhưng : [2,3,6,1,4,5].
Ørjan Johansen

1
Chúng ta có thể lấy hoán vị [0, ..., n-1]thay vì [1, ..., n]làm đầu vào không?
Dennis

Câu trả lời:


8

JavaScript (ES6), 47 byte

Đưa đầu vào như một mảng các số nguyên. Trả về một boolean.

([x,...a],y)=>a.every(z=>z+~x?y?z==++y:y=z:++x)

Các trường hợp thử nghiệm

Làm sao?

Mảng đầu vào A là một xáo trộn riffle hợp lệ nếu nó bao gồm tối đa hai chuỗi xen kẽ riêng biệt của các số nguyên liên tiếp.

Các quy tắc thách thức xác định rằng chúng tôi đang đưa ra một hoán vị của [1 ... N] . Vì vậy, chúng ta không cần phải kiểm tra thêm rằng sự kết hợp được sắp xếp của các chuỗi này thực sự dẫn đến một phạm vi như vậy.

Chúng tôi sử dụng bộ đếm x được khởi tạo thành A [0] và bộ đếm y ban đầu không xác định.

Đối với mỗi mục z trong A , bắt đầu với mục thứ 2:

  • Chúng tôi kiểm tra xem z có bằng x + 1 hoặc y + 1 không . Nếu có, chúng tôi tăng bộ đếm tương ứng.
  • Khác: nếu y vẫn chưa được xác định, chúng tôi khởi tạo nó thành z .
  • Khác: chúng tôi làm cho bài kiểm tra thất bại.


5

Haskell , 43 byte

slấy một danh sách các số nguyên như trong các ví dụ OP và trả về a Bool.

s p=or[f(<x)p++f(>=x)p<[1..]|x<-p]
f=filter

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

Làm thế nào nó hoạt động

  • Danh sách sự hiểu biết cố gắng từng yếu tố xcủa plần lượt, và kiểm tra xem nó có thể là yếu tố đầu tiên của phân vùng thứ hai của shuffle. Sau đó ortrả về Truenếu có bất kỳ kiểm tra nào True.
  • Việc hiểu được thực hiện điều này bằng cách phân vùng (với filter) pthành các phần tử nhỏ hơn và lớn hơn (hoặc bằng) x, nối và kiểm tra xem danh sách kết quả có phải [1..length p]là các phần tử theo thứ tự không.
  • Việc kiểm tra xem danh sách kết quả có [1..length p]được thực hiện hay không bằng cách xem kết quả có nhỏ hơn danh sách vô hạn hay không [1..] == [1,2,3,etc.], điều này cho kết quả tương tự đối với bất kỳ hoán vị nào.

5

Thạch , 13 6 byte

ỤIṢḊRẠ

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

Phiên bản thay thế, thử thách postdates, 5 byte

Ụ>ƝSỊ

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

Làm thế nào nó hoạt động

ỤIṢḊRẠ  Main link. Argument: A (permutation of [1, ..., n])

Ụ       Grade up; sort the indices of A by their respective values.
        For shuffles, the result is the concatenation of up to two increasing
        sequences of indices.
 I      Compute the forward differences.
        In a shuffle, only one difference may be negative.
  Ṣ     Sort the differences.
   Ḋ    Dequeue; remove the first (smallest) difference.
    R   Range; map each k to [1, ..., k].
        This yields an empty array for non-positive values of k.
     Ạ  All; check if all resulting ranges are non-empty.


4

Brachylog , 9 byte

o~cĊ⟨⊆⊇⟩?

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

Vị từ thành công nếu đầu vào đại diện cho xáo trộn riffle và thất bại nếu không, có nghĩa là trong số những điều khác mà nếu vị ngữ được chạy như toàn bộ thành công chương trình sẽ in true.và thất bại sẽ in false.. Đầu vào được lấy dưới dạng một danh sách của bất kỳ loại vật phẩm nào và diễn giải nó như là một đại diện cho sự hoán vị của chính nó được sắp xếp.

   Ċ         Some length-two list
 ~c          which concatenated
o            is the input sorted
    ⟨        satisfies the condition that its first element
     ⊆       is an ordered not-necessarily-contiguous sublist
        ?    of the input
      ⊇      which is an ordered superlist of
       ⟩     the list's second element.

Tôi cảm thấy như có một cái gì đó trong tinh thần ⊆ᵐsẽ hoạt động ở vị trí của cấu trúc "sandwich" bốn byte ⟨⊆⊇⟩.


1
Tôi nghĩ rằng bạn là người đầu tiên sử dụng bánh sandwich trong câu trả lời PPCG (và đó là một đối xứng đẹp :))
Fatalize


2

Ruby , 35 byte

->l{l.any?{|a|l&[*1..a]|l==l.sort}}

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

Làm sao?

  • l & [*1..a] | láp dụng một giao điểm và sau đó là một liên minh: đầu tiên lấy các phần tử của lđó <=avà sau đó thêm các phần tử còn lại lmà không thay đổi thứ tự. Nếu a là số chúng ta đang tìm kiếm, thì thao tác này giống như sắp xếp l.


2

Bình thường, 5 byte

}SQy+

Bộ kiểm tra

}SQy+

    +QQ  concatenated two copies of the (implicit) input
   y     all subsequences of it
}        contain an element equaling
 SQ      the input list sorted 

Kiểm tra xem danh sách đầu vào nhân đôi có chứa phiên bản được sắp xếp của chính nó hay không.

Nhờ Erik, Outgolfer cho 1 byte tận dụng tốt hơn đầu vào ngầm với +QQchứ không phải *2Q.


5 byte : }SQy+. Nó được mở rộng đến }SQy+QQ.
Erik the Outgolfer

@EriktheOutgolfer Đẹp một, cảm ơn.
xnor

1

Bình thường , 9 byte

!t-.+xLQS

Bộ thử nghiệm.

Đã lưu 3 byte nhờ isaacg .

Bình thường , 14 byte

}SQm.nS.Tcd2./

Hãy thử nó ở đây! hoặc Xác minh tất cả các trường hợp thử nghiệm.

Đầu ra TrueFalsecho riffle-shuffle và non-riffle-shuffle tương ứng.

Làm sao?

} SQm.nS.Tcd2./ ~ Chương trình đầy đủ. Đọc đầu vào từ STDIN và đầu ra thành STDOUT.

            ./ ~ Trả lại tất cả các bộ phận của đầu vào thành các chuỗi con khác nhau (phân vùng).
   m ~ Bản đồ trên sử dụng một biến d.
         cd2 ~ Chặt d vào danh sách hai yếu tố.
       .T ~ Chuyển đổi hợp lý, bỏ qua sự vắng mặt.
      S ~ Sắp xếp (từ vựng).
    .n ~ Làm phẳng sâu.
} ~ Kiểm tra xem phần trên có chứa ...
 SQ ~ Đầu vào được sắp xếp.

Hơn nữa, <#0có thể được thay thế bằng -2 byte nữa.
isaacg

@isaacg Oh yeah facepalm cảm ơn. Đã chỉnh sửa. Đã chỉnh sửa.
Ông Xcoder



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.