墙上的91瓶ASCII啤酒


17

给定一个整数x,其中0 <= x <= 91输出一堆啤酒瓶,其中缺少许多瓶(和架子)。为简单起见,我将仅显示前6个瓶子,以及每个第一个输入的瓶子。

这是一堆瓶子,每个数字都是您应该为该输入(1索引)移除的瓶子:

https://pastebin.com/wSpZRMV6


请注意,我们使用91而不是99,因为99会导致不稳定的瓶子堆叠。


缺少0瓶(x=0):

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

有关0的完整输出,请参见此处:https : //pastebin.com/ZuXkuH6s


随着1瓶失踪(x=1):

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

再次,这是这里的前两行:https : //pastebin.com/ZuXkuH6s(已删除1个)...


缺少2瓶:

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

[已删除其他输入]


缺少91瓶(n = 91):

:(

您必须输出不高兴的表情,因为您没啤酒了。


规则

  • 瓶子应从左到右卸下。
  • 当架子上没有啤酒时,将架子移开。
  • 输入为0时,您将输出91个三角形堆积的瓶子。
    • 底行有13瓶,顶行有1瓶。
  • 每个架子上的每个瓶子之间有1个空间。
  • 必须在每行瓶子之间输入架子。
    • 货架可以使用=-#作为字符。
    • 架子必须比其容纳的瓶子宽3(在每一侧)。
  • 这是,最低字节数获胜。

例如,您能否提供至少整个测试用例之一的pastebin?
科纳·奥布莱恩

在架子的最后一瓶之后是否需要尾随空间?
乔纳森·弗雷希

前面的空格是必需的,因为您要从左到右删除它们,所以ASCII图片右侧的空格由您决定。
魔术八爪鱼缸

@ ConorO'Brien看到您没有指定哪个测试用例,所以我希望我将不满意的表情放在pastebin; P中。
魔术八达通骨灰盒

1
哦,我以为您选择91来阻止任何内置函数。o0
完全人类的,

Answers:


15

木炭99 91字节

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

在线尝试!链接是详细版本的代码。实际上,实际版本只有83 70字节:

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

说明:

F¹⁵Fι⊞υκ

填充一个阵列,以提供有关货架的位置以及货架多长时间的信息。

:(

打印一张不高兴的脸,尽管第一瓶啤酒(如果有)会立即覆盖它。

F⁻⁹¹N«

循环浏览剩余的啤酒瓶。

   F¬⊟υ«

检查是否需要绘制架子。

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

打印架子并准备好在其上方绘制下一个瓶子。

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

画一个瓶子并准备好画另一个瓶子。


6
嗯 太糟糕了,这个挑战不是大约99瓶啤酒。一定要减少8个字节:):P
HyperNeutrino

1
@EriktheOutgolfer这就是为什么我建议打高尔夫球8个字节:P而且是的,他实际上打高尔夫球8个字节:D
HyperNeutrino

2
@HyperNeutrino不完全;我打了11球,然后打了3球……
Neil

1
@KevinCruijssen通常,您会使用for循环递增。这是一个while循环,因此我必须手动进行一些操作。
尼尔

1
@KevinCruijssen虽然,考虑一下,for循环是一直的方法……节省了13个字节!(好吧,我很容易填充阵列。)
Neil

10

Python 3中306 299 265 253 255 252个 247 244字节

快速尝试,可以优化

编辑: -2字节感谢@MrXcoder

编辑: -32字节,因为不需要尾随空格

编辑:结合两个功能的-12个字节

编辑: -5字节感谢@ musicman523

编辑: +7字节以删除最后一行之后的架子

编辑: -3个字节

编辑: -5字节,由于lambda函数仅在映射中使用一次

编辑:通过使用字符串函数-3个字节center

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)*":(")

在线尝试!


@ Mr.Xcoder不适用于x = 2,x = 4,x = 5,x = 7,...
Halvard Hummel

哦,对了。抱歉!
Xcoder先生17年


2
删除E变量
即可达到

5

JavaScript(ES6),251 256字节

编辑: 由于@dzaima节省了2个字节。
编辑: 添加了7个字节来解决参数问题。:(

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

这是(大部分)非高尔夫版本:

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) : ':(';
}

测试码


非常令人印象深刻,很好的答案。我喜欢你的r“宏”。我觉得可能有一个更短的方法,但是我没有尝试降低任何方法。
ETHproductions'Aug

2

C(GCC) 360个 358字节

#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");}}});}

在线尝试!

说明:

#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字节

kes!

我的方法太冗长,但无论如何:它本质上是“绘制”每一行瓶子,添加空间,然后“擦除”任何必要的东西,打印剩下的东西。

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更好。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.