Xây tường gạch chắc chắn


39

Một bức tường gạch là một hình chữ nhật được làm bằng các viên gạch 1-by-n nằm ngang xếp thành hàng. Đây là một bức tường có chiều cao 4 và chiều rộng 8, với kích thước gạch được hiển thị bên phải.

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

Bức tường này không ổn định bởi vì nó có một lỗi , một nơi mà hai vết nứt dọc giữa các viên gạch xếp thành hàng, được hiển thị bên dưới với các ô vuông trong các viên gạch xung quanh.

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

Tuy nhiên, các vết nứt giáp với các viên gạch kích thước 1 bên phải không tạo ra lỗi vì chúng cách nhau một hàng.

Viết mã tìm và hiển thị một bức tường ổn định được xây dựng từ các viên gạch có kích thước được chỉ định. Ít byte nhất sẽ thắng.

Đầu vào

Danh sách kích thước gạch không trống (số dương) và chiều cao ít nhất là 2. Danh sách này có thể được sắp xếp nếu bạn muốn. Bạn có thể thay thế lấy một số lượng gạch của mỗi kích thước.

Đầu ra

Một hình ảnh của một bức tường hình chữ nhật ổn định của chiều cao yêu cầu sử dụng tất cả các viên gạch được đưa ra. In hoặc trả lại dưới dạng chuỗi với dòng mới.

Vẽ một viên gạch có kích thước n là 2n ký tự, dấu gạch dưới được bao quanh bởi dấu ngoặc.

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

Đầu vào được đảm bảo có ít nhất một giải pháp. Nếu có nhiều, bạn vẫn chỉ nên vẽ một bức tường.

Không có giới hạn thời gian; sử dụng nhiều sức mạnh như bạn muốn. Thuật toán của bạn trong lý thuyết nên hoạt động trên các đầu vào có kích thước bất kỳ.

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

Có nhiều giải pháp, vì vậy kết quả đầu ra của bạn có thể khác.

>> [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
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]

Tại sao bạn quyết định làm cho gạch rộng 2n ký tự thay vì rộng n> 1 ký tự?
Sparr

2
@Sparr 1 khối 2 ký tự trông gần như vuông. Tôi đã thử yêu cầu n>1và không thích cách nó hạn chế các trường hợp thử nghiệm. Ngoài ra, rõ ràng đã có tiền lệ .
xnor

Ý tôi không phải là 2n với n> 1. Ý tôi là n với n> 1.
Sparr

Câu trả lời:


20

Perl, 166 170 194

Một nhiệm vụ hoàn hảo cho một ngôn ngữ được tạo ra bởi Larry Wall.

#!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

Lực lượng vũ phu, nhưng khá nhanh trên các trường hợp thử nghiệm (<1s). Sử dụng:

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

Kiểm tra tôi .


9
Ha, tôi tự hỏi liệu Larry Wall có từng nghĩ mọi người sẽ sử dụng ngôn ngữ như vậy không ... :)
crazyhatfish

12

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 Hcá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 Hbứ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


9

Python 2, 680 670 660 byte

Tôi không biết tại sao tôi cứ khăng khăng muốn có những "sân golf" siêu dài này ... nhưng dù sao thì, bạn đi đây.

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))

Điều này đòi hỏi đầu ra theo thứ tự tăng dần được sắp xếp và được gọi thông qua b(brick_sizes, height).

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

>>> 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
... 
[__][]
[][__]

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

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

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

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

Cách thức hoạt động của nó là:

  1. Gán các viên gạch (dài nhất-> ngắn nhất) cho các lớp, cố gắng lấp đầy từng lớp trước khi chuyển sang lớp kế tiếp.
  2. Bất cứ khi nào các lớp liền kề không ổn định, hãy thử hoán đổi các lớp và dịch chuyển gạch cho đến khi bạn tìm thấy một cái gì đó hoạt động.
  3. Nếu không có gì hoạt động, di chuyển viên gạch dài nhất vào phía trước danh sách kích thước và lặp lại.

1
Bạn có thể có thể thả continuetừ gần cuối. Cũng return(N,N)sẽ không cần dấu ngoặc đơn.
PurkkaKoodari

cuộc gọi tốt - đó continuelà một di tích từ một phiên bản trước đó.
sirpercival

1
Không thể chạy nó, bạn có một khung không liên quan WTđược thông qua một đối số phụ.
crazyhatfish

Rất tiếc, cảm ơn bạn! đã sửa.
sirpercival

5

Haskell, 262 byte

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

Ví dụ sử dụng:

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

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

Cách thức hoạt động: chức năng chính #lấy một danh sách l(danh sách các viên gạch) và một số h(chiều cao) và phân chia tất cả các hoán vị lthành hdanh sách phụ ở tất cả các vị trí có thể (thông qua chức năng %, ví dụ 2%[1,2,3,4]-> [ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ]). Nó giữ cho những nơi mà hai phần tử liên tiếp có cùng một tổng (nghĩa là cùng độ dài trong các viên gạch) và danh sách các tổng phụ không có các phần tử chung (ví dụ: các vết nứt không xếp hàng, hàm v). Lấy danh sách đầu tiên phù hợp và xây dựng một chuỗi các viên gạch.


4

Trăn 2, 528 , 417 , 393 , 381

Rất lâu, giải pháp bruteforce. Nó hoạt động nhưng đó là về nó, vũ trụ có thể kết thúc trước khi nhận được kết quả cho trường hợp thử nghiệm cuối cùng.

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 là chức năng chính:

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

Bạn có thể lưu 4 byte bằng cách thay đổi nhập from itertools import*và xóa itertools.khỏi permutationscuộc gọi. Ngoài ra, ifs cuối cùng có thể được thay đổi thành if all(x==w[0] for x in w)and~-f(o):return... để lưu 13 byte.
PurkkaKoodari

Ngoài ra, không phải flúc nào cũng trở lại trong lần lặp đầu tiên? Trông thật lạ. Đó là một lỗi hoặc một cơ hội chơi gôn lớn.
PurkkaKoodari

Bạn có một tấn không gian bên ngoài có thể được loại bỏ - trước hoặc sau một trích dẫn / paren / ngoặc, bao quanh một toán tử, v.v. Bạn cũng đang gán t=0hai lần vào r(); bạn có thể biến chức năng đó thành map(sum,[x[:i] for i in range(len(x))])một lớp lót (phù hợp với lambda-ing nếu bạn muốn). Sử dụng isdisjoint và thiết lập trong f()sẽ giảm đáng kể ( f()hiện tại cũng trả về chỉ sau một thử nghiệm, cho dù nó có tìm thấy lỗi hay không). Cá nhân tôi sẽ viết lại f()như return not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:]))))hoặc một cái gì đó tương tự.
sirpercival

@ Pietu1998 Oh yeah, bỏ lỡ một khoảng trống. Cảm ơn những lời khuyên, tôi ngạc nhiên bạn có thể phát hiện ra những điều này.
crazyhatfish

cười quá tệ Tôi ghét loại mã đó trong đó "vũ trụ có thể kết thúc trước khi nhận được kết quả" nhưng đây là byte ngắn nhất để làm gì khác xD
Abr001am

3

JavaScript (ES6) 222 232 265 279 319

Vẫn được đánh golf. Điều này tìm thấy tất cả các giải pháp, đầu ra chỉ là tìm thấy cuối cùng, và nó khá nhanh.

Chạy đoạn trích trong Firefox để kiểm tra

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>

Ungolfed và giải thích

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

Python 2, phương thức lưới (290 ký tự)

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()

Phương pháp ở đây là bạn hoán chuyển lưới và tìm kiếm một [[hoặc ]]bất kỳ vị trí nào trong các cột. Bạn cũng kiểm tra rằng tất cả các viên gạch ở bên trái và bên phải của bức tường xếp thành hàng: điều dễ thương ở đây là kiểm tra xem tất cả các yếu tố của một chuỗi có giống nhau không:'[[[[[['.strip('[')==''


phiên bản mini ở trên:

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

Điều này có lẽ có thể được thực hiện dễ dàng hơn trong một ngôn ngữ thao tác ma trận.

... hoặc lạm dụng regexes, cho phép chúng ta kết hợp điều kiện "khối căn chỉnh trên đầu" với điều kiện "không có vết nứt":

Giả sử chiều rộng của bức tường là w = 6. Vị trí của chuỗi con "[..... [" và "] .....]" phải chính xác là tập {0, w-1, w, 2w-1,2w, 3w-1 ,. ..}. Không tồn tại ở những điểm đó có nghĩa là những viên gạch 'linewrap' như vậy:

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

Sự tồn tại KHÔNG ở những điểm đó có nghĩa là có một 'vết nứt' không ổn định trên tường:

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

Do đó, chúng tôi giảm vấn đề để đặt mức tương đương, trong đó các tập hợp trong câu hỏi là chỉ số của một biểu thức khớp chính quy.

# 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)))

Python, phương thức regrec (304 ký tự):

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)))

Ý tưởng thú vị làm việc với hình ảnh tường trực tiếp để kiểm tra lỗi. Bạn cần một dòng để lấy đầu vào, như thế nào x,h=input().
xnor 17/05/2015

0

Matlab (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

Đầu vào

một vectơ số nguyên, ví dụ: p ([1 1 2 2 3])

Đầu ra

sơ đồ của ví dụ tường:

[____]

[__][]

[][__]
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.