एक स्थिर ईंट की दीवार बनाएं


39

ईंट की दीवार क्षैतिज आयतों से बनी एक आयत है, जिसे पंक्तियों में रखा गया है। यहां ऊंचाई 4 और चौड़ाई 8 की दीवार है, जिसमें दाईं ओर ईंट के आकार दिखाए गए हैं।

[______][______]    4 4
[__][____][__][]    2 3 2 1
[][______][____]    1 4 3
[____][______][]    3 4 1

यह दीवार अस्थिर है क्योंकि इसमें एक खराबी है , एक ऐसी जगह जहां ईंटों के बीच दो ऊर्ध्वाधर दरारें होती हैं, जो आसपास की ईंटों में पार्न्स के साथ नीचे दिखाई जाती हैं।

[______][______]    
[__][____)(__][]
[][______)(____]
[____][______][]

लेकिन, दाईं ओर आकार -1 ईंटों की सीमा वाली दरारें दोष नहीं बनाती हैं क्योंकि वे एक पंक्ति द्वारा अलग हो जाती हैं।

वह कोड लिखें जो निर्दिष्ट आकारों की ईंटों से निर्मित एक स्थिर दीवार को ढूंढता और प्रदर्शित करता है। सबसे कम बाइट्स जीतता है।

इनपुट

ईंट के आकार की एक गैर-खाली सूची (सकारात्मक संख्या) और एक ऊंचाई जो कम से कम 2. इस सूची को क्रमबद्ध किया जा सकता है यदि आप चाहें। आप वैकल्पिक रूप से प्रत्येक आकार की ईंटों की गिनती में ले सकते हैं।

उत्पादन

आवश्यक ऊंचाई की एक स्थिर आयताकार दीवार की एक तस्वीर जो दी गई सभी ईंटों का उपयोग करती है। इसे प्रिंट करें या इसे newlines के साथ एक स्ट्रिंग के रूप में लौटाएं।

2n वर्णों के आकार की एक ईंट ड्रा करें, कोष्ठक से घिरा अंडरस्कोर।

1: []
2: [__]
3: [____]
4: [______]
...

इनपुट में कम से कम एक समाधान होने की गारंटी है। यदि एक से अधिक है, तो आपको अभी भी केवल एक दीवार खींचनी चाहिए।

कोई समय प्रतिबंध नहीं है; जितना चाहो उतना बल प्रयोग करो। आपके एल्गोरिथ्म को किसी भी आकार के इनपुट पर सिद्धांत रूप में काम करना चाहिए।

परीक्षण के मामलों:

कई समाधान हैं, इसलिए आपके आउटपुट अलग हो सकते हैं।

>> [1, 1, 2, 2], 2
[][__]
[__][]

>> [1, 1, 1, 2, 2, 2, 2, 3], 2
[__][____][__]
[][__][][__][]

>> [1, 1, 2, 2, 3, 3, 3, 3], 3
[][__][____]
[__][____][]
[____][____]

>> [1, 2, 3, 4, 5, 6, 7, 8, 9], 5
[][______________]
[__][____________]
[________________]
[____][__________]
[______][________]

>> [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]

आपने n> 1 वर्णों के बजाय ईंटों को 2n वर्णों से चौड़ा बनाने का निर्णय क्यों लिया?
2:52 15

2
@ अक्षर 2 वर्ण ब्लॉक 1 मोटे तौर पर चौकोर दिखता है। मैंने आवश्यकता की कोशिश की थी n>1और यह पसंद नहीं किया था कि यह परीक्षण के मामलों को कैसे प्रतिबंधित करता है। इसके अलावा, जाहिरा तौर पर वहाँ मिसाल है
xnor

मैं n> 1 के साथ 2n का मतलब नहीं है। मेरा मतलब है n> 1 के साथ n।
Sparr

जवाबों:


20

पर्ल, 166 170 194

लैरी वॉल द्वारा बनाई गई भाषा के लिए एक आदर्श कार्य।

#!perl -pa
$_=(1x($x=2/($y=pop@F)*map{1..$_}@F)."
")x$y;sub
f{my$l=$_;$-|=!@_;for$=(@_){$Z=__
x~-$=;$f=0;s/(11){$=}/[$Z]/&!/\]..{$x}\[/s&&f(grep$=ne$_||$f++,@_);$-or$_=$l}}f@F

ब्रूट बल, लेकिन परीक्षण मामलों पर काफी तेज (<1s)। उपयोग:

$ perl ~/wall.pl <<<"1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 5"
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]

मुझे परखो ।


9
हा, मुझे आश्चर्य है कि अगर लैरी वाल ने कभी सोचा कि लोग इस तरह की भाषा का उपयोग कर रहे होंगे ... :)
madhatfish

12

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

इस संस्करण के लिए विचार यादृच्छिक द्वारा दिया गया था (इसे प्राप्त करें?)

यह एक ऑनलाइन प्रयास करें


9

पायथन 2, 680 670 660 बाइट्स

मुझे नहीं पता कि मैं इन सुपर लंबे "गोल्फ" पर जोर क्यों देता हूं ... लेकिन वैसे भी, यहां आप जाते हैं।

M,L,R,N=map,len,range,None
exec"J=@:M(''.join,x);B=@:'['+'_'*2*~-x+']';K=@:M(B,x);W=@:J(M(K,x));C=@:set(M(sum,[x[:i]for i in R(L(x))]))-{0};T=@,w:w[x:]+w[:x]\ndef F(i):f=filter(@:i[x-1]&i[x],R(1,L(i)));return f and f[0]".replace('@','lambda x')
def P(e,x,i,w,h):
 for j in[-~_%h for _ in R(i-1,h+i-2)]:
    for s in R(w):
     if not e&C(T(s,x[j])):return j,s
 return N,N
def b(l,h):
 w,d=[[]for _ in R(h)],2*sum(l)/h
 for _ in l[::-1]:q=M(L,W(w));w[[q.index(i)for i in sorted(q)if i+L(B(_))<=d][-1]]+=_,
 g=M(C,w);i=F(g)
 while i:
    e=g[i-1];j,s=P(e,w,i,d,h)
    if j!=N:w[j]=T(s,w[j]);w[i],w[j]=w[j],w[i];g=M(C,w);i=F(g)
    else:b(T(-1,l),h);return
 print'\n'.join(W(w))

इसके लिए क्रमबद्ध आरोही क्रम में आउटपुट की आवश्यकता होती है, और इसके माध्यम से कॉल किया जाता है b(brick_sizes, height)

परीक्षण के मामलों:

>>> tests = [([1, 1, 2, 2], 2),([1, 1, 1, 2, 2, 2, 2, 3], 2), ([1, 1, 2, 2, 3, 3, 3, 3], 3), ([1, 2, 3, 4, 5, 6, 7, 8, 9], 5), ([1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5)]
>>> for t in tests:
...     b(*t); print
... 
[__][]
[][__]

[____][__][__]
[][][__][__][]

[____][____]
[__][__][][]
[____][____]

[________________]
[______________][]
[____________][__]
[__________][____]
[________][______]

[__][__][]
[][__][__]
[__][__][]
[][__][__]
[__][__][]

जिस तरह से यह काम करता है:

  1. परतों को ईंटों (सबसे लंबे समय तक - सबसे कम) को असाइन करें, अगले पर जाने से पहले प्रत्येक परत को भरने की कोशिश कर रहा है।
  2. जब भी आसन्न परतें अस्थिर होती हैं, तब तक परतों को स्वैप करने और ईंटों को स्थानांतरित करने का प्रयास करें जब तक कि आपको कुछ ऐसा न मिल जाए जो काम करता है।
  3. यदि कुछ भी काम नहीं करता है, तो आकार की सूची के सामने सबसे लंबे ईंट को स्थानांतरित करें और पुनरावृत्ति करें।

1
आप शायद continueअंत के पास से छोड़ सकते हैं । इसके अलावा return(N,N)कोष्ठक की जरूरत नहीं होगी।
पुरकाकूदरी

अच्छी कॉल - यह continueएक पुराने संस्करण से एक अवशेष था।
सैपरक्विवल

1
इसे चलाने के लिए नहीं मिल सकता, आपके पास एक अतिरिक्त ब्रैकेट है Wऔर Tएक अतिरिक्त तर्क दिया गया है।
पागलखाने

जो, धन्यवाद! तय की।
सैपरकैवल

5

हास्केल, 262 बाइट्स

import Data.List
c=concat
n=init.scanl1(+)
1%l=[[[l]]]
n%l=[map(h:)(c$(n-1)%t)|(h,t)<-map(`splitAt`l)[1..length l]]
v[x]=1<2
v(x:y:z)=sum x==sum y&&n x==n x\\n y&&v(y:z)
l#n=unlines$map(>>=(\b->'[':replicate(2*b-2)'_'++"]"))$head$filter v$c.(n%)=<<permutations l

उदाहरण का उपयोग:

*Main> putStr $  [1, 2, 3, 4, 5, 6, 7, 8, 9] # 5
[______][________]
[__________][____]
[____________][__]
[][______________]
[________________]

*Main> putStr $ [1, 1, 2, 2, 3, 3, 3, 3] # 3
[____][____]
[__][__][][]
[____][____]

यह कैसे काम करता: मुख्य कार्य #एक सूची लेता है l(ईंटों की सूची) और एक नंबर h(ऊंचाई) और के सभी क्रमपरिवर्तन विभाजन lमें hसभी संभव पदों पर उप-सूचियों (समारोह के माध्यम से %, उदाहरण के लिए 2%[1,2,3,4]-> [ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ])। यह उन लोगों को रखता है जहां दो लगातार तत्वों की एक ही राशि होती है (यानी ईंटों में एक ही लंबाई) और उप-योगों की सूचियों में सामान्य तत्व नहीं होते हैं (यानी दरारें अप लाइन, फ़ंक्शन नहीं होती हैं v)। पहली सूची लें जो फिट बैठता है और ईंटों की एक स्ट्रिंग का निर्माण करता है।


4

पायथन 2, 528 , 417 , 393 , 381

बहुत लंबा, bruteforce समाधान। यह काम करता है लेकिन इसके बारे में है, अंतिम परीक्षण मामले के लिए परिणाम प्राप्त करने से पहले ब्रह्मांड समाप्त हो सकता है।

exec u"from itertools import*;m=map;g=@w,n:([[w]],[[w[:i]]+s#i?range(1,len(w))#s?g(w[i:],n-1)])[n>1];r=@x:set(m(sum,[x[:i]#i?range(1,len(x))]));f=@w:1-all(m(@(x,y):not x&y,zip(m(r,w[:-1]),m(r,w[1:]))));a=@s,h:['\\n'.join([''.join(['[%s]'%(' '*(s-1)*2)#s?r])#r?o])#p?permutations(s)#o?g(p,h)if len(set([sum(r)#r?o]))<2 and~-f(o)][0]".translate({64:u"lambda ",35:u" for ",63:u" in "})

एक मुख्य कार्य है:

>> a([1, 1, 2, 2], 2)
'[][  ]\n[  ][]'

आप आयात को कॉल से from itertools import*हटाकर और कॉल करके 4 बाइट्स बचा सकते हैं। इसके अलावा, 13 बाइट्स को बचाने के लिए अंत में एस को बदला जा सकता है ...। itertools.permutationsifif all(x==w[0] for x in w)and~-f(o):return
पुरकाकूदरी

इसके अलावा, fहमेशा पहली यात्रा पर वापस नहीं आता है ? यह अजीब लग रहा है। यह या तो एक बग या एक विशाल गोल्फ अवसर है।
पुरकाकूदरी

आपके पास एक टन का बाहरी स्थान है जिसे हटाया जा सकता है - एक उद्धरण से पहले या बाद में / पराना / ब्रैकेट, एक ऑपरेटर के आसपास, आदि। आप भी t=0दो बार में असाइन कर रहे हैं r(); आप उस फ़ंक्शन को map(sum,[x[:i] for i in range(len(x))])एक-लाइनर के रूप में बना सकते हैं (यदि आप चाहें तो लैम्ब्डा-आईएनजी के लिए उपयुक्त)। Isdisjoint और सेट का उपयोग करना f()इसे काफी कम कर देगा ( f()वर्तमान में केवल एक ही परीक्षण के बाद वापस आ जाता है, चाहे वह त्रुटि मिली हो या नहीं)। व्यक्तिगत रूप से मैं f()जैसा return not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:]))))या वैसा ही कुछ फिर से लिखूंगा ।
सैपरकैवल

@ Pietu1998 ओह, हाँ, एक स्थान याद किया। युक्तियाँ लोगों के लिए धन्यवाद, मुझे आश्चर्य है कि आप इन चीजों को देख सकते हैं।
पागलखाने में

हँसना बहुत बुरा है मुझे उस तरह के कोड से नफरत है जहाँ "परिणाम प्राप्त करने से पहले ब्रह्मांड समाप्त हो सकता है" लेकिन यह सबसे छोटा बाइट्स है जो कि xD को और क्या करता है
Abr001am

3

जावास्क्रिप्ट (ईएस 6) 222 232 265 279 319

अभी भी गोल्फ होना है। यह सभी समाधानों को खोजता है, आउटपुट केवल अंतिम पाया जाता है, और यह काफी तेज है।

परीक्षण करने के लिए फ़ायरफ़ॉक्स में स्निपेट चलाएँ

f=(n,h,b=[],s=0)=>
  (R=(z,l,p,k,t)=>
    z?b.map((v,a)=>
      v&&k.indexOf(v=t+a)<0&v<=s&&(
        --b[a],h=l+`[${'__'.repeat(a-1)}]`,
        v-s?R(z,h,[...p,v],k,v):R(z-1,h+'\n',[],p,0),
        ++b[a]
      ))
    :n=l
  )(h,'',[],[],0,n.map(n=>(b[n]=-~b[n],s+=n)),s/=h)&&n

// Test suite


out=x=>OUT.innerHTML=OUT.innerHTML+x+'\n'

;[ 
 [[1, 1, 2, 2], 2], [[1, 1, 1, 2, 2, 2, 2, 3], 2], [[1, 1, 2, 2, 3, 3, 3, 3], 3]
,[[1, 2, 3, 4, 5, 6, 7, 8, 9], 5], [[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5]]
.forEach(([a,b])=>out(a+' '+b+'\n'+f(a,b)))
<pre id=OUT></pre>

अनगुल्ड एंड समझाया

function f(n, h) {
  var b=[], s=0, result // in golfed version will re-use n for result variable
  n.forEach(function (n) {
    b[n] = -~b[n] // group equal input numbers in buckets
    s+=n          // calc sum of input numbers
  });
  // example of buckets: input 1,1,4,1,5,4 -> b[1]=3,b[4]=2,b[5]=1
  s /= h // total sum / height => sum expected for each brick layer

  // recursive scan function 
  function R(z, // layer count, from h downto 1
             l, // output so far
             p, // current layer partial sums array, mark intervals between bricks
             k, // prev layer parial sums, checked to avoid faulds
             t  // current partial sum 
             ) 
  {
    if (z > 0) 
    { // still building
      b.forEach( function (v,a) { // a:number from input list, v: repeat count 
        var w, m   // locals (in golfed version, reuse other variables avoid defining locals)
        w = t + a; // increased running total for current layer
        if (v != 0  // repeat count still > 0 
           && k.indexOf(w) < 0 // running total not found on list in prev layer (no fault)
           && w <= s) // current layer length not exceeded
        {
           --b[a]; // decrease repeat count, number used one more time
           m = l+"["+ '__'.repeat(a-1) + "]"; // new output with a brick added
           // l is not changed, it will be used again in this loop
           if (w == s) 
           {   // layer complete, go to next (if any)
               // recurse, new layer, add newline to output, p goes in k, and t start at 0 again
               R(z-1, m+'\n', [], p, 0); 
           }
           else
           {   // layer still to complete
               // recurse, same layer, m goes in l, add current sum to array p
               R(z, m, [...p,w], k, w);
           }
           ++b[a]; // restore value of repeat count for current loop
        }
      })
    }   
    else
    { // z == 0, all layers Ok, solution found, save in result and go on to next
      result = l;
    }
  }

  R(h,'',[],[],0);
  return result; // this is the last solution found
}

2

अजगर 2, ग्रिड विधि (290 वर्ण)

x,h=input()
from itertools import *
w = sum(x)*2/h
for p in permutations(x):
 bricks = ''.join('[' + '_'*(2*n-2) + ']' for n in p)
 cols = map(''.join,zip(*zip(*[iter(bricks)]*w)))
 if all(c=='[' for c in cols[0]) and all(c==']' for c in cols[-1]) and not any(']]' in col or '[[' in col for col in cols[1:-1]):
  print('\n'.join(map(''.join,zip(*cols))))
  print()

यहाँ विधि है कि आप ग्रिड को स्थानांतरित करें और कॉलम में [[या ]]कहीं भी देखें। आप यह भी परीक्षण करते हैं कि दीवार की रेखा के बाईं और दाईं ओर की सभी ईंटें: यहाँ पर क्यूट बात यह है कि एक स्ट्रिंग के सभी तत्व समान हैं:'[[[[[['.strip('[')==''


ऊपर का छोटा संस्करण:

x,h=input()
from itertools import*
w=sum(x)*2/h
z=zip
j=''.join
for p in permutations(x):
 C=map(j,z(*z(*[iter(j('['+'_'*(2*n-2)+']'for n in p))]*w)))
 if C[0].strip('[')==''and C[-1].strip(']')==''and not any(']]'in c or '[['in c for c in C[1:-1]):
  print('\n'.join(map(j,z(*C))))
  break

यह संभवतः मैट्रिक्स-हेरफेर भाषा में अधिक आसानी से किया जा सकता है।

... या रेक्सक्स का दुरुपयोग, जो हमें "कोई दरार" स्थिति के साथ "ब्लॉक को संरेखित करता है" स्थिति को संयोजित करने देता है:

कहो दीवार की चौड़ाई w = 6 थी। स्थानापन्न के स्थान "[..... [", और "] .....]" बिल्कुल सेट होना चाहिए {0, w-1, w, 2w-1,2w, 3w-1,। ..}। उन बिंदुओं पर नहीं-अस्तित्व का मतलब ईंटों का 'लिनेफ्रैप' जैसा है:

       v
[][__][_
___][__]
       ^

उन बिंदुओं पर अस्तित्व का अर्थ यह नहीं है कि दीवार में एक अस्थिर 'दरार' है:

     vv
[][__][]
[    ][]
     ^^

इसलिए हम समतुल्यता निर्धारित करने के लिए समस्या को कम करते हैं, जहां प्रश्नों में सेट एक नियमित अभिव्यक्ति मैच के सूचक हैं।

# assume input is x and height is h

from itertools import *
import re
w=sum(x)*2/h

STACKED_BRACKET_RE = r'(?=\[.{%i}\[|\].{%i}\])'%(w-1,w-1)  # ]....] or [....[
STRING_CHUNK_RE = '.{%i}'%w  # chunk a string with a regex!
bracketGoal = set().union(*[(x*w,x*w+w-1) for x in range(h-1)])  # expected match locations

for p in permutations(x):
 string = ''.join('['+'_'*(2*n-2)+']'for n in p)
 bracketPositions = {m.start() for m in re.finditer(STACKED_BRACKET_RE,string)}
 print(string, bracketPositions, bracketGoal, STACKED_BRACKET_RE) #debug
 if bracketPositions==bracketGoal:
  break

print('\n'.join(re.findall(STRING_CHUNK_RE,string)))

पायथन, रेगेक्सप विधि (304 वर्ण):

from itertools import*
import re
x,h=input()
w=sum(x)*2/h
for p in permutations(x):
 s=''.join('['+'_'*(2*n-2)+']'for n in p)
 if {m.start()for m in re.finditer(r'(?=\[.{%i}\[|\].{%i}\])'%(w-1,w-1),s)}==set().union(*[(x*w,x*w+w-1) for x in range(h-1)]):
  break

print('\n'.join(re.findall('.{%i}'%w,s)))

सीधे दोषों की जांच के लिए दीवार की तस्वीर के साथ काम करने वाला दिलचस्प विचार। आपको इनपुट लेने के लिए एक पंक्ति की आवश्यकता है, जैसे x,h=input()
xnor

0

मतलाब (359)

function p(V),L=perms(V);x=sum(V);D=find(rem(x./(1:x),1)==0);for z= 2:numel(D-1)for y=1:numel(L),x=L(y,:);i=D(z);b=x;l=numel(x);for j=1:l,for k=j-1:-1:2,m=sum(x(1:k));if mod(m,i),if mod(m,i)<mod(sum(x(1:k-1)),i)||sum(x(1:j))-m==i,b=0;,end,end,end,end,if b,for j=1:l,fprintf('[%.*s]%c',(b(j)-2)+b(j),ones(9)*'_',(mod(sum(x(1:j)),i)<1)*10);end,return,end;end,end

इनपुट

पूर्णांक का एक वेक्टर, उदाहरण: p ([1 1 2 2 3])

उत्पादन

दीवार उदाहरण की योजना:

[____]

[__][]

[][__]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.