壁にASCIIビール91本


17

多数のボトル(および棚)が欠落しているビールのボトルのスタックを出力する単一の整数を指定x0 <= x <= 91ます。簡単にするために、最初の6本のボトルと、最初の各入力の内容を示します。

ボトルのスタックは次のとおりです。各数字は、その入力に対して削除する必要のあるボトルです(1から始まる):

https://pastebin.com/wSpZRMV6


99はボトルのスタックが不安定になるため、99ではなく91を使用していることに注意してください。


ボトルが0個不足している(x=0):

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

0の完全な出力については、こちらを参照してください:https : //pastebin.com/ZuXkuH6s


1ボトル(行方不明x=1):

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

繰り返しますが、これはここからの最初の2行です:https : //pastebin.com/ZuXkuH6s(1を削除)...


2本のボトルが不足している場合:

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

[追加の入力が削除されました]


91本のボトルが欠落している(n = 91):

:(

ビールが足りないので、不幸な顔を出力する必要があります。


ルール

  • ボトルは左から右に取り外します。
  • 棚の上にビールが残っていない場合、棚は取り外されます。
  • 入力が0の場合、三角形に積み重ねられた91本のボトルを出力しています。
    • 下の列には13本のボトルがあり、上の列には1本のボトルがあります。
  • 各棚の各ボトル間に1つのスペース。
  • 棚は、ボトルの各列の間に入力する必要があります。
    • 棚は=-または#キャラクターとして使用できます。
    • 棚は、それらが保持するボトルよりも3広い(両側)でなければなりません。
  • これは、バイト数が最も少なくなります。

たとえば、テストケース全体の少なくとも1つのペーストビンを提供できますか?
コナーオブライエン

棚の最後のボトルの後のスペースは必要ですか?
ジョナサンフレッチ

左から右にスペースを削除するため、ASCIIアートの右側のスペースはユーザー次第です。
魔法のタコUr

@ ConorO'Brienは、どのテストケースを指定していないのかを見て、ペーストビンに不幸な顔をしたと思います; P。
魔法のタコUr

1
ああ、あらゆる種類の組み込みを防ぐために91を選んだと思います。o0
totallyhuman

回答:


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
D:Pそして、彼が実際にゴルフに8つのバイトでしたYAY:私は8バイトのゴルフ提案理由です@EriktheOutgolfer
HyperNeutrino

2
@HyperNeutrino正確ではありません。11をゴルフし、3をゴルフしなかった...-
ニール

1
@KevinCruijssen通常、forループを使用してインクリメントします。これはwhileループなので、もっと手動で何かをしなければなりません。
ニール

1
@KevinCruijssen考えてみると、forループがすべての道のりでしたが... 13バイト節約されました!(まあ、私は自分のアレイに簡単に値を入れることができるので少し幸運になりました。)
ニール

10

Pythonの3306 299 265 253 255 252 247 244バイト

迅速な試行、最適化可能

編集:@MrXcoderのおかげで-2バイト

編集:末尾のスペースが必要ないため、-32バイト

編集: 2つの機能を組み合わせて-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

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

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

ハルバード・フンメルのほうがはるかに優れています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.