Số nguyên, lắp ráp!


30

Nhiệm vụ của bạn là tập hợp các số nguyên từ 1đến N(được đưa ra làm đầu vào) thành một hình chữ nhật có chiều rộng Wvà chiều cao H(cũng được đưa ra làm đầu vào). Các số riêng lẻ có thể được xoay bởi bất kỳ bội số 90 độ nào, nhưng chúng phải xuất hiện dưới dạng các khối liền kề trong hình chữ nhật. Nghĩa là, bạn không thể chia một trong các số thành nhiều chữ số và đặt các chữ số trong hình chữ nhật riêng lẻ, bạn cũng không thể uốn ba chữ số của một số quanh một góc. Bạn có thể coi mỗi số là một viên gạch mà từ đó bạn đang xây dựng một bức tường.

Đây là một ví dụ. Nói đầu vào của bạn là (N, W, H) = (12, 5, 3). Một giải pháp có thể là:

18627
21901
53114

Để rõ ràng, đây là hai bản sao của lưới này, một bản có các số có một chữ số và một bản có các số có hai chữ số được ẩn:

1####    #8627
2##01    #19##
##11#    53##4

Thật tốt nếu hình chữ nhật không thể được tháo rời một lần nữa theo một cách riêng. Ví dụ, trong ví dụ trên, 12cũng có thể được đặt như thế này:

#####    18627
21#01    ##9##
##11#    53##4

Quy tắc

Bạn có thể cho rằng Nlà tích cực và W*Hphù hợp với số chữ số trong số nguyên từ 1để Nbao gồm, và rằng một ốp lát của hình chữ nhật vào những con số được tồn tại. Tôi hiện không có bằng chứng cho dù điều này luôn luôn có thể, nhưng tôi sẽ quan tâm đến nó nếu bạn làm như vậy.

Đầu ra có thể là một chuỗi được phân tách bằng nguồn cấp dữ liệu đơn hoặc một danh sách các chuỗi (một chuỗi cho mỗi dòng) hoặc danh sách các danh sách các số nguyên một chữ số (một cho mỗi ô).

Kết quả của việc gửi của bạn phải là xác định và bạn sẽ có thể xử lý tất cả các trường hợp thử nghiệm trong vòng chưa đầy một phút trên máy tính để bàn hợp lý.

Bạn có thể viết chương trình hoặc chức năng và sử dụng bất kỳ phương pháp tiêu chuẩn nào để nhận đầu vào và cung cấp đầu ra.

Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào , nhưng lưu ý rằng các lỗ hổng này bị cấm theo mặc định.

Đây là , vì vậy câu trả lời hợp lệ ngắn nhất - được đo bằng byte - thắng.

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

Ngoại trừ cái đầu tiên, không cái nào trong số này là duy nhất. Mỗi trường hợp thử nghiệm được N W Htheo sau bởi một đầu ra có thể. Hãy chắc chắn rằng câu trả lời của bạn hoạt động khi hình chữ nhật quá hẹp để viết các số lớn hơn theo chiều ngang.

1 1 1
1

6 6 1
536142

6 2 3
16
25
34

10 1 11
1
0
8
9
2
6
7
3
1
5
4

11 13 1
1234567891011

27 9 5
213112117
192422581
144136119
082512671
205263272

183 21 21
183116214112099785736
182516114011998775635
181116013911897765534
180415913811796755433
179115813711695745332
178315713611594735231
177115613511493725130
176215513411392715029
175115413311291704928
174115313211190694827
173115213111089684726
172015113010988674625
171915012910887664524
170814912810786654423
169714812710685644322
168614712610584634221
167514612510483624120
166414512410382614019
165314412310281603918
164214312210180593817
163114212110079583716

200 41 12
81711132917193661114105533118936111184136
50592924448815915414562967609909953662491
89529721161671582389717813151113658811817
41418184511110119010183423720433017331118
35171183614003547461181197275184300111711
41874381132041861871718311415915921116264
11914245014112711011594492626831219331845
17125112629222085166344707736090956375181
94507611291431121128817413566319161275711
11011540021119913511011169939551729880780
92725141607727665632702567369893534277304
78118311405621148296417218591118562161856

8
Có một bằng chứng rằng điều này luôn luôn có thể?
Gây tử vong vào

@Firthize Câu hỏi hay thực sự. Bạn có thể cho rằng nó có thể cho tất cả các đầu vào đã cho, nhưng một bằng chứng nào đó sẽ rất thú vị.
Martin Ender

@Firthize: Ít nhất là trong trường hợp tầm thường của đầu vào (10, 1, 1), điều đó là không thể (giả sử rằng tất cả các số từ 1 đến NPHẢI được sử dụng trong xây dựng). Nếu ràng buộc đó được giữ, diện tích của hình chữ nhật tính theo đơn vị phải có ít nhất là số chữ số 1..Nđể có thể thực hiện được. Nếu sự hạn chế đó được nới lỏng, thì trong mọi trường hợp, điều đó có thể xảy ra (nhưng sau đó thử thách không thú vị lắm: P)
Sebastian Lenartowicz

2
@SebastianLenartowicz: Tôi nghĩ rằng bạn đã bỏ lỡ phần nói rằng diện tích của hình chữ nhật khớp với tổng các chữ số của các số trong [1, N]. Nếu N == 10, thì chiều rộng và chiều cao phải là 1 và 11. Nếu chiều rộng hoặc chiều cao là 1, vấn đề này luôn có thể giải quyết được.
Yay295

1
@MartinEnder Thử thách ngược lại cũng có thể thú vị: một dòng chữ số là đầu vào (và cuối cùng N, nhưng chương trình có thể tính toán nó từ chiều rộng và chiều cao), và chương trình cần kiểm tra xem hình chữ nhật có phải là câu trả lời cho thách thức này không. ...
Dada

Câu trả lời:


3

Bình thường, 35 byte

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY

Tín dụng cho mbomb007. Tôi đã sử dụng thuật toán của mình. Ban đầu tôi chỉ muốn giúp Steven H., nhưng sau đó tôi thực sự muốn xem một phiên bản ngắn.

Thực hiện Ntrên dòng đầu tiên và W,Htrên dòng thứ hai: Thử trực tuyến: Trình diễn

Tìm thấy một lỗi khó chịu trong việc thực hiện Pyth .[(lỗi của riêng tôi, kể từ khi tôi thực hiện nó). Phải sửa nó vào ngày mai. Điều này dẫn đến +3 byte.

Giải trình:

juum+WghHl+dQd~tQN<+.TGmkeHeH)_BvzY
                                  Y   start with the empty list []
                                      I'll perform all operations on this list. 
                                      Sometimes it is called G, sometimes N. 
                                vz    read the second line and evaluate it: [W, H]
                              _B      bifurcate it with reverse: [[W, H], [H, W]]
 u                                    for each pair H in ^:
                    .TG                  transpose G
                   +   mkeH              append H[1] empty strings
                  <        eH            use only the first H[1] strings
                                         lets call this result N
  u                          )           modify N, until it doesn't change anymore:
   m                        N               map each d in N to:
     WghHl+dQ                                  if H[0] >= len(d+Q):
    +        d  Q                                 d + Q
              ~t                                  and decrement Q by 1
             d                                 else:
                                                  d
j                                     at the end print every row on a separate line

7

Python 2, 210 200 byte

Chỉnh sửa: Hoạt động ngay!

Điền từ trên xuống dưới, từ trái sang phải, bắt đầu với số lượng lớn nhất. Sau đó, chuyển vị và làm lại. Sau đó chuyển vị và in. Tôi đã phải đệm các khoảng trống để chuyển vị trí hoạt động, vì các dòng chưa đến hết chiều dài của chúng.

Tôi gặp khó khăn khi execlàm việc lồng nhau (phải làm exec'exec"..."*w\n;...'*2. Nếu ai đó có thể tìm ra nó, hãy cho tôi biết.

n,w,h=input()
s=[""]*h
for x in 1,2:
    exec"for i in range(h):l=len(s[i]+`n`)<=w;s[i]+=`n`*l;n-=l\n"*w;s=[r.replace(" ","")for r in map(lambda x:`x`[2::5],zip(*[r.ljust(w)for r in s]))];w,h=h,w
print s

Dùng thử trực tuyến - Sử dụng chức năng đã sửa đổi để có thể chạy nhiều trường hợp kiểm tra dễ dàng hơn (và không thể sử dụngexec). Bỏ ghi chú phiên bản khác và sửa đổi stdin để xem nó chạy.

Ít chơi gôn hơn:

def f(n,w,h):
    s=[""]*h
    for x in 1,2:
        for j in[0]*w:
            for i in range(h):
                l=len(s[i]+`n`)<=w
                s[i]+=`n`*l
                n-=l
        s=[r.ljust(w)for r in s]
        s=map(lambda x:`x`[2::5],zip(*s))
        s=[r.replace(' ','')for r in s]
        w,h=h,w
    print"\n".join(s)

Hiện tại rất có khả năng nó sẽ hoạt động cho tất cả các trường hợp, nhưng một bằng chứng (không chính thức) vẫn sẽ được đánh giá cao. ;)
Martin Ender

@MartinEnder Một bằng chứng có lẽ nằm ngoài tôi. Đối với các số khác nhau về chiều dài, các trường hợp kiểm tra trở nên rất lớn. Nó có thể liên quan đến hoặc giống như bằng chứng về việc luôn luôn có một giải pháp.
mbomb007

6

JavaScript, 284 259 245 241 240 223 209 205 byte

// Golfed
let f = (N,W,H)=>eval('a=Array(H).fill("");while(N)g:{s=""+N--;d=s[L="length"];for(i in a)if(a[i][L]+d<=W){a[i]+=s;break g}for(p=0;d;++p){l=a[p][L];for(k=p+d;k>p;)l=a[--k][L]-l?W:l;while(l<W&&d)a[p+--d]+=s[d]}}a');

// Ungolfed
(N,W,H) => {
    a = Array(H).fill(""); // Create `H` empty rows.

    while (N) g : {
        s = "" + N--; // Convert the number to a string.
        d = s[L="length"]; // Count the digits in the number.

        // Loop through the rows trying to fit the number in horizontally.
        for (i in a) {
            if (a[i][L] + d <= W) { // If it fits.
                a[i] += s; // Append the number to the row.
                break g; // This is what a goto statement looks like in JavaScript.
            }
        }

        // Loop through the rows trying to fit the number in vertically.
        for (p = 0; d; ++p) {
            l = a[p][L]; // Get the length of the row.

            // Find `d` adjacent rows of the same length.
            for (k = p + d; k > p; ) {
                // If `a[--k][L] == l`, continue.
                // Else set `l` to `W` so the next loop doesn't run.
                l = a[--k][L] - l ? W : l;
            }

            // Put the characters in position.
            while (l < W && d)
                a[p+--d] += s[d];
        }
    }

    return a;
}

let test_data = [[1,1,1],
                 [6,6,1],
                 [6,2,3],
                 [10,1,11],
                 [10,11,1],
                 [11,13,1],
                 [27,9,5],
                 [183,21,21],
                 [184,2,222],
                 [200,41,12],
                 [1003,83,35]];

for (let test of test_data)
    console.log(f(test[0],test[1],test[2]));


1
Lưu 1 byte bằng cách sử dụng -thay vì !=kiểm tra xem hai số có khác nhau không.
Neil

2

Pyth, 79 50 48 byte

Không lọc cho đến khi tôi tìm ra lỗi (ví dụ: [6,6,1] trả về giống như [6,1,6]). Đây là lần đầu tiên tôi thử sử dụng Pyth, vì vậy tôi có thể thiếu rất nhiều tính năng.

Cảm ơn Jakube, đã lưu 29 byte và làm cho mã của tôi thực sự hoạt động!

Đã lưu hai byte khác bằng cách nhận ra rằng các repr()cuộc gọi là không cần thiết.

Về cơ bản, đây chỉ là bản dịch câu trả lời Python 2 của mbomb007.

AEJmkHFb2VHVGIgGl+@JNQ XNJ~tQ)))=.[.TJkGA,HG)jJ

Đưa đầu vào ở dạng
n
w,h.


2
Câu trả lời nên được xóa cho đến khi chúng là một giải pháp hợp lệ.
mbomb007

Tôi nghĩ rằng hầu hết các mã là chính xác. Lỗi duy nhất tôi thấy xảy ra trong quá trình chuyển vị. mbomb007 chuyển đổi bằng cách cẩn thận lấp đầy các cột còn lại bằng khoảng trắng, sau đó nén và xóa khoảng trắng. Guarentees này. rằng sau khi hoán vị ma trận có wđộ dài. =.TZkhông thể đảm bảo rằng, vì nó không biết chiều dài w.
Jakube

Trên thực tế, lỗi chính là, đó !>+@ZN`zK!>+@ZN`zJ. Sau đó tất cả các trường hợp thử nghiệm nhỏ làm việc. Nhưng bạn có thể tạo các trường hợp thử nghiệm, trong đó việc chuyển đổi không thành công (như được mô tả ở trên). Để làm việc này, bạn cần một cái gì đó như =.[.TZkK(điền vào các cột bị thiếu bằng các chuỗi trống) thay vì =.TZ.
Jakube

Và cố gắng đừng nhầm lẫn với Pyth. Trong mã của bạn, bạn có hai biến đa hướng đến cùng một giá trị (như K@Q1). Thật khó để theo dõi biến nào là giá trị nào, ... Và đừng chỉ sao chép mã. Giữ cho nó đơn giản. Thủ thuật boolean =Y...có thể là một ý tưởng tốt cho Python, nhưng một mẹo đơn giản I(nếu) sẽ dễ đọc hơn nhiều (và cũng ngắn hơn).
Jakube

Đây là một giải pháp thực sự đơn giản sử dụng mã của mbomb007: Liên kếtnnằm trên dòng đầu tiên (theo cách này chúng ta không phải gán giá trị cho một biến phụ, chúng ta chỉ cần sử dụng Q). Và whtrên dòng thứ hai, mà có được gám để GHvới AE.
Jakube

1

Stax , 27 byte

é!L↑?∞S░♠╔)¥¼/ÿµ◄÷│♦╫Δò6√√╣

Chạy và gỡ lỗi nó

Nó nhận đầu vào trên một dòng trong {N} {H} {W}.

Chương trình này bắt đầu với một lưới các không gian có kích thước được chỉ định. Đối với mỗi số từN .. 1, nó cố gắng thực hiện thay thế một chuỗi từ một chuỗi khoảng trắng có kích thước phù hợp sang số được định dạng. Nếu không có sự thay thế nào có thể được thực hiện, thì nó sẽ thử lại với một lưới chuyển.

z)A+*   create "grid" of spaces and newlines of specified size
,Rr     create range [n ... 1]
F       for each number execute the indented section; it will fit the value into the grid
  $%z(  make a string out of spaces the same length as the number; e.g. 245 => "   "
  Y     store the space string in register Y; this will be used as a search substring
  [#    count the number of occurrences of y in the grid; the grid is still on the stack
  X     store the count in register X; this will be used as a condition
  G     jump to routine at closing curly brace
  y_$|e replace the first instance of y (the spaces) with the current number
  xG    push x; then jump to routine at closing curly brace
        end program
}       called routine jump target
C       pop top of stack; if it's truthy terminate routine
|jM|J   split on newlines; transpose; join with newlines

Chạy cái này

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.