CJam, 94 92 82 बाइट्स
यह 92 बाइट्स संस्करण है। 82 बाइट संस्करण इस प्रकार है।
l~1$,:L,:)m*{1bL=},\e!\m*{~W<{/(\e_}%}%{::+)-!},{{_,,\f<1fb}%2ew{:&,(},!}={{(2*'_*'[\']}/N}/
यह हर संभव तरीके से ईंटों का विभाजन करता है और केवल वही लेता है जो वैध है। अब के लिए सुंदर जानवर बल लेकिन अभी भी मेरी मशीन पर जावा दुभाषिया पर लगभग 10 सेकंड में अंतिम परीक्षण मामला चलाता है ।
स्पष्टीकरण :
कोड 5 भागों में विभाजित है:
1) लंबाई की एक सरणी को देखते हुए 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
इस संस्करण के लिए विचार यादृच्छिक द्वारा दिया गया था (इसे प्राप्त करें?)
यह एक ऑनलाइन प्रयास करें