เบียร์ ASCII 91 ขวดบนกำแพง


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 อย่างน้อยหนึ่งกรณีทดสอบทั้งหมด?
Conor O'Brien

ช่องว่างต่อท้ายหลังจากขวดสุดท้ายของชั้นวางจำเป็นหรือไม่
Jonathan Frech

จำเป็นต้องมีช่องว่างก่อนหน้าเมื่อคุณลบออกจากซ้ายไปขวาช่องว่างทางด้านขวาของ ASCII-art นั้นขึ้นอยู่กับคุณ
Magic Octopus Urn

@ ConorO'Brien เห็นว่าคุณไม่ได้ระบุกรณีทดสอบใดฉันหวังว่าฉันจะได้ใบหน้าที่ไม่มีความสุขใน pastebin; P
Magic Octopus 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
@EriktheOutgolfer นั่นเป็นเหตุผลที่ฉันแนะนำการเล่นกอล์ฟขนาด 8 ไบต์: P และใช่แล้วที่เขาเล่นกอล์ฟขนาด 8 ไบต์: D
HyperNeutrino

2
@HyperNeutrino ไม่ตรง; ฉันเล่นกอล์ฟ 11 แล้วถอดรองเท้า 3 ...
Neil

1
@KevinCruijssen โดยปกติคุณต้องการเพิ่มโดยใช้การforวนซ้ำ นี่คือการwhileวนซ้ำดังนั้นฉันต้องทำอะไรด้วยตนเองมากกว่านี้
Neil

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 ไบต์เนื่องจากฟังก์ชั่นแลมบ์ดาถูกใช้เพียงครั้งเดียวในแผนที่

แก้ไข: -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

โอ้คุณพูดถูก ขออภัย!
Mr. Xcoder


2
248 ไบต์โดยลบEตัวแปร
musicman523

5

JavaScript (ES6) 251 256 ไบต์

แก้ไข: บันทึกไว้ 2 ไบต์ขอบคุณที่@dzaima
แก้ไข: เพิ่ม 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

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 ไบต์

อ๊ะ !!

วิธีการของฉันละเอียดเกินไปแต่ทว่า: โดยปกติแล้วมัน 'ดึง' แต่ละแถวของขวดเพิ่มในช่องว่างแล้ว 'ลบ' สิ่งที่จำเป็นการพิมพ์สิ่งที่เหลืออยู่

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 ดีกว่ามาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.