91 Duvardaki ASCII-bira şişesi


17

Tek bir tamsayı Verilen xnerede 0 <= x <= 91eksik birçok şişe (ve raflar) ile bira şişeleri çıktı yığın. Kolaylık için sadece ilk 6 şişeyi ve ilk girdilerin her biri için ne olacağını göstereceğim.

İşte şişe yığını, her sayı o giriş için kaldırmanız gereken şişe (1 endeksli):

https://pastebin.com/wSpZRMV6


Not, 99 yerine 91 kullanıyoruz, çünkü 99 kararsız bir şişe yığını ile sonuçlanacaktır.


Misal

0 şişe eksik ( x=0):

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

0'ın tam çıktısı için buraya bakın: https://pastebin.com/ZuXkuH6s


İle 1(şişe eksik x=1):

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

Bir kez daha, bu buradan ilk iki satır: https://pastebin.com/ZuXkuH6s (1 tanesi kaldırıldı) ...


2 şişe eksik olduğunda:

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

[EK GİRİŞLER KALDIRILDI]


91 şişe eksik ( n = 91):

:(

Mutsuz bir yüz çıkarmalısın, çünkü bira yok.


kurallar

  • Şişeler soldan sağa çıkarılmalıdır.
  • Rafların üstünde bira kalmadığında raflar çıkarılır.
  • 0 girişi için, üçgen şeklinde yığılmış 91 şişe çıkarıyorsunuz.
    • Alt sıra 13 şişeye, üst sıra 1'e sahiptir.
  • Her rafta her şişe arasında 1 boşluk.
  • Raflar her şişe sırası arasında girilmelidir.
    • Raflar kullanabilir =, -ya da #karakter olarak.
    • Raflar, sahip oldukları şişelerden 3 daha geniş (her iki tarafta) olmalıdır.
  • Bu , en düşük bayt sayısı kazanır.

Diyelim ki, tüm test vakalarından en az birinin bir macununu sağlayabilir misiniz?
Conor O'Brien

Bir rafın son şişesinden sonra arka boşluklar gerekli mi?
Jonathan Frech

Önceki boşluklar gereklidir, onları soldan sağa kaldırırken ASCII sanatının sağındaki boşluklar size kalmış.
Sihirli Ahtapot Urn

@ ConorO'Brien hangi test vakasını belirtmediğinizi görünce, keşke bir hamur kabına mutsuz bir yüz koymuş olsaydım; P.
Sihirli Ahtapot Urn

1
Oh, her türlü gömleği önlemek için 91'i seçtiğini sanıyordum. o0
totallyhuman

Yanıtlar:


15

Kömür , 99 91 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Aslında gerçek sürüm sadece 83 70 bayttır:

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

Açıklama:

F¹⁵Fι⊞υκ

Rafların nereye gittiği ve ne kadar sürdüğü hakkında bilgi veren bir dizi yerleştirin.

:(

Mutsuz bir yüz yazdırın, ancak ilk şişe bira (varsa) üzerine hemen yazılacak.

F⁻⁹¹N«

Kalan bira şişelerini çevirin.

   F¬⊟υ«

Bir rafın çizilmesi gerekip gerekmediğini kontrol edin.

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

Rafı ve konumu, bir sonraki şişeyi üzerine çizmeye hazır olarak yazdırın.

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

Bir şişe çizin ve başka bir şişe çizmeye hazır şekilde konumlandırın.


6
Huh. Çok kötü bu meydan okuma yaklaşık 99 şişe bira değil. 8 bayt almalıyım :): P
HyperNeutrino

1
@EriktheOutgolfer Bu yüzden 8 bayt: P golf önerdi ve aslında 8 bayt golf yaptı: D
HyperNeutrino

2
@HyperNeutrino Tam olarak değil; 11 golf oynadım, sonra 3 golf oynadım ...
Neil

1
@KevinCruijssen Normalde bir fordöngü kullanarak artarsınız . Bu bir whiledöngü, bu yüzden bir şey daha manuel olarak yapmak zorundayım.
Neil

1
@KevinCruijssen Buna rağmen, bir fordöngü baştan sona giden yoldu ... 13 bayt kurtardı! (Eh, benim dizi
Neil

10

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

Hızlı deneme, optimize edilebilir

Düzenleme: @MrXcoder sayesinde -2 bayt

Düzenleme: Sondaki boşluklara gerek olmadığından -32 bayt

Düzenleme: İki işlevi birleştirerek -12 bayt

Düzenleme: @ musicman523 sayesinde -5 bayt

Düzenleme: Son satırdan sonra rafı kaldırmak için +7 bayt

Düzenleme: -3 bayt

Düzenleme: Bir lambda işlevinin bir haritada yalnızca bir kez kullanılmasından dolayı -5 bayt

Düzenleme: dize işlevini kullanarak -3 baytcenter

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

Çevrimiçi deneyin!


@ Mr.Xcoder x = 2, x = 4, x = 5, x = 7, ... için çalışmaz
Halvard Hummel

Oh, haklısın. Afedersiniz!
Bay Xcoder


2
EDeğişkeni kaldırarak 248 bayt
musicman523

5

JavaScript (ES6), 251 , 256 bayt

Düzenleme: @dzaima sayesinde 2 bayt kaydedildi .
Düzenleme: Parametre ile ilgili sorunu çözmek için 7 bayt eklendi.:(

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

İşte (çoğunlukla) çözülmemiş sürüm:

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

Test kodu


Çok etkileyici, harika bir cevap. r"Makro" nuzu seviyorum ; Daha kısa bir yöntem olabilir gibi hissettim ama çalıştığım hiçbir şey onu herhangi bir düştü.
ETHproductions

2

C (gcc) , 360 358 bayt

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

Çevrimiçi deneyin!

Açıklama:

#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 bayt

Amanın !!

Benim yöntemim çok ayrıntılı, ama yine de: aslında her bir şişe sırasını 'çiziyor', boşluklara ekliyor ve daha sonra gerekli olan her şeyi 'siliyor'.

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 çok daha iyi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.