91 벽에 ASCII 맥주 병


17

하나의 정수 x가 주어지면 0 <= x <= 91많은 병 (및 선반)이없는 맥주 병 스택이 출력됩니다. 간단하게하기 위해 처음 6 개의 병과 각 첫 입력에 대해 무엇이 표시되는지 보여줄 것입니다.

다음은 병 스택입니다. 각 숫자는 해당 입력에 대해 제거해야하는 병입니다 (1 색인).

https://pastebin.com/wSpZRMV6


99는 병 스택이 불안정하기 때문에 99 대신 91을 사용합니다.


병이없는 경우 ( 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보다 넓어야합니다.
  • 이것은 , 가장 낮은 바이트 수의 승리입니다.

예를 들어 전체 테스트 사례 중 적어도 하나의 페이스트 빈을 제공 할 수 있습니까?
코너 오브라이언

선반의 마지막 병 뒤에 후행 공간이 필요합니까?
Jonathan Frech

왼쪽에서 오른쪽으로 제거 할 때 선행 공백이 필요합니다. ASCII 아트 오른쪽의 공백은 사용자에게 달려 있습니다.
매직 문어 Urn

@ ConorO'Brien 어떤 테스트 케이스를 지정하지 않았을 때 페이스트 빈에 불행한 얼굴을 넣었 으면 좋겠다 .P.
매직 문어 Urn

1
오, 나는 당신이 내장을 막기 위해 91을 선택했다고 생각했습니다. o0
완전히 인간적인

답변:


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
P를 그리고 그가 실제로 골프 8 바이트했다 야호 : @EriktheOutgolfer은의 이유는 8 바이트 골프를 치는 것을 제안 D
HyperNeutrino

2
@HyperNeutrino 정확하게; 나는 골프를 치고 11 번 골프를 쳤다.
Neil

1
@KevinCruijssen 일반적으로 for루프를 사용하여 증가시킵니다 . 이것은 while루프이므로 더 수동으로해야합니다.
Neil

1
@KevinCruijssen 그것에 대해 생각하면서도 for루프는 모든 길을 갈 수있는 길이었습니다 ... 13 바이트가 절약되었습니다! (음, 나는 배열을
Neil

10

파이썬 (3) , 306 (299) 265 253 255 252 247 244 바이트

빠른 시도, 최적화 가능

편집 : @MrXcoder 덕분에 -2 바이트

편집 : 후행 공백이 필요하지 않으므로 -32 바이트

편집 : 두 기능을 결합하여 -12 바이트

편집 : @ musicman523 덕분에 -5 바이트

편집 : 마지막 행 이후 선반을 제거하려면 +7 바이트

편집 : -3 바이트

편집 : 맵에서 한 번만 사용되는 람다 함수로 인해 -5 바이트

문자열 함수를 사용하여 -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)*":(")

온라인으로 사용해보십시오!


x = 2, x = 4, x = 5, x = 7, ...에서 작동하지 않는 @ Mr.Xcoder
Halvard Hummel

아, 맞아 죄송합니다!
Mr. Xcoder


2
E변수 를 제거하여 248 바이트
musicman523

5

자바 스크립트 (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):':(')

다음은 (주로) ungolfed 버전입니다.

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

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

파이썬 2, 436 바이트

이케 !!

내 방법은 너무 장황하지만 어쨌든 : 그것은 본질적으로 병의 각 행을 '그립니다', 공백을 추가 한 다음 필요한 모든 것을 '지우고'남은 것을 인쇄합니다.

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

할 바드 험멜이 훨씬 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.