ASCIIブックシェルフ


27

基本的に一緒に積み重ねることができる木製の箱である積み重ね可能な棚を知っていますか?ASCIIアートを使用した本棚から本棚を作成することをシミュレートします。

私たちの本はすべて便利なサイズで統一されており、すべて次のように見えます。

|X|
|X|
|X|

本棚は個別の箱で、常に内側が3文字の高さ(直立した本に収まるのに十分な大きさ)で、|左右の-文字、上下の文字で構成され、X本が収まるのに十分な幅です(X入力は整数)。たとえば、サイズの本棚は3次のとおりです。

|---------|
|         |
|         |
|         |
|---------|

3書籍をそのように収めることができるからです

|---------|
||X||X||X||
||X||X||X||
||X||X||X||
|---------|

入力は、2つの厳密に正の整数にXなりますY。ここXで、棚の幅(本で測定)と、Y積み重ねなければならない本の数です。1つの棚に収まるよりも多くの本がある場合は、上部にさらに棚を追加する必要があります。たとえば、ここに入力があります4 wide / 6 books

|------------|
||X||X|      |
||X||X|      |
||X||X|      |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|

Y % X > 0書籍の数が棚サイズの整数倍でないことを意味する場合、残りの書籍は一番上の左端の位置に移動し(4 6上記の場合のように)、その棚の残りの部分はスペース。

入力

  • 二厳密に正の整数任意の便利な形式で、各>0
  • どちらの順序でも入力できます(たとえば、棚のサイズを最初に、次に本の数、またはその逆)。提出物に入力順序を明記してください。
  • どちらの入力も、言語のデフォルト[int]サイズ(または同等のサイズ)よりも大きくないと想定できます。

出力

結果として生じる本と本棚のASCIIアート表現。

ルール

  • 文字自体が正しく並んでいる限り、先頭または末尾の改行または空白はすべてオプションです。
  • 完全なプログラムまたは機能のいずれかが受け入れられます。関数の場合、出力する代わりに出力を返すことができます。
  • 可能であれば、他の人があなたのコードを試すことができるように、オンラインテスト環境へのリンクを含めてください!
  • 標準的な抜け穴は禁止されています。
  • これはので、通常のゴルフルールがすべて適用され、最短のコード(バイト単位)が勝ちます。

さらなる例

6 wide / 2 books
|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|

2 wide / 6 books
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|

4 wide / 9 books
|------------|
||X|         |
||X|         |
||X|         |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|

図書の最低額と棚が下になるように、私はそれが上から下に埋めので、同じように、それを作ることができます
黄金比

1
@GoldenRatioいいえ、本は下から上、左から右に記入する必要があります。
AdmBorkBork

回答:


14

JavaScript(ES6)、100 99 98バイト

カリー化構文wの本の幅と数を取りbます(w)(b)

w=>g=(b,s=`|${'-'.repeat(w*3)}|
`,r=s.replace(/---/g,_=>b&&b--?'|X|':'   '))=>(b?g(b)+s:s)+r+r+r+s

フォーマットおよびコメント

w =>                                // main function: takes width 'w' as input, returns 'g'
  g = (                             // g = recursive function with:
    b,                              //   - b = number of books
    s = `|${'-'.repeat(w * 3)}|\n`, //   - s = top/bottom of shell, filled with '-'
    r = s.replace(                  //   - r = pattern of the current row of books,
      RegExp('---', 'g'),           //         using 's' as a template and updating
      _ => b && b-- ? '|X|' : '   ' //         'b' while building it
    )                               // NB: 'r' must be defined in the scope of 'g',
  ) =>                              //     otherwise it would be overwritten by
    (                               //     subsequent calls
      b ?                           // if there are remaining books:
        g(b) + s                    //   do a recursive call and append shell top
      :                             // else:
        s                           //   just append shell top
    ) + r + r + r + s               // append book rows and shell bottom

テストケース


9

Bash(+ユーティリティ)、 130108、106バイト

本棚をレンダリングする単一の連続したシェルパイプライン。

変更ログ:

  • 最適化された最初のsed式を少し、-12バイト(Thx @Riley!)
  • printf + seq生のprintf-10バイトに置き換えられます
  • 2番目のsed式、-2バイトをリファクタリング

ゴルフ

printf %$2s\\n|fold -$1|sed "s/ /|X|/g;:;/.\{$[$1*3]\}/!s/$/ /;t;h;s/./-/gp;x;p;p;p;x"|sed 's/.*/|&|/'|tac

$./shelf 6 8
|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|
|------------------|
||X||X||X||X||X||X||
||X||X||X||X||X||X||
||X||X||X||X||X||X||
|------------------|

オンラインでお試しください!

使い方

$./shelf 2 3

printf %$2s\\n-ブックごとに1つずつ、n個の空白文字を生成します(として表示_

___

fold -$1 -棚の長さで折ります

__
_

sed "s/ /|X|/g;"-交換する_X、ブックカバーを追加

|X||X|
|X|

:;/.\{$[$1*3]\}/!s/$/ /;t-スペースを含む右パッド(として表示_

|X||X|
|X|___

h;s/./-/gp;x;p;p;p;x-各行を3回複製し、その---前後に追加します。

------
|X||X|
|X||X|
|X||X|
------
------
|X|   
|X|   
|X|   
------

sed 's/.*/|&|/'|tac-行を折り返し| |、tacで反転

|------|
||X|   |
||X|   |
||X|   |
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|

最初のsedでは、名前のないラベルを使用できますが、t代わりにをb使用する必要はありません{}s/./-/gそれらはすでに-sであるため、スキップできます。オンラインでお試しください!
ライリー

@Rileyそれは素晴らしいアドバイスです、ありがとう!
ツェッペリン

6

パイソン2、133の 113 105バイト

もっと良い方法があると確信しています...

X,Y=input()
k='|'+'---'*X+'|'
while Y:g=Y%X or X;print k+'\n'+('|'+'|X|'*g+'   '*(X-g)+'|'+'\n')*3+k;Y-=g

入力が取得されます width, books

不要なラムダ関数に気付いた@ovsに感謝します!
入力を短縮してくれた@ovsに感謝します。


X,Y=input()to値をとるより短い方法です。
ovs

@ovsああ、待って、私はそれを最初の試みのためにそこに置いた。おっと。いいキャッチ、ありがとう!
ハイパーニュートリノ

1
@ovsおかげで、入力はとして扱われX, Yますよね?
ハイパーニュートリノ

2
'|'変数として定義することで2バイト節約できると思います。
Ørjanヨハンセン

6

バッチ、261バイト

@set/an=~-%1%%%2+1,b=%1-n
@set s=
@set t=
@for /l %%i in (1,1,%2)do @call set t=---%%t%%&if %%i gtr %n% (call set s=%%s%%   )else call set s=%%s%%X
@for %%s in ("|%t%|" "|%s:X=|X|%|" "|%s:X=|X|%|" "|%s:X=|X|%|" "|%t%|")do @echo %%~s
@if %b% gtr 0 %0 %b% %2

バッチアンサーからテニスのレッツに私のトリックを使用して、多くの|キャラクターを簡単に印刷します。


5

Haskell、100バイト

x#yxy本の文字列を返します。

s?n=[1..n]>>s
x#y|x<y=x#(y-x)++x#x|w<-"---"?x,b<-"|X|"?y++"   "?(x-y)=[w,b,b,b,w]>>=('|':).(++"|\n")

オンラインでお試しください!

主な機能/演算子は#です。ときx<y、それはに本を分割y-xしてx、その後、再帰。場合x>=ywおよびb2つのラインタイプ、マイナス外である|Sおよび改行。

ヘルパー演算子は、文字列のコピーをs?n連結nしますs


5

PowerShell149 134バイト

param($w,$b)$s="|$('-'*$w*3)|"
if($a=$b%$w){,$s+,"|$('|X|'*$a)$(' '*3*($w-$a))|"*3+$s}
if($b-=$a){(,$s+,"|$('|X|'*$w)|"*3+$s)*($b/$w)}

オンラインでお試しください!

入力idth $w$booksを受け取ります。文字列$sを水平棚の1つに設定します。次に、2つのifステートメントがあります。

最初は、「残り」の本があるかどうかをチェックします。その場合、シェルフ、(本の数とスペースの数)*3、および別のシェルフを出力します。

次に、残りを削除した後も本が残っているかどうかを確認します($a)。$w多くの本を使用していることを除いて、同じ種類のセットアップ。この時点で$bはの倍数であることが保証されている$wため(残りを削除したため$a)、丸めを心配する必要はありません。

[math]::Floor()呼び出しを削除し、15バイトを節約しました

これらの文字列はすべてパイプラインに残りWrite-Output、プログラムの完了時に暗黙的に発生します。


4

CJam62 61バイト

q~1a*W$/W$f{0e]}{{"|X|"S3*?}%s__'-3*W$*_}%1m>W%"|
|"*"||"\*o;

入力を受け取ります width books

オンラインでお試しください!

説明

q~           Read and eval input (pushes width W and books B to the stack)
1a*          Push an array containing  the number 1 B times
W$/          Split it into chunks of size W
W$f{0e]}     Pad each chunk to width W by adding 0's to the right (the last chunk might be 
              shorter than W)
{            Apply the following to each chunk:
 {            Apply the following to each number in the chunk:
  "|X|"S3*?    Push "|X|" if the number is 1, or "   " if it's 0
 }%           (end of block)
 s            Stringify (joins with no separator)
 __           Duplicate twice (each shelf is 3 identical lines)
 '-3*W$*_     Push a string containing '-' repeated 3×W times, then duplicate it
}%           (end of block)
              At this point we have an array containing sequences of 3 identical lines 
              each followed by two lines of -'s
1m>          Rotate the array 1 to the right; brings the final line of -'s to the start
W%           Reverse the array, so that the top shelf is the partially empty one
"|\n|"*      Join the array with the string "|\n|", to build the sides of the shelves
"||"\*       Join the string "||" with the shelf string (adds the first and last | chars)
o            Print the result
;            Pop and discard W

4

Python 3、142バイト

まだそれに取り組んでいます。bは「本の数」w用で、棚の幅用です。

def s(b,w):
 R=b%w
 B='|\n'
 I='|'
 X='|X|'
 d=I+3*w*'-'+B
 f=I+X*w+B
 p=I+R*X+3*(w-R)*' '+B
 print(R and d+3*p+d or" ")+b//w*(d+3*f+d))

PPCGへようこそ!R=b%w次の行に移動しない限り、これは機能しません。また、これらの3つの周囲の空白を削除して、=いくつかのバイトを節約できる必要があります。
ビジネス猫

PPCGへようこそ!
AdmBorkBork

あなたは置き換えることができd+3*p+d if R!=0 else ''R and d+3*p+d or''
shooqie

@shooqie私は興味がありますが、これはどのように評価できd+3*p+dますか?
フアンメレイロ

1
セミコロンを使用してすべての定義を1行に入れることで、数バイトを節約できます。
-L3viathan

3

AHK、208バイト

AutoTrim,Off
w=%1%
b=%2%
f:=Mod(b,w)
Loop,%w%
s=%s%---
s=|%s%|`n
If (f>0) {
Loop,%f%
t=%t%|X|
Loop,% w-f
t=%t% ` ` `
t=|%t%|`n
t:=s t t t s
}
Loop,%w%
r=%r%|X|
r=|%r%|`n
Loop,% (b-f)/w
t:=t s r r r s
Send,%t%

さらにゴルフをすることで私をイライラさせるいくつかのことがあります:

  • AutoHotkeyにはリピート機能が組み込まれていません
  • あなたは、直接(引数で渡さ使用することはできません%1%%2%ものは、変数や数値入力を期待するため、数学関数で)、それがエスケープされていないと仮定します1ナンバーワンではなく、変数名であります
  • 私はゴルフが得意ではありません

上記の読みやすいバージョンは次のようになります。

AutoTrim,Off
w=%1%
b=%2%
f:=Mod(b,w)

Loop,%w%
   s=%s%---
s=|%s%|`n

If (f>0) {
   Loop,%f%
      t=%t%|X|
   Loop,% w-f
      t=%t% ` ` `
   t=|%t%|`n
   t:=s t t t s
}

Loop,%w%
   r=%r%|X|
r=|%r%|`n

Loop,% (b-f)/w
   t:=t s r r r s

Send,%t%

a Loopが角括弧を使用しない場合、{}次の行のみがループの一部になります。の:=代わりに変数の値を設定する場合=、パーセント記号のエスケープ文字をドロップできます。チルダnは改行文字です。


3

Java 7、230 224 222バイト

String c(int w,int b){String r="",n="|\n",z="|";int i=0,j,k,t=b%w<1?w:b%w,x=b/w+(t!=w?1:0);for(;i++<w;z+="---");z+=n;for(i=0;i<x;i++){r+=z;for(j=0;j++<3;r+=n){r+="|";for(k=0;k<w;r+=i<1&k++>=t?"   ":"|X|");}r+=z;}return r;}

説明:

String c(int w, int b){                // Method with two integer parameters and String return-type
  String r = "",                       //  The return-String
         n = "|\n",                    //  Part that's used multiple times in the code
         z = "|";                      //  Shelf part of the book-boxes
  int i = 0, j, k,                     //  Indexes used in the for-loops
      t = b%w < 1 ? w : b%w,           //  Books on top shelf
      x = b/w + (t != w ? 1 : 0);      //  Amount of shelves
  for(; i++ < w; z += "---"); z += n;  //  Create the shelf-part ("|---|"; with w times "---")
  for(i = 0; i < x; i++){              //  Loop over the rows
    r += z;                            //   Append the result with the shelf-part
    for(j = 0; j++ < 3; ){             //   Loop three times (the height of the books & boxes)
      r += "|";                        //    Append the result-String with "|"
      for(k = 0; k < w;                //    Loop over the columns
          r +=                         //     And append the result-String with:
           i < 1                       //      If this is the first row:
           & k++ >= t ?                //      And the current column is larger or equal to the amount of books in the top shelf
             "   "                     //       Use an empty space
           :                           //      Else:
             "|X|"                     //       Use the book-part
            );                         //    End of columns loop
         r += n;                       //    Append the result-String with a "|" and a new-line
       }                               //   End of the loop of three
      r += z;                          //   Append the result-String with the shelf-part
    }                                  //  End of rows loop
    return r;                          //  Return the result-String
 }                                     // End of method

テストコード:

ここで試してみてください。

class M{
  static String c(int w,int b){String r="",n="|\n",z="|";int i=0,j,k,t=b%w<1?w:b%w,x=b/w+(t!=w?1:0);for(;i++<w;z+="---");z+=n;for(i=0;i<x;i++){r+=z;for(j=0;j++<3;r+=n){r+="|";for(k=0;k<w;r+=i<1&k++>=t?"   ":"|X|");}r+=z;}return r;}

  public static void main(String[] a){
    System.out.println(c(6, 2));
    System.out.println(c(2, 6));
    System.out.println(c(4, 9));
  }
}

出力:

|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|

|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|

|------------|
||X|         |
||X|         |
||X|         |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|


@OlivierGrégoire約1.5年前にこれを投稿したことを考えると、かなりの量のゴルフができることに驚かない。;)
ケビンクルーイッセン

わー...日付は確認していませんでした。この質問がアクティブで、Javaの他の完全なアルゴリズムが可能であることを確認しただけです。私の悪い...
オリビエグレゴワール

@OlivierGrégoire問題はありませんでしたし、あなたの答えはよくできました。:)テストケースと出力を回答に追加し、Java 8をまだ理解していないため、Java 7ですべてに回答したとき、この回答を振り返ると懐かしい感じがします。XD
ケビンクルーイッセン

2

PowerShell、109バイト

param($w,$b)for(;$b;$b-=$c){if(!($c=$b%$w)){$c=$w}($l="|$('-'*$w*3)|")
,"|$('|X|'*$c)$(' '*($w-$c)*3)|"*3
$l}

ゴルフの少ないテストスクリプト:

$f = {

param($w,$b)
for(;$b;$b-=$c){
    if(!($c=$b%$w)){$c=$w}
    ($l="|$('-'*$w*3)|")
    ,"|$('|X|'*$c)$(' '*($w-$c)*3)|"*3
    $l
}

}

@(
    ,(6, 2, 
    "|------------------|",
    "||X||X|            |",
    "||X||X|            |",
    "||X||X|            |",
    "|------------------|")

    ,(2, 6,
    "|------|",
    "||X||X||",
    "||X||X||",
    "||X||X||",
    "|------|",
    "|------|",
    "||X||X||",
    "||X||X||",
    "||X||X||",
    "|------|",
    "|------|",
    "||X||X||",
    "||X||X||",
    "||X||X||",
    "|------|")

    ,(4, 9,
    "|------------|",
    "||X|         |",
    "||X|         |",
    "||X|         |",
    "|------------|",
    "|------------|",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "|------------|",
    "|------------|",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "||X||X||X||X||",
    "|------------|")
) | % {
    $w,$b,$expected = $_
    $result = &$f $w $b
    "$result"-eq"$expected"
    $result
}

出力:

True
|------------------|
||X||X|            |
||X||X|            |
||X||X|            |
|------------------|
True
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
|------|
||X||X||
||X||X||
||X||X||
|------|
True
|------------|
||X|         |
||X|         |
||X|         |
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|
|------------|
||X||X||X||X||
||X||X||X||X||
||X||X||X||X||
|------------|

PowerShell、109バイト、代替

param($w,$b)for(;$b;$b-=$c){($l="|$('---'*$w)|")
,"|$('|X|'*($c=(($b%$w),$w-ne0)[0]))$('   '*($w-$c))|"*3
$l}

1

パイソン2120の 118バイト

i,j=input()
a=j%i
n='|\n'
x='|'+'---'*i+n
print(x+('|'+'|x|'*a+' '*(i-a)*3+n)*3,'')[a<1]+(x+('|'+'|x|'*i+n)*3)*(j/i)+x

オンラインでお試しください!

最後の数日間、これに行くことを意味していました。ようやくやっと時間ができたので、もう少し短いPythonの答えがあります。まあ、ちょうど代替として投稿しました。

幅、書籍として入力


1

SOGL、64 バイト

be%→M"Q└ƨS‘*ač;┼→S%‘A |e3* -* |++M?tMSeM-9*@*a+┼Ot}be÷:?{teSa┼Ot

説明:最初の機能:

   →M  define function M which pushes
b      the book amount
  %    mod
 e     the bookshelf width

2番目の機能:

           →S  create function S (example input: 3)          [3]
"Q└ƨS‘         push the string "|||XXX|||" (the book)        [3, "|||XXX|||"]
      *        multiply by the number on stack (book count)  ["|||XXX||||||XXX||||||XXX|||"]
       a       push variable A (later defined "|||")         ["|||XXX||||||XXX||||||XXX|||", "|||"]
        č      chop into char array                          ["|||XXX||||||XXX||||||XXX|||", ["|", "|", "|"]]
         ;     swap top 2 on stack                           [["|", "|", "|"], "|||XXX||||||XXX||||||XXX|||"]
          ┼    horizontally append                           [["||X||X||X|", "||X||X||X|", "||X||X||X|"]]

この関数は、スタック上の数字(ブックカウント)を期待し、本棚の本を出力します

["||X||X||X|",
 "||X||X||X|",
 "||X||X||X|"]

さらに下の例は、e = 3(本棚の幅)とb = 8(本の量)です。

%‘A              var A = "|||"                        
    |            push "|"                      ["|"]                
     e3*         push E * 3                    ["|", 9]             
         -*      push that many "-"es          ["|", "---------"]   
            |+   append "|"                    ["|", "---------|"]  
              +  prepend the "|"               ["|---------|"]      

これは本棚の上/下の行であり、常にスタックの最初の部分に残ります(半分空の本棚)

最初の主要部分

M?               }               if the modulo != 0
  tM                             output the bookshelf top/bottom line
    S                            execute the S function width the modulo
     eM-                         push bookshelf width - modulo (empty space count)
        9*                       multiply by 9 (books are 3x3 so 3x3 spaces)
          @*                     get that many spaces
            a+                   append to that "|||"
              ┼                  horizontally append
               O                 output
                t                output the bookshelf top/bottom line

そして最後の部分

be÷            floor divide book amout by width (full shelves)
   :?          if not 0 (a bug makes all loops execute once)
     {         repeat
      t        output the bookshelf top/bottom line
       eS      execute S with shelf width (full shelf)
         a┼    horizontally append "|||"
           O   output
            t  output the bookshelf top/bottom line



0

キャンバス、33 バイト

|X|3*×⁷3×⇵-×|3*×╫│;22╋P
%?%⁸}÷[⁷⁸

ここで試してみてください!

説明(一部の文字は、より等幅に見えるように置き換えられています):

|X|3*×⁷3×⇵-×|3*×╫│;22╋P  helper function. Prints a shelf with X books
|X|                      push "|X|"
   3*                    repeat it 3 times vertically
     ×                   repeat that horizontally by the item (X) below on the stack
      ⁷3×                push width * 3
         ⇵               ceiling divide that by 2
          -×             repeat "-" that many times
            |3*          repeat "|" vertically 3 times (aka "|¶|¶|")
               ×         prepend that to the dashes (aka ¼ of a bookshelf)
                ╫│       quad-palindromize with horizontal overlap of the remainder
                           taken before and vertical overlap of 1
                  ;      get the books on top
                   22╋   and at coordinates (2;2) in the shelf, place them in
                      P  print that whole thing

%?%⁸}÷[⁷⁸  
%?  }      if width%amount (!= 0)
  %⁸         execute the helper function with width%amount on the stack
     ÷[    repeat floor(width/amount) times
       ⁷     push width
        ⁸    execute the helper function

0

ピップ -n、45バイト

Wb-:yPPZ['-X3Xa"|X|"X(Yb%a|a).sX3Xa-yRL3]WR'|

それぞれ幅とブック数をコマンドライン引数として取ります。オンラインでお試しください!

説明

ループを実行して、棚を上から下に1つずつ印刷します。各反復で、byその反復で印刷された本の数)を減算することにより(印刷する本の数)を更新します。場合はb0、ループの終了に達します。

Wb-:yPPZ['-X3Xa"|X|"X(Yb%a|a).sX3Xa-yRL3]WR'|
                                               a is 1st cmdline arg (shelf width); b is 2nd cmdline
                                                 arg (# books); s is space; y is ""
                                               Note that "" becomes zero in numeric contexts
Wb-:y                                          While b decremented by y is nonzero:
                       b%a|a                    b mod a, or a if that quantity is zero
                      Y                         Yank that value into y
                     (      )                   This is the number of books on the current shelf
               "|X|"                            Book-spine string
                    X                           Repeated y times
                                  a-y           Number of empty slots on the current shelf
                              sX3X              Three spaces for each slot
                             .                  Concatenate to the book-spines string
                                     RL3        Make a list of 3 copies of that string
         '-X3Xa                                 3*a hyphens
        [                               ]       Put that string and the above list in a list
                                         WR'|   Wrap all strings in the nested list in |
      PZ                                        Palindromize the outer list (adding a copy of the
                                                hyphens to the end of it)
     P                                          Print, joining all sublists on newlines (-n flag)

これは少し複雑なので、次の場合の最初の反復の例を示しますa = 3, b = 8

Yb%a|a       2
"|X|"X ^     "|X||X|"
^ .sX3Xa-y   "|X||X|   "
^ RL3        ["|X||X|   ";"|X||X|   ";"|X||X|   "]
['-X3Xa ^ ]  ["---------";["|X||X|   ";"|X||X|   ";"|X||X|   "]]
^ WR'|       ["|---------|";["||X||X|   |";"||X||X|   |";"||X||X|   |"]]
PZ ^         ["|---------|";["||X||X|   |";"||X||X|   |";"||X||X|   |"];"|---------|"]

その後、次のように印刷されます

|---------|
||X||X|   |
||X||X|   |
||X||X|   |
|---------|

0

Pyth、56バイト

M++GHGV_fTs*V,]Q1.DEQjCg*5\|smgL\-*L3?d"|X|""   ".[*]1N0

棚の幅、本の数をその順序で個別の引数として受け入れます。ここでオンライン試すか、ここですべてのテストケースを一度に確認してください

M++GHGV_fTs*V,]Q1.DEQjCg*5\|smgL\-*L3?d"|X|""   ".[*]1N0Q   Implicit: Q=1st arg, E=2nd arg
                                                            Trailing Q inferred
M                                                           Define a function, g(G,H):
 ++GHG                                                        Return G + H + G
                 .DEQ                                       Divmod E by Q, yields [E//Q, E%Q]
             ,]Q1                                           [[Q], 1]
           *V                                               Vectorised multiply the two previous results
                                                              This yields Q repeated E//Q times, then E%Q
          s                                                 Flatten
        fT                                                  Filter out falsey values (i.e. trailing 0 if present)
       _                                                    Reverse (to put partially filled shelf on top)
      V                                                     For N in the above:
                                                    ]1        [1]
                                                   *  N       Repeat the above N times
                                                 .[    0Q     Pad the above on the right with 0, to length Q
                             m                                Map the above, as d, using:
                                     ?d"|X|""   "               If d != 0, yield "|X|", else "   "
                                  *L3                           Multiply each char by 3
                                                                  Yields ['|||','XXX','|||'] or ['   ','   ','   ']
                              gL\-                              Use g to wrap each element in '-'
                            s                                 Flatten
                       g*5\|                                  Use g to add '|||||' to start and end of the above
                      C                                       Transpose
                     j                                        Join on newlines, implicit print

0

Forth(gforth)、622バイト(303バイトに最小化(コメント、インデント、1文字の単語名を削除))

フォースとの最初のプレイ:)

: bar 124 EMIT ;

: delimline ( width -- )
    bar
    3 * 0 DO 45 EMIT LOOP
    bar CR
;

: bookline ( width books -- )
    bar
    DUP 0 DO bar 88 EMIT bar LOOP
    2DUP = IF
        DROP DROP
    ELSE
        - 0 do 3 SPACES LOOP
    THEN
    bar CR
;

: shelf ( width books -- )
    DUP 0 = IF
        DROP DROP
    ELSE
        OVER delimline
        3 0 DO OVER OVER bookline LOOP
        DROP delimline
    THEN
;

: stack ( width books -- )
    CR
    OVER OVER OVER MOD shelf
    OVER /
    DUP 0 = IF
        DROP DROP
    ELSE 
        0 DO DUP DUP shelf LOOP
    THEN
;

6 2 stack
2 6 stack
3 5 stack
4 4 stack

オンラインでお試しください!

出力

| ------------------ |
|| X || X | |
|| X || X | |
|| X || X | |
| ------------------ |

| ------ |
|| X || X ||
|| X || X ||
|| X || X ||
| ------ |
| ------ |
|| X || X ||
|| X || X ||
|| X || X ||
| ------ |
| ------ |
|| X || X ||
|| X || X ||
|| X || X ||
| ------ |

| --------- |
|| X || X | |
|| X || X | |
|| X || X | |
| --------- |
| --------- |
|| X || X || X ||
|| X || X || X ||
|| X || X || X ||
| --------- |

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