Nhà thẻ (phiên bản 2)


8

Cảm ơn FryAmTheEggman cho ý tưởng cho phiên bản thứ hai này.
Phiên bản 1 tại đây .

Thử thách không đơn giản: đưa ra một số thẻ, xây dựng ngôi nhà thẻ lớn nhất bạn có thể với số lượng thẻ đó, theo thứ tự xây dựng sau:

                          /\       /\         /\         /\/\
                 --       --       --         ----       ----
/\  →  /\/\  →  /\/\  →  /\/\  →  /\/\/\  →  /\/\/\  →  /\/\/\  →

                /\         /\
     --         --         --
    /\/\       /\/\       /\/\
    ----       ----       ----
→  /\/\/\  →  /\/\/\  →  /\/\/\/\  →  ...

Vì vậy, bạn bắt đầu với một ngôi nhà một tầng, sau đó xây dựng nhóm liền kề, sau đó đặt thẻ cầu, sau đó xây dựng nhóm ở tầng hai, sau đó bắt đầu xây dựng các nhóm và cầu từ tầng một theo đường chéo để đến tầng thứ ba, và vì vậy trên.

Một thẻ duy nhất sẽ được đại diện với a /, a \hoặc a --. Nếu sau khi sử dụng càng nhiều thẻ càng tốt, bạn chỉ còn một thẻ, chỉ cần xuất ra những gì bạn đã hoàn thành (xem ví dụ về 3 thẻ, kết quả tương tự như đối với 2 thẻ). Ngoại lệ duy nhất là trường hợp 1 thẻ, phải xuất ra một thẻ phẳng.

Ví dụ:

Input: 1
Output: 

--   <a card lying on the floor>

Input: 2
Output:

/\

Input: 3
Output:

/\

Input: 5
Output:

 --
/\/\

Input: 10
Output:

 /\
 ----
/\/\/\

Input: 20
Output:

  /\
  --
 /\/\/\
 ------
/\/\/\/\

Input: 39
Output:

    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Input: 40
Output:

    /\
    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Đầu vào có thể là số hoặc một chuỗi và sẽ luôn là số nguyên dương. Đầu ra phải chính xác như được hiển thị, với không gian hàng đầu và dấu và dòng mới được phép.

Đây là , vì vậy có thể chương trình / chức năng ngắn nhất cho mỗi ngôn ngữ sẽ giành chiến thắng!


Điều này đến từ hộp cát .
Charlie

6
Đó là một thử thách thú vị nhưng cá nhân tôi nghĩ bạn nên đợi lâu hơn một chút, có thể là một ngày, giữa việc đăng chúng.
caird coinheringaahing

@cairdcoinheringaahing Tôi thừa nhận rằng tôi không biết mình nên đợi bao nhiêu thời gian giữa hai bài viết. Đã được một thời gian kể từ câu trả lời cuối cùng cho phiên bản 1, vì vậy tôi cho rằng tôi có thể đăng nó ngay bây giờ (24 giờ sau). Cảm ơn lời khuyên của bạn, tôi sẽ ghi nhớ điều đó vào lần tới.
Charlie

2
Nếu chiều rộng của thẻ cầu là khác không, thì đầu ra cho 1 thẻ có phải là thẻ phẳng không?
Peter Taylor

2
Tôi nghĩ rằng một nửa các trường hợp thử nghiệm hiện đã sai, vì họ không tính đến khả năng đặt một lớp phẳng ở phía dưới. Hộp cát không thực sự hoạt động trừ khi bạn để lại câu hỏi trong đó vài ngày để mọi người có thời gian bình luận. (Và đối với "phần 2", điều quan trọng là phải làm rõ rằng đó là phần 2 để mọi người không nghĩ đó là phần 1 và họ đã xem nó).
Peter Taylor

Câu trả lời:


4

Than , 67 byte

Nθ⁼θ¹A²ηW¬‹θη«←÷η³↓→/…\/÷η³↙A⁻θηθA⁺³ηη»‖MM÷η³→Fθ≡﹪鳦¹«↗←\/»²«↑P²»«

Hãy thử trực tuyến! Lưu ý: Phiên bản mới nhất của Char than không cần »«cho 2 byte. Giải trình:

Nθ

Đọc đầu vào dưới dạng một số nguyên vào θ.

⁼θ¹

Trường hợp đặc biệt: nếu đầu vào là 1, hãy in a -.

A²ηW¬‹θη«

η đại diện cho số lượng thẻ cần thiết để xây dựng lớp tiếp theo, ban đầu 2. Một vòng lặp while lặp lại miễn là có đủ thẻ cho lớp đó.

←÷η³↓→/…\/÷η³↙

In nửa bên trái của lớp tiếp theo. (Tôi muốn in đúng một nửa, nhưng tôi không thể khiến nó phản ánh đúng vì một số lý do.) Số -s là một phần ba số lượng thẻ trong lớp, được làm tròn xuống. (Xem thêm câu trả lời của tôi cho phần 1.)

A⁻θηθA⁺³ηη»

Trừ số lượng thẻ từ số đầu vào và thêm ba thẻ vào số lượng cần thiết cho lớp tiếp theo.

‖M

Gương nhà cho đến nay. (Điều này cũng biến -thành --trường hợp của 1 thẻ.)

M÷η³→

Di chuyển con trỏ sang bên phải của ngôi nhà.

Fθ

Lặp lại cho mỗi thẻ còn lại (nếu có).

≡﹪鳦

Nếu thẻ modulo 3 là:

¹«↗←\/»

1, sau đó in một cặp thẻ;

²«↑P²»

2, sau đó in một thẻ ngang;

«

Nếu không thì bỏ qua thẻ (vì lúc này cần có một cặp).


Câu trả lời rất hay! Bạn đã bắt đầu viết nó trước khi tôi thay đổi trường hợp 1 thẻ? Trường hợp đó phải xuất ra --(một thẻ phẳng), nhưng nếu bạn bắt đầu chương trình của mình trước khi tôi thay đổi yêu cầu đó, tôi sẽ bỏ qua điều đó ...
Charlie

@CarlosAlejo Không, tôi chỉ quên trường hợp đó. Xin lỗi vì điều đó. Đã sửa bây giờ.
Neil

1
@ Bạn có chắc là mình không làm than không? Vì tôi bắt đầu không tin bạn.
Bạch tuộc ma thuật Urn

@MagicOctopusUrn D: hey (nhưng vâng, kỹ năng Than của Neil thật tuyệt vời, thậm chí còn tốt hơn của tôi haha)
ASCII-chỉ

Rất tiếc, sẽ được sửa trong lần xác nhận tiếp theo
ASCII chỉ có

2

Python 2 , 167 182 byte

167 byte

f=lambda x,y=0:y<x<2and"--"or~-x>y*3and f(x-2-y*3,y+1)or d(y,x)
d=lambda h,r,v=0:h and d(~-h,max(r-3,1),-~v)+" "*-~v+"--"*(h-(r<3))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"or""

182 byte

f=lambda x,y=0:[x>1+y*3and f(x-2-y*3,y+1)or d(y,x),"--"][2>x>y]
d=lambda h,r,v=0:d(h-1,r-3*(r>2)-2*(r==2),v+1)+" "*(v+1)+"--"*(h-1+(r>2))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"if h+r else""

Giải thích (phiên bản 167 byte)

f=lambda x,y=0:
    "--" if y<x<2         # handle case where x is 1 on step 0 (only one card) 
    else f(x-2-y*3,y+1)   # recursive call with one full triangular level accounted for
    if x>= 2+y*3          # one full level requires 2+3y cards (2, 7, 15...)
    else d(y,x)           # if no more full levels can be constructed, draw
d=lambda h,r,v=0:         # (h)eight to draw, (r)emaining cards, (v)ertical height already drawn (to determine leading white space)
    d(h-1,          ,v+1) # recursive call to draw upper lines
          max(r-3,1)      # subtract remainder cards used in this iteration
    +" "*(v+1)            # leading whitespace for -- row
    +"--"*(       )+"\n"  # -- line. 
           h-(r<3)        # horizontal card count is equal to the remaining count of levels to draw, minus 1, 
                          # ...plus 1 if there are at least three remaining cards to add to the right
    +" "*v                # leading whitespace for /\ row
    +"/\\"*(       )+"\n" # /\ line
            h+(r>1)       # vertical card pair count equals remaining level count
                          # ...plus 1 if there are at least two extra cards
    if h                  # return above is there are levels to draw (h) 
    else ""               # else return nothing (ends recursion)

Hãy thử trực tuyến!

  • Điều này cảm thấy dài một cách không cần thiết, nhưng tôi không thể thấy bất cứ điều gì để loại bỏ vào lúc này ... hãy bình luận bất kỳ đề xuất nào

Cảm ơn bạn rất nhiều vì bạn đã trả lời, nhưng ví dụ của bạn không khớp với các trường hợp kiểm tra, bạn đặt nhiều thẻ trong nhà của bạn hơn bạn có. Chẳng hạn, trong trường hợp có 7 thẻ, bạn có thể xây một ngôi nhà với 4 thẻ ở tầng một, thẻ cầu và thêm 2 thẻ ở tầng hai. Nhưng bạn cho thấy một ngôi nhà có 10 thẻ (6 thẻ trong lần thả đầu tiên và 2 thẻ cầu). Kiểm tra các ví dụ và cách các ngôi nhà được xây dựng.
Charlie


Nếu bạn muốn tách các phần mã trực tiếp theo nhau, bạn có thể làm như vậy bằng cách sử dụng các <pre><code>... </code></pre>thẻ xung quanh các khối riêng lẻ của mã thay vì thụt vào 4 khoảng trắng
Taylor Scott

1
Tôi thấy những gì đã xảy ra: vì một số lý do khi bạn đang sử dụng các <pre><code>thẻ mà nó đang chụp <3))+"\n"+" "*v+"/\\"*(h+(r>như một thẻ khác và không hiển thị vùng đó của giải pháp. Có lẽ ai đó trong cộng đồng hiểu điều này tốt hơn một chút có thể thông báo cho chúng tôi cách tránh điều đó ... nhưng ngoài định dạng hiện tại của bạn thì hoàn toàn có thể đọc được và do đó phủ nhận sự cần thiết của loại định dạng này cùng nhau
Taylor Scott

2
@TaylorScott Hơi muộn một chút nhưng bạn có thể khắc phục bằng cách thay thế chúng bằng các thực thể HTML: &lt;cho <&gt;cho>
Business Cat

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.