水風船を埋める


15

この課題では、風船に満たされた水の量を考慮して、水風船のASCIIアートを表示する必要があります。

|  __||__  |
| / #   #\ |
| |######| |
| |######| |
| |######| |
| |######| |
| |######| |
| \######/ |
|          |
|          |
+----------+

風船の描き方

サイズのバルーンを表示するnには、次の手順に従います(注:除算記号(/)が使用される場合は常に、整数の除算を表し、切り捨てます)。

  1. |左右に10 本の垂直バー()-、下部に10個のダッシュ()、および左下と右下にプラス記号(+)で構成されるコンテナーを描画します。これにより、全体が12x11になり、「内部」が10x10になります。

    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  2. 2つの垂直バー(バルーンの開口部)を一番上の行の中央に中央に描画し、両側にn/2アンダースコア(_)を付けます(この例で nは5)。

    |  __||__  |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  3. この一番上の行、1つ下の行を囲む/1 つのスラッシュ()と1つのバックスラッシュ()を描画し\ます。

    |  __||__  |
    | /      \ |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    |          |
    +----------+
    
  4. n等間隔の垂直バーの行を描画してから、(まだ等間隔の)バックスラッシュとスラッシュのペアの1行を描画します。

    |  __||__  |
    | /      \ |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | |      | |
    | \      / |
    |          |
    |          |
    +----------+
    
  5. ハッシュ記号(#)で表されるバルーンを水で「満たす」。一番下の行から始めて、上に向かって作業します。行が完全に埋められていない場合は、ハッシュマークを好きな場所に配置できます(以下の例では、ランダムに配置されていますが、必要に応じてすべて左側に配置できます)。

    |  __||__  |
    | / #   #\ |
    | |######| |
    | |######| |
    | |######| |
    | |######| |
    | |######| |
    | \######/ |
    |          |
    |          |
    +----------+
    

最大nは7、最小は0です。

入力

入力は整数でi、これは描画する必要のあるハッシュマーク(水)の量です。

2未満、または100を超えることはありません。

出力

出力は、ハッシュマーク(水単位)nを含むサイズのバルーンである必要がありますi。ここnで、i水単位を保持できる最小サイズです。以来i、常に2以上になりますn常に0以上になります。

バルーンを描画できる最大サイズはn7です。サイズ7のバルーンが指定された水の量に収まらない場合、バルーンがポップします。

|          |
|          |
|##  #  ###|
|##########|
|##########|
|##########|
|##########|
|##########|
|##########|
|##########|
+----------+

(上記は入力の出力である必要があります i = 76の。ポップされていないバルーンと同様に、最上行の6つの追加の水を自由に配置できます。)

テストケース

すべてを手に入れることができるのに、なぜ1つのテストケースがあるのがあるのですか?

i2から100までのすべての入力のアニメーションGIFは次のとおりです。

2から100までのすべてのiのアニメーション

得点

これはであるため、バイト単位の最短コードが優先されます。


回答:


2

オクターブ、523バイト

これらのバイトのうち23個は、n = 100の場合のみです。誰かがもっと効率的な方法を提案できるかもしれません...

n=input(0);x=zeros(11,6)+32;x(:,1)=124;x(11,:)=45;x(11,1)=43;
if n<5
w=3;h=2;a=2;
elseif n<7
w=3;h=3;a=2;
elseif n<17
w=4;h=4;a=4;
elseif n<37
w=5;h=6;a=6;
else
w=6;h=9;a=8;
end
if n<73
x(1,6)=124;x(1,9-w:5)=95;x(2,8-w)=47;x(3:1+h,8-w)=124;x(1+h,8-w)=92;x(2:1+h,9-w:6)=35;x=[x,fliplr(x)];x(2,5+w)=92;x(1+h,5+w)=47;x(2:1+floor((a*h-n)/a),9-w:4+w)=32;x(2+floor((a*h-n)/a),9-w+a-mod(a-n,a):4+w)=32;
else
x=[x,fliplr(x)];x(max(1,ceil((100-n)/10)):10,2:11)=35; if (n<100) x(ceil((100-n)/10),(2+mod(n,10)):11)=32; end
end
char(x)

テスト

入力: 21

出力:

| __ || __ |
| / \ |
| | | |
| | ### | |
| | ###### | |
| | ###### | |
| \ ###### / |
| |
| |
| |
+ ---------- +

2

Python 2、591バイト

しばらく時間がかかりましたが、おそらくもっとゴルフができるかもしれません。

大きなエラーがないことを願っています。

r=[list(x)for x in ("|          |!"*10+"+----------+").split('!')]
s,t=[0]*4+[1]*2+[2]*10+[3]*4+[4]*16+[5]*6+[6]*22+[7]*8+[8]*29,[(4,2,2),(4,3,2),(3,4,4),(3,5,4),(2,6,6),(2,7,6),(1,8,8),(1,9,8),(0,9,10)]
a,b,c,d,e='|','/','\\','_','#'
def p(x,y,w):r[y][x]=w
def q(l):
 h,j,u=l
 p(5,0,a);p(6,0,a)
 for o in range(4-h):p(h+o+1,0,d);p(h+u-o,0,d)
 p(h,1,b);p(h+u+1,1,c)
 for o in range(j-2):p(h,o+2,a);p(h+u+1,o+2,a)
 p(h,j,c);p(h+u+1,j,b)
def w(i,l):
 h,j,u=l
 for o in range(i):x,y=o%u,o/u;p(h+x+1,j-y,e)
def f(i):
 n=s[i]
 l=t[n]
 if n<8:q(l)
 w(i,l)
 print "\n".join(["".join(x)for x in r])

実行例:

f(34)

与える:

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