Vấn đề bánh kếp bị cháy


23

Thử thách này có liên quan đến Flipping Pancakes .

Bạn có thể đã nghe nói về việc sắp xếp bánh kếp , trong đó một chồng bánh được sắp xếp theo kích cỡ bằng cách chèn thìa vào chồng và lật tất cả các bánh trên thìa, cho đến khi bánh được sắp xếp nhỏ nhất đến lớn nhất trên đĩa. Các vấn đề pancake bị cháy là hơi khác nhau. Tất cả các bánh kếp bây giờ đều có một mặt bị cháy, và mặt bị cháy của mỗi bánh phải đối mặt với đĩa sau khi quá trình phân loại được hoàn thành.

Ví dụ, được đưa ra ngăn xếp sau (kích thước của bánh kếp ở bên trái. Có 0nghĩa là mặt bị cháy xuống và 1có nghĩa là mặt bị cháy ở phía bên phải):

1 0
3 1
2 1

Bạn có thể lật toàn bộ ngăn xếp để lấy 20 30 11, lật hai cái trên cùng để lấy 31 21 11và lật lại toàn bộ ngăn xếp để lấy 10 20 30, một chồng bánh xèo được sắp xếp. Chuỗi di chuyển này, lật 3, lật 2, lật 3, có thể được biểu diễn dưới dạng 3 2 3.

Các thách thức

  • Đưa ra một loạt các kích cỡ bánh kếp (không nhất thiết là duy nhất) và định hướng của chúng, đưa ra bất kỳ trình tự sắp xếp bánh xèo hợp lệ nào, nghĩa là một chuỗi các lần lật dẫn đến chồng bánh được sắp xếp từ nhỏ nhất đến lớn nhất với các mặt bị cháy xuống.
  • Đầu vào và đầu ra có thể là bất kỳ định dạng lành mạnh nào có dấu phân cách, nhưng vui lòng chỉ định định dạng bạn sử dụng và nêu rõ phần cuối của định dạng đầu vào của bạn là đỉnh của ngăn xếp (ĐKDV).
  • Lật bánh không được cho phép.
  • Trộn dải phân cách trong đầu vào / đầu ra được cho phép.

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

Đối với tất cả các trường hợp kiểm tra sau, đầu vào là danh sách và đầu ra là một chuỗi được phân tách bằng dấu cách và TOS nằm ở bên trái.

[[1, 0], [3, 1], [2, 1]]
"3 2 3"

[[5, 1], [3, 0], [4, 1], [2, 1], [1, 0]]
"5 3 4 1 3 2 1"

[[5, 1], [3, 0], [3, 0], [1, 1]]
"4 3 2 3"

Như mọi khi, nếu bất cứ điều gì không rõ ràng hoặc không chính xác, xin vui lòng cho tôi biết trong các ý kiến. Chúc may mắn và chơi golf tốt!

Câu trả lời:


7

Con trăn 2, 83

Đầu vào dự kiến ​​sẽ là danh sách các bộ dữ liệu (kích thước, hướng) với đỉnh của ngăn xếp ở cuối. Đầu ra là một danh sách các kích thước để lật cách nhau bởi các loại khoảng trắng.

a=input()
while a:i=a.index(max(a));print len(a)-i,a[i][1],len(a),i;a=a[i+1:]+a[:i]

2
Rõ ràng tôi là một thằng ngốc.
Nữ tu rò rỉ

0trong danh sách đầu ra được phép?
Nữ tu bị rò rỉ

19
@LeakyNun Lật 0 bánh là có thể. Trong thực tế, tôi đang làm điều đó ngay bây giờ.
frageum

@daniero Phần trên cùng của ngăn xếp nằm ở bên phải.
Nữ tu bị rò rỉ

@LeakyNun xin lỗi, xấu của tôi
daniero

3

CJam (37 byte)

q~{__$W>#)_p/(W%\M*2,f.^+(1=p_,)pW%}h

Đầu vào là một mảng ở định dạng CJam trên stdin; đầu ra là một danh sách độ dài lật được phân tách bằng dòng trên thiết bị xuất chuẩn. Đỉnh của ngăn xếp là ở chỉ số 0; 0chỉ ra mặt bị cháy lên, và 1chỉ mặt bị cháy xuống.

Bản demo trực tuyến

Mổ xẻ

Đầu ra luôn luôn 3ndài, trong đó nlà số lượng bánh. Đầu tiên chúng ta lật chiếc bánh lớn nhất còn lại lên trên cùng; sau đó nếu nó bị cháy xuống, chúng ta lật một cái bánh kếp; và sau đó chúng tôi lật nó xuống dưới cùng và lặp lại như thể chồng bánh kếp ngắn hơn một cái.

q~         e# Parse input into array
{          e# Loop...
  __$W>#)  e#   Find 1-based index of largest element in array
  _p       e#   Dup and print
  /(       e#   Split into chunks that long, and pull off the first
  W%       e#   Reverse the first chunk. Note that we don't flip the burnt/unburnt bit
  \M*      e#   Merge the remaining chunks into a single array
  2,f.^    e#   Flip *their* burnt/unburnt bits
  +        e#   Concatenate, prepending the first chunk
  (1=p     e#   Pull off the first (largest) element and print its burnt/unburnt bit
  _,)p     e#   Print the number of remaining elements plus 1 (to account for the largest)
  W%       e#   Reverse. Note that the first chunk has now been flipped twice, which is
           e#   why we have left its burnt/unburnt bit alone
}h         e# ... until we get down to an empty array

3

Ruby, 101 95 93 byte

Không phải là rất golf, tôi chỉ muốn tạo ra một biến thể bogo-sort. Đây là một hàm ẩn danh lấy một mảng các mảng và in các lần lật ngẫu nhiên đến thiết bị xuất chuẩn cho đến khi các bánh kếp được sắp xếp.

->a{(p r=-~rand(a.size)
a[0,r]=a[0,r].reverse.map{|x,b|[x,1-b]})while a!=a.sort||a.rassoc(1)}

Ví dụ, bạn có thể gán nó cho fvà nóif.call [[1, 0], [3, 1], [2, 1]]

-5 byte từ @Jordan với việc sử dụng tuyệt vời rassoc
-2 byte từ @ Sherlock9


1
Bạn có thể lưu một vài byte bằng cách thay thế a.all?{...}bằng !a.rassoc(1).
Jordan

@Jordan Wow, thật là tuyệt vời! Tôi không nghĩ rằng tôi đã từng nghĩ đến việc sử dụng ( r) assoctrước đây, nhưng nghĩ về nó, nó có thể hữu ích trong rất nhiều vấn đề trên trang web này - tôi cảm thấy rằng nó nên được đăng trong bài viết về mẹo chơi golf của Ruby. Dù sao đi nữa, cảm ơn :) Tôi cũng có thể giết một byte khác mặc dù việc áp dụng luật deMorgans và thay thế untilbằng while.
daniero


bchỉ là bao giờ 0hoặc 1, 1-bcũng sẽ hoạt động và sẽ tiết kiệm hai byte.
Sherlock9
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.