91 Chai bia ASCII trên tường


17

Cho một số nguyên duy nhất xtrong đó 0 <= x <= 91xuất ra một chồng chai bia với rất nhiều chai (và kệ) bị thiếu. Để đơn giản, tôi sẽ chỉ hiển thị 6 chai đầu tiên và nó sẽ là gì cho mỗi đầu vào đầu tiên.

Đây là chồng chai, mỗi số là chai bạn nên loại bỏ cho đầu vào đó (1 chỉ mục):

https://pastebin.com/wSpZRMV6


Lưu ý, chúng tôi đang sử dụng 91 thay vì 99 vì 99 sẽ dẫn đến một chồng chai không ổn định.


Thí dụ

Với 0 chai bị thiếu ( x=0):

             |=|            
             | |            
             | |            
            /   \           
           .     .          
           |-----|          
           |     |          
           |-----|          
           |_____|          
        =============       
         |=|     |=|        
         | |     | |        
         | |     | |        
        /   \   /   \       
       .     . .     .      
       |-----| |-----|      
       |     | |     |      
       |-----| |-----|      
       |_____| |_____|      
    =====================    
     |=|     |=|     |=|     
     | |     | |     | |     
     | |     | |     | |     
    /   \   /   \   /   \    
   .     . .     . .     .   
   |-----| |-----| |-----|   
   |     | |     | |     |   
   |-----| |-----| |-----|   
   |_____| |_____| |_____|   
=============================
 [THERE ARE MORE UNDER THIS]

Để có đầu ra đầy đủ bằng 0, xem tại đây: https://pastebin.com/ZuXkuH6s


Với 1chai bị thiếu ( x=1):

         |=|     |=|        
         | |     | |        
         | |     | |        
        /   \   /   \       
       .     . .     .      
       |-----| |-----|      
       |     | |     |      
       |-----| |-----|      
       |_____| |_____|      
    =====================    
     |=|     |=|     |=|     
     | |     | |     | |     
     | |     | |     | |     
    /   \   /   \   /   \    
   .     . .     . .     .   
   |-----| |-----| |-----|   
   |     | |     | |     |   
   |-----| |-----| |-----|   
   |_____| |_____| |_____|   
=============================
 [THERE ARE MORE UNDER THIS]

Một lần nữa, đây là hai hàng đầu tiên từ đây: https://pastebin.com/ZuXkuH6s (đã xóa 1) ...


Với 2 chai bị thiếu:

                 |=|        
                 | |        
                 | |        
                /   \       
               .     .      
               |-----|      
               |     |      
               |-----|      
               |_____|      
    =====================    
     |=|     |=|     |=|     
     | |     | |     | |     
     | |     | |     | |     
    /   \   /   \   /   \    
   .     . .     . .     .   
   |-----| |-----| |-----|   
   |     | |     | |     |   
   |-----| |-----| |-----|   
   |_____| |_____| |_____|   
=============================
 [THERE ARE MORE UNDER THIS]

[BỔ SUNG BỔ SUNG]


Với 91 chai bị thiếu ( n = 91):

:(

Bạn phải xuất ra một khuôn mặt không vui, vì bạn hết bia.


Quy tắc

  • Chai phải được loại bỏ từ trái sang phải.
  • Kệ được loại bỏ khi không còn bia trên đỉnh kệ.
  • Đối với đầu vào bằng 0, bạn đang xuất 91 chai được xếp thành một hình tam giác.
    • Hàng dưới có 13 chai, trên cùng có 1.
  • 1 khoảng trống giữa mỗi chai trên mỗi kệ.
  • Kệ phải được nhập giữa mỗi hàng chai.
    • Kệ có thể sử dụng =, -hoặc #như nhân vật.
    • Kệ phải rộng hơn 3 (ở mỗi bên) so với các chai họ giữ.
  • Đây là , byte thấp nhất.

Bạn có thể cung cấp, giả sử, một pastebin của ít nhất một trong toàn bộ các trường hợp thử nghiệm?
Conor O'Brien

Là không gian dấu sau chai cuối cùng cần thiết?
Jonathan Frech

Các khoảng trắng trước là bắt buộc, vì bạn đang loại bỏ chúng từ trái sang phải, các khoảng trắng ở bên phải của nghệ thuật ASCII tùy thuộc vào bạn.
Bạch tuộc ma thuật Urn

@ ConorO'Brien nhìn thấy khi bạn không chỉ định trường hợp thử nghiệm nào, tôi ước tôi đã đặt một khuôn mặt không vui trong một pastebin; P.
Bạch tuộc ma thuật Urn

1
Ồ, tôi nghĩ rằng bạn đã chọn 91 để ngăn chặn bất kỳ loại tích hợp nào. o0
hoàn toàn là

Câu trả lời:


15

Than , 99 91 byte

A⁻⁹¹NθA¹³η:(Wθ«A⌊⟦θη⟧ζA⁻θζθA⁻η¹ηFζ«↑⁴↖.\↑²←|=↓³←↙¹↓.P⁶↓²P⁶↓¹P______←| »¿θ«M⁹↑M³→×=⁻×⁸ζ³↑M⁴←

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Trên thực tế, phiên bản thực chỉ có 83 70 byte:

F¹⁵Fι⊞υκ:(F⁻⁹¹N«F¬⊟υ«M³±⁹×=⁺⁵×⁸⊟υ↑M⁴←»↑⁴↖.\↑²←|=↓³←↙¹↓.P⁶↓²P⁶↓¹P×_⁶←|←

Giải trình:

F¹⁵Fι⊞υκ

Điền vào một mảng cung cấp thông tin về nơi các kệ đi và thời gian chúng ở.

:(

In một khuôn mặt không vui, mặc dù điều này sẽ ngay lập tức bị ghi đè bởi chai bia đầu tiên (nếu có).

F⁻⁹¹N«

Vòng qua các chai bia còn lại.

   F¬⊟υ«

Kiểm tra xem một kệ cần phải được rút ra.

        M³±⁹×=⁺⁵×⁸⊟υ↑M⁴←»

In kệ và vị trí sẵn sàng để vẽ chai tiếp theo phía trên nó.

   ↑⁴↖.\↑²←|=↓³←↙¹↓.P⁶↓²P⁶↓¹P×_⁶←|←

Vẽ một chai và vị trí sẵn sàng để vẽ một chai khác.


6
Huh. Thật tệ, thử thách này không phải là khoảng 99 chai bia. Phải giảm 8 byte :): P
HyperNeutrino

1
@EriktheOutgolfer Đó là lý do tại sao tôi đề nghị chơi golf 8 byte: P Và yay anh ấy thực sự đã chơi golf 8 byte: D
HyperNeutrino

2
@HyperNeutrino Không chính xác; Tôi đã đánh gôn 11, sau đó vô dụng 3 ...
Neil

1
@KevinCruijssen Thông thường bạn sẽ tăng bằng cách sử dụng forvòng lặp. Đây là một whilevòng lặp, vì vậy tôi phải làm một số thứ thủ công hơn.
Neil

1
@KevinCruijssen Mặc dù, nghĩ về nó, một forvòng lặp là cách để đi hết ... 13 byte được lưu! (Chà, tôi đã có một chút may mắn với việc dễ dàng điền vào mảng của mình.)
Neil

10

Python 3 , 306 299 265 253 255 252 247 244 byte

Cố gắng nhanh, có thể được tối ưu hóa

Chỉnh sửa: -2 byte nhờ @MrXcoder

Chỉnh sửa: -32 byte làm dấu cách không cần thiết

Chỉnh sửa: -12 byte bằng cách kết hợp hai chức năng

Chỉnh sửa: -5 byte nhờ @ musicman523

Chỉnh sửa: +7 byte để loại bỏ kệ sau hàng cuối cùng

Chỉnh sửa: -3 byte

Chỉnh sửa: -5 byte do chức năng lambda chỉ được sử dụng một lần trong bản đồ

Chỉnh sửa: -3 byte bằng cách sử dụng hàm chuỗicenter

def l(y,x=13,z=" "):b=min(x,91-y);A,D="  |%s|  ","|-----|";print(y<91and(l(y+x,x-1)or"".join(map(lambda t:((t+z)*b)[:-1].center(103)+"\n",(A%"=",A%z,A%z," /   \ ",".     .",D,"|     |",D,"|_____|")))+z*(49-4*x)+"="*(x*8+5)*(x<13))or(x>12)*":(")

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


@ Mr.Xcoder sẽ không hoạt động cho x = 2, x = 4, x = 5, x = 7, ...
Halvard Hummel

Oh bạn nói đúng. Lấy làm tiếc!
Ông Xcoder


2
248 byte bằng cách xóa Ebiến
musicman523

5

JavaScript (ES6), 251 256 byte

Chỉnh sửa: Đã lưu 2 byte nhờ @dzaima .
Chỉnh sửa: Đã thêm 7 byte để khắc phục sự cố với tham số.:(

c=>(f=(c,w=13)=>c>0&&f(c-w,w-1)+(c=c<w?c:w,r=(n,s=' ')=>s.repeat(n),a='\n'+r(52-w*4),'  |=|  0  | |  0  | |  0 /   \\ 0.     .0|-----|0|     |0|-----|0|_____|'.split(0).map(x=>a+r((w-c)*8+2)+r(c,' '+x)).join('')+a+r(w*8+5,'#')),(c=91-c)?f(c).slice(6):':(')

Đây là phiên bản (hầu hết) chưa được chỉnh sửa:

function (consumed) {
  let remaining = 91 - consumed;

  function inner (count, width = 13) {
    if (count <= 0) return false;

    function repeat (count, string = ' ') {
      return string.repeat(count);
    }

    const pattern = [
      '  |=|  ',
      '  | |  ',
      '  | |  ',
      ' /   \\ ',
      '.     .',
      '|-----|',
      '|     |',
      '|-----|',
      '|_____|' ];

    let clamped = Math.min(count, width);
    let alignment = '\n' + repeat((13 - width) * 4);
    let empty = alignment + repeat((width - clamped) * 8 + 2);
    let shelf = alignment + repeat((width * 8) + 5, '#');
    let bottles = pattern.map(row => empty + repeat(clamped, ' ' + row));

    return inner(count - width, width - 1) + bottles.join('') + shelf;
  }

  return (remaining) ? inner(remaining).slice(6) : ':(';
}

Mã kiểm tra


Rất ấn tượng, câu trả lời tuyệt vời. Tôi thích r"vĩ mô" của bạn ; Tôi cảm thấy như có thể có một phương pháp ngắn hơn nhưng không có gì tôi cố gắng đưa nó xuống.
Sản phẩm ETH

2

C (gcc) , 360 358 byte

#define P printf(
r,i,j;char*b[]={"  |=|  ","  | |  ","  | |  "," /   \\ ",".     .","|-----|","|     |","|-----|","|_____|"};w(n){P"%*c",n,' ');}main(n,a)char**a;{(n=-atoi(a[1]))<-90?P":(\n"):({while(++r<14)if((n+=r)>0){for(j=0;j<9;++j){w(4*(13-r)+1);for(i=r;i>0;)--i<n?P b[j]),w(1):w(8);P"\n");}if(r<13){w(4*(13-r)-2);for(i=0;++i<8*r+6;)P"=");P"\n");}}});}

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

Giải trình:

#define P printf(
r,i,j;
char*b[]={
    "  |=|  ",
    "  | |  ",
    "  | |  ",
    " /   \\ ",
    ".     .",
    "|-----|",
    "|     |",
    "|-----|",
    "|_____|"};

// function to print `n` spaces:
w(n){P"%*c",n,' ');}

main(n,a)char**a;
{
    // no beer left?
    (n=-atoi(a[1]))<-90

        // sad face
        ?P":(\n")

        // else create stack
        // using GCC extension "expression statement" `({ <statement> })` here,
        // shorter than if-else or a function call
        :({
            // loop over 13 rows
            while(++r<14)

                // found non-empty row?
                if((n+=r)>0)
                {
                    // loop over text lines of beer bottles
                    for(j=0;j<9;++j)
                    {
                        w(4*(13-r)+1);

                        // for each bottle
                        for(i=r;i>0;)

                            // print either 8 spaces or line of the bottle
                            --i<n?P b[j]),w(1):w(8);P"\n");
                    }

                    // except for last row, ...
                    if(r<13)
                    {
                        // ... print shelf
                        w(4*(13-r)-2);
                        for(i=0;++i<8*r+6;)
                            P"=");
                        P"\n");
                    }
                }
        });
}

0

Python 2, 436 byte

Rất tiếc !!

Phương pháp của tôi quá dài dòng, nhưng dù sao đi nữa: về cơ bản là 'vẽ' từng hàng chai, thêm vào khoảng trống và sau đó 'xóa' mọi thứ cần thiết, in bất cứ thứ gì còn lại.

B=['  |=|   ','  | |   ','  | |   ',' /   \\  ','.     . ','|-----| ','|     | ','|-----| ','|_____| ']
N=lambda r:sum(n for n in range(1,r+1))
n=input()
R=0
while N(R)<n:R+=1
L=R-n+N(R-1)
e=range(1,R)+([R],[])[L!=0]
for r in range(1,14):
    if r in e:continue
    if(r-1 in e)<1:print('',' '*(1+(13-r)*4)+'='*(r*8-3))[r!=1]
    i=(0,R-L)[r==R];w=(8*i+(13-r)*4,0)[i==0];print'\n'.join([' '*w+((13-r)*4*' '+l*r)[w:]for l in B])
if n=91:print':('

Halvard Hummel's tốt hơn nhiều.

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.