CJam, 94 92 82 바이트
92 바이트 버전입니다. 다음은 82 바이트 버전입니다.
l~1$,:L,:)m*{1bL=},\e!\m*{~W<{/(\e_}%}%{::+)-!},{{_,,\f<1fb}%2ew{:&,(},!}={{(2*'_*'[\']}/N}/
이것은 벽돌을 가능한 모든 방법으로 분할하고 유효한 것을 취합니다. 지금은 꽤 무차별하지만 내 컴퓨터 의 Java 인터프리터 에서 약 10 초 안에 마지막 테스트 사례를 계속 실행합니다 .
설명 :
코드는 5 개 부분으로 나뉩니다.
1) length 배열이 주어지면 L
모든 H
부분을 어떻게 부분 으로 나눌 수 있습니까?
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
그런 다음 입력 배열을 H 브릭 레이어로 분할하는 가능한 모든 방법이 있습니다.
2) 입력 배열의 모든 순열을 얻은 다음 모든 순열에 대한 모든 파티션을 가져옵니다.
\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
그런 다음 입력 벽돌을 H
레이어 벽돌 벽에 배치 할 수 있습니다 .
3) 벽돌 길이가 동일한 레이아웃 만 필터링하십시오.
{::+)-!},
{ }, 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.
이 필터가 끝나면 나머지 모든 레이아웃은 완벽한 사각형이됩니다.
4) 안정성 기준과 일치하는 첫 번째 브릭 레이아웃을 제거하십시오.
{{_,,\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
이 단계 후에 레이아웃을 인쇄하면됩니다.
5) 레이아웃 인쇄
{{(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
여기에서 온라인으로 사용해보십시오
82 바이트
l~:H;{e_mrH({H-X$,+(mr)/(\e_}%_::+)-X${_,,\f<1fb}%2ew{:&,(},+,}g{{(2*'_*'[\']}/N}/
이것은 임의의 터치가 있다는 점을 제외하면 92 바이트 버전과 거의 유사합니다. 92 바이트 버전에 대한 설명을 읽은 경우 82 바이트 버전에서 파트 3, 4 및 5는 정확히 동일하지만 파트 1 및 2의 모든 순열을 반복하는 대신이 버전은 단순히 다음 중 하나를 임의로 생성합니다. 한 번에 순열을 바꾸고 파트 3과 4를 사용하여 테스트 한 다음 파트 3과 4의 테스트에 실패하면 프로세스를 다시 시작합니다.
이렇게하면 처음 3 개의 테스트 사례에 대한 결과가 매우 빠르게 인쇄됩니다. 높이 = 5 테스트 사례는 아직 컴퓨터에서 출력을 제공하지 않습니다.
차이점 설명
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
이 버전에 대한 아이디어는 randomra 님에 의해 제공되었습니다.
온라인으로 해보십시오