CJam, 94 92 82 byte
Đây là phiên bản 92 byte. Phiên bản 82 byte theo sau.
l~1$,:L,:)m*{1bL=},\e!\m*{~W<{/(\e_}%}%{::+)-!},{{_,,\f<1fb}%2ew{:&,(},!}={{(2*'_*'[\']}/N}/
Điều này phân vùng các viên gạch thành mọi cách có thể và chỉ lấy một cái hợp lệ. Hiện tại khá mạnh mẽ nhưng vẫn chạy trường hợp thử nghiệm cuối cùng trong khoảng 10 giây trên Trình thông dịch Java trên máy của tôi.
Giải thích :
Mã được chia thành 5 phần:
1) Cho một mảng có độ dài L
, làm thế nào tất cả chúng ta có thể phân vùng nó thành H
các phần.
l~1$,:L,:)m*{1bL=},
l~ e# Read the input as string and evaluate it.
`$,:L e# Copy the array and take its length. Store that in L
,:) e# Get an array of 1 to L
m* e# Cartesian power of array 1 to L of size H (height of wall)
{1bL=}, e# Take only those parts whose sum is L
Sau này, chúng ta có tất cả các cách có thể để tách mảng đầu vào của chúng ta thành các lớp gạch H.
2) Nhận tất cả các hoán vị của mảng đầu vào và sau đó nhận thêm tất cả các phân vùng cho tất cả các hoán vị
\e!\m*{~W<{/(\e_}%}%
\e! e# Put the input array on top of stack and get all its permutations
\m* e# Put the all possible partition array on top and to cartesian
e# product of the two permutations. At this point, every
e# permutation of the input array is linked up with every
e# permutation of splitting L sized array into H parts
{ }% e# Run each permutation pair through this
~W< e# Unwrap and remove the last part from the partition permutation
{ }% e# For each part of parts permutation array
/ e# Split the input array permutation into size of that part
(\ e# Take out the first part and put the rest of the parts on top
e_ e# Flatten the rest of the parts so that in next loop, they can be
e# split into next part length
Sau này, chúng ta có tất cả các bố trí có thể của các viên gạch đầu vào thành một H
bức tường gạch lớp.
3) Chỉ lọc ra những bố cục có chiều dài gạch giống nhau
{::+)-!},
{ }, e# Filter all brick layouts on this condition
::+ e# Add up brick sizes in each layer
)-! e# This checks if the array contains all same lengths.
Sau khi kết thúc bộ lọc này, tất cả các bố cục còn lại sẽ là hình chữ nhật hoàn hảo.
4) Đưa ra bố cục gạch đầu tiên phù hợp với tiêu chí ổn định
{{_,,\f<1fb}%2ew{:&,(},!}=
{ }= e# Choose the first array element that leaves truthy on stack
{ }% e# For each brick layer
_,, e# Create an array of 0 to layer length - 1
\f< e# Get all sublists starting at 0 and ending at 0
e# through length - 1
1fb e# Get sum of each sub list. This gives us the cumulative
e# length of each brick crack except for the last one
2ew e# Pair up crack lengths for every adjacent layer
{ }, e# Filter layer pairs
:& e# See if any cumulative crack length is same in any two
e# adjacent layers. This means that the layout is unstable
,( e# make sure that length of union'd crack lengths is greater
e# than 1. 1 because 0 will always be there.
! e# If any layer is filtered through this filter,
e# it means that the layer is unstable. Thus negation
Sau bước này, chúng ta chỉ cần in bố cục
5) In bố cục
{{(2*'_*'[\']}/N}/
{ }/ e# For each brick layer
{ }/ e# For each brick
(2*'_* e# Get the (brick size - 1) * 2 underscores
'[\'] e# Surround with []
N e# Newline after each layer
Dùng thử trực tuyến tại đây
82 byte
l~:H;{e_mrH({H-X$,+(mr)/(\e_}%_::+)-X${_,,\f<1fb}%2ew{:&,(},+,}g{{(2*'_*'[\']}/N}/
Điều này gần như tương tự với phiên bản 92 byte, ngoại trừ việc nó có một chút ngẫu nhiên. Nếu bạn đã đọc phần giải thích cho phiên bản 92 byte, thì trong phiên bản 82 byte, các phần 3, 4 và 5 hoàn toàn giống nhau, trong khi thay vì lặp lại tất cả các hoán vị từ phần 1 và 2, phiên bản này chỉ đơn giản tạo ra một trong những hoán vị tại một thời điểm, kiểm tra nó bằng cách sử dụng phần 3 và 4, sau đó khởi động lại quá trình nếu các thử nghiệm của phần 3 và 4 không thành công.
Điều này in kết quả rất nhanh cho 3 trường hợp thử nghiệm đầu tiên. Trường hợp thử nghiệm height = 5 vẫn chưa cho đầu ra trên máy tính của tôi.
Giải thích về sự khác biệt
l~:H;{e_mrH({H-X$,+(mr)/(\e_}%_::+)-X${_,,\f<1fb}%2ew{:&,(},+,}g
l~:H; e# Eval the input and store the height in H
{ ... }g e# A do-while loop to iterate until a solution is found
e_mr e# Flatten the array and shuffle it.
H({ }% e# This is the random partition generation loop
e# Run the loop height - 1 times to get height parts
H-X$,+( e# While generating a random size of this partition, we
e# have to make sure that the remaining parts get at least
e# 1 brick. Thus, this calculation
mr) e# Get a random size. Make sure its at least 1
/(\e_ e# Similar to 92's part 2. Split, pop, swap and flatten
_::+)- e# 92's part 3. Copy and see if all elements are same
X${_,,\f<1fb}%2ew{:&,(}, e# 92's part 4. Copy and see if layers are stable
+, e# Both part 3 and 4 return empty array if
e# the layout is desirable. join the two arrays and
e# take length. If length is 0, stop the do-while
Ý tưởng cho phiên bản này được đưa ra bởi Randomra (Lấy nó?)
Hãy thử cái này trực tuyến