91 Botol ASCII-bir di Dinding

17

Diberi bilangan bulat tunggal di xmana 0 <= x <= 91keluaran setumpuk botol bir dengan banyak botol (dan rak) hilang. Demi kesederhanaan, saya hanya akan menunjukkan 6 botol pertama dan apa jadinya untuk masing-masing input pertama.

Berikut tumpukan botol, setiap nomor adalah botol yang harus Anda buang untuk input tersebut (diindeks 1):

https://pastebin.com/wSpZRMV6


Catatan, kami menggunakan 91 bukannya 99 karena 99 akan menghasilkan tumpukan botol yang tidak stabil.


Contoh

Dengan 0 botol hilang ( x=0):

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

Untuk hasil lengkap 0, lihat di sini: https://pastebin.com/ZuXkuH6s


Dengan 1botol yang hilang ( x=1):

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

Sekali lagi, ini adalah dua baris pertama dari sini: https://pastebin.com/ZuXkuH6s (dengan 1 dihapus) ...


Dengan 2 botol yang hilang:

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

[INPUT TAMBAHAN DIHAPUS]


Dengan 91 botol hilang ( n = 91):

:(

Anda harus menampilkan wajah yang tidak bahagia, karena Anda kehabisan bir.


Aturan

  • Botol harus dikeluarkan dari kiri ke kanan.
  • Rak dihapus ketika tidak ada bir yang tersisa di atas rak.
  • Untuk input 0, Anda mengeluarkan 91 botol yang ditumpuk dalam segitiga.
    • Baris bawah memiliki 13 botol, bagian atas memiliki 1.
  • 1 ruang antara setiap botol di setiap rak.
  • Rak harus menjadi input di antara setiap baris botol.
    • Rak dapat digunakan =, -atau #sebagai karakter.
    • Rak harus lebih lebar 3 (di setiap sisi) dari botol yang mereka pegang.
  • Ini adalah , kemenangan byte-count terendah.
Guci Gurita Ajaib
sumber
Bisakah Anda memberikan, katakanlah, pastebin dari setidaknya satu dari seluruh kasus uji?
Conor O'Brien
Apakah spasi tambahan setelah botol terakhir rak diperlukan?
Jonathan Frech
Ruang sebelumnya diperlukan, karena Anda memindahkannya dari kiri ke kanan, ruang di sebelah kanan ASCII-art terserah Anda.
Magic Gurita Guci
@ ConorO'Brien melihat bahwa Anda tidak menentukan test case yang mana, saya berharap saya telah menempatkan wajah yang tidak bahagia di pastebin; P.
Magic Gurita Guci
1
Oh, saya pikir Anda telah memilih 91 untuk mencegah segala jenis built-in. o0
totallyhuman

Jawaban:

15

Arang , 99 91 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sebenarnya versi aslinya hanya 83 70 byte:

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

Penjelasan:

F¹⁵Fι⊞υκ

Isi array yang memberikan informasi ke mana rak-rak itu pergi dan berapa lama mereka.

:(

Cetak wajah yang tidak bahagia, meskipun ini akan segera ditimpa oleh botol bir pertama (jika ada).

F⁻⁹¹N«

Loop melalui botol bir yang tersisa.

   F¬⊟υ«

Periksa untuk melihat apakah rak perlu ditarik.

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

Cetak rak dan posisinya siap untuk menggambar botol berikutnya di atasnya.

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

Gambarkan botol dan siapkan posisi untuk mengambil botol lain.

Neil
sumber
6
Hah. Sayang sekali tantangan ini bukan tentang 99 botol bir. Harus mendapatkan 8 byte bawah :): P
HyperNeutrino
1
@EriktheOutgolfer Itu sebabnya saya menyarankan bermain golf 8 byte: P Dan yay dia benar-benar bermain golf 8 byte: D
HyperNeutrino
2
@HyperNeutrino Tidak juga; Saya bermain golf 11, lalu ungolfed 3 ...
Neil
1
@KevinCruijssen Biasanya Anda akan naik menggunakan forloop. Ini adalah whileperulangan, jadi saya harus melakukan sesuatu secara lebih manual.
Neil
1
@KevinCruijssen Meskipun, memikirkannya, satu forloop adalah cara untuk berjalan terus ... 13 byte disimpan! (Yah, saya agak beruntung dengan mudahnya mengisi array saya.)
Neil
10

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

Upaya cepat, bisa dioptimalkan

Edit: -2 byte terima kasih kepada @MrXcoder

Sunting: -32 byte karena spasi tidak diperlukan

Edit: -12 byte dengan menggabungkan dua fungsi

Edit: -5 byte terima kasih kepada @ musicman523

Edit: +7 byte untuk menghapus rak setelah baris terakhir

Edit: -3 byte

Sunting: -5 byte karena fungsi lambda hanya digunakan satu kali di peta

Edit: -3 byte dengan menggunakan fungsi stringcenter

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

Cobalah online!

Halvard Hummel
sumber
@ Mr.Xcoder yang tidak akan berfungsi untuk x = 2, x = 4, x = 5, x = 7, ...
Halvard Hummel
Oh kamu benar Maaf!
Tn. Xcoder
2
248 byte dengan menghapus Evariabel
musicman523
5

JavaScript (ES6), 251 256 byte

Sunting: Disimpan 2 byte berkat @dzaima .
Sunting: Menambahkan 7 byte untuk memperbaiki masalah dengan parameter.:(

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

Inilah versi (sebagian besar) yang tidak disolf:

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

Kode uji

Aaron Hill
sumber
Sangat mengesankan, jawaban yang bagus. Saya suka r"makro" Anda; Saya merasa mungkin ada metode yang lebih pendek, tetapi tidak ada yang saya coba lakukan.
ETHproduk
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");}}});}

Cobalah online!

Penjelasan:

#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");
                    }
                }
        });
}
Felix Palmen
sumber
0

Python 2, 436 byte

Astaga !!

Metode saya terlalu bertele-tele, tetapi bagaimanapun juga: metode ini pada dasarnya 'menarik' setiap baris botol, menambahkan spasi, dan kemudian 'menghapus' apa pun yang diperlukan, mencetak apa pun yang tersisa.

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 jauh lebih baik.

Daniel
sumber