Giá sách ASCII


27

Bạn có biết những chiếc kệ có thể xếp chồng lên nhau mà về cơ bản chỉ là những hộp gỗ có thể xếp chồng lên nhau? Chúng tôi sẽ mô phỏng việc xây dựng một số giá sách từ những người có nghệ thuật ASCII.

Tất cả các cuốn sách của chúng tôi đều có kích thước đồng nhất thuận tiện và tất cả trông giống như sau:

|X|
|X|
|X|

Giá sách là các hộp riêng lẻ, luôn có ba ký tự ở bên trong (đủ để đặt một cuốn sách đứng thẳng), bao gồm các |ký tự ở bên trái và bên phải, các -ký tự ở trên và dưới, và đủ rộng để vừa với Xsách (nơi Xlà đầu vào số nguyên). Ví dụ: đây là một kệ sách có kích thước 3:

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

bởi vì bạn có thể phù hợp với 3những cuốn sách như vậy

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

Các đầu vào sẽ là hai số nguyên Nghiêm tích cực, XY, nơi Xlà chiều rộng của các kệ, chúng tôi đã (đo trong sách), và Ylà bao nhiêu quyển sách chúng ta phải ngăn xếp. Nếu chúng ta có nhiều sách hơn vừa vặn trên một kệ, chúng ta cần thêm nhiều kệ lên trên cùng. Ví dụ, đây là đầu vào 4 wide / 6 books:

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

Nếu Y % X > 0, có nghĩa là số lượng sách không phải là bội số nguyên của kích thước kệ, thì các sách còn lại sẽ ở vị trí trên cùng bên trái nhất (như trong trường hợp với 4 6, ở trên) và phần còn lại của kệ đó được điền vào không gian.

Đầu vào

  • Hai số nguyên tích cực nghiêm ngặt trong bất kỳ định dạng thuận tiện , mỗi >0.
  • Bạn có thể lấy đầu vào theo thứ tự (ví dụ: kích thước của giá trước, sau đó là số sách hoặc ngược lại). Vui lòng nêu trong trình của bạn thứ tự đầu vào.
  • Bạn có thể cho rằng một cách an toàn rằng không có đầu vào nào sẽ lớn hơn [int]kích thước mặc định của ngôn ngữ của bạn (hoặc tương đương).

Đầu ra

Các đại diện nghệ thuật ASCII kết quả của các cuốn sách và giá sách.

Quy tắc

  • Các dòng mới hoặc dấu cách hàng đầu hoặc dấu trắng đều là tùy chọn, miễn là bản thân các ký tự xếp hàng chính xác.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ khác

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||
|------------|

Tôi có thể làm cho nó để kệ có số lượng sách ít nhất ở dưới cùng không, vì vậy giống như nó lấp đầy từ trên xuống dưới
Tỷ lệ vàng

1
@GoldenRatio Không, các cuốn sách phải được điền từ dưới lên trên, từ trái sang phải.
admBorkBork ngày

Câu trả lời:


14

JavaScript (ES6), 100 99 98 byte

Lấy chiều rộng wvà số lượng sách btheo cú pháp currying (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

Định dạng và nhận xét

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

Các trường hợp thử nghiệm


9

Bash (+ tiện ích), 130, 108, 106 byte

Một đường ống vỏ duy nhất, liên tục, để hiển thị giá sách của bạn.

Thay đổi:

  • Tối ưu hóa biểu thức sed đầu tiên một chút, -12 byte (Thx @Riley!)
  • Thay thế printf + seqbằng một printfbyte thô , -10 byte
  • Tái cấu trúc biểu thức sed thứ hai, -2 byte

Chơi gôn

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||
|------------------|

Dùng thử trực tuyến!

Làm thế nào nó hoạt động

$./shelf 2 3

printf %$2s\\n- tạo n ký tự khoảng trắng, mỗi ký tự (hiển thị dưới dạng _)

___

fold -$1 - gấp chúng theo chiều dài kệ

__
_

sed "s/ /|X|/g;"- thay thế _bằng X, thêm bìa sách

|X||X|
|X|

:;/.\{$[$1*3]\}/!s/$/ /;t- pad bên phải có khoảng trắng (hiển thị như _)

|X||X|
|X|___

h;s/./-/gp;x;p;p;p;x- ba lần mỗi dòng, và thêm ---trước và sau nó.

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

sed 's/.*/|&|/'|tac- quấn dòng trong | |, đảo ngược với tac

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

Trong sed đầu tiên, bạn có thể sử dụng nhãn không tên và tthay vì bvậy bạn không cần {}. Bạn có thể bỏ qua s/./-/gvì họ đã -s.Hãy thử trực tuyến!
Riley

@Riley Đó là một lời khuyên tuyệt vời, cảm ơn bạn!
zeppelin

6

Python 2, 133 113 105 byte

Tôi chắc chắn có một cách tốt hơn ...

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

Đầu vào được thực hiện width, books

-20 byte nhờ @ovs đã nhận thấy một hàm lambda không cần thiết!
-8 byte nhờ @ovs để rút ngắn đầu vào.


X,Y=input()là một cách ngắn hơn để đưa các giá trị.
OVS

@ovs Đợi đã, tôi đặt nó ở đó cho lần thử đầu tiên của tôi. Rất tiếc. Bắt tốt đẹp, cảm ơn!
HyperNeutrino

1
@ovs Cảm ơn, vậy thì đầu vào được lấy làm X, Y, phải không?
HyperNeutrino

2
Tôi nghĩ rằng bạn có thể lưu hai byte bằng cách định nghĩa '|'là một biến.
Ørjan Johansen

6

Mẻ, 261 byte

@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

Sử dụng mánh khóe của tôi từ câu trả lời hàng loạt của tôi cho Hãy chơi tennis để dễ dàng in nhiều |ký tự.


5

Haskell , 100 byte

x#ytrả về chuỗi cho chiều rộng xysách.

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")

Hãy thử trực tuyến!

Các chức năng / toán tử chính là #. Khi x<ynó chia sách thành y-xxsau đó đệ quy. Khi x>=y, wb là hai loại đường, trừ đi ngoài |s và xuống dòng.

Toán tử trợ giúp s?nnối các nbản sao của chuỗi s.


5

PowerShell , 149 134 byte

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)}

Hãy thử trực tuyến!

Mất $width đầu vào và ooks $b. Đặt chuỗi$s là một trong các kệ ngang. Sau đó, chúng tôi có hai iftuyên bố.

Việc đầu tiên kiểm tra xem chúng tôi có sách "còn lại" không. Nếu vậy, chúng tôi xuất giá, (số lượng sách cộng với số lượng không gian)*3 và một kệ khác.

Tiếp theo, chúng tôi xem liệu chúng tôi có còn sách hay không sau khi xóa phần còn lại ( $a). Cùng một loại thiết lập, ngoại trừ chúng tôi đang sử dụng $wsố lượng sách. Vì tại thời điểm này, $bđược đảm bảo là bội số của $w(vì chúng tôi đã xóa phần còn lại, $a), chúng tôi không cần phải lo lắng về việc làm tròn.

Đã xóa [math]::Floor()cuộc gọi, lưu 15 byte

Tất cả các chuỗi này được để lại trên đường ống và Write-Outputxảy ra ngầm khi hoàn thành chương trình.


4

CJam , 62 61 byte

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

Đưa đầu vào là width books

Hãy thử trực tuyến!

Giải trình

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 byte

Vẫn đang làm việc trên nó. bdành cho 'số lượng sách' và wdành cho chiều rộng kệ.

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))

Chào mừng đến với PPCG! Điều này không làm việc cho tôi trừ khi R=b%wđược chuyển xuống dòng tiếp theo. Ngoài ra, bạn sẽ có thể xóa khoảng trắng xung quanh ba khoảng đó =để lưu một số byte.
Business Cat

Chào mừng đến với PPCG!
admBorkBork

Bạn có thể thay thế d+3*p+d if R!=0 else ''bằngR and d+3*p+d or''
shooqie

@shooqie Tôi tò mò, làm thế nào điều này có thể đánh giá kết quả của d+3*p+d?
Juan Meleiro

1
Bạn có thể lưu một vài byte bằng cách đặt tất cả các định nghĩa trong một dòng bằng dấu chấm phẩy.
L3viathan

3

AHK, 208 byte

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%

Có một vài điều làm tôi nản lòng khi chơi golf hơn nữa:

  • AutoHotkey không có chức năng lặp lại tích hợp
  • Bạn không thể trực tiếp sử dụng các đối số được truyền trong ( %1%& %2%) trong các hàm toán học bởi vì các hàm này mong đợi đầu vào biến hoặc số và nó sẽ cho rằng số 1không được đánh giá là số một thay vì tên biến
  • Tôi chơi golf không giỏi lắm

Một phiên bản dễ đọc hơn ở trên trông như thế này:

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%

Nếu Loopkhông sử dụng dấu ngoặc {}thì chỉ dòng tiếp theo là một phần của vòng lặp. Nếu đặt giá trị của biến bằng cách sử dụng :=thay vì =, bạn có thể loại bỏ ký tự thoát phần trăm. Tilde n là nhân vật dòng mới.


3

Java 7, 230 224 222 byte

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;}

Giải trình:

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

Mã kiểm tra:

Hãy thử nó ở đây.

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));
  }
}

Đầu ra:

|------------------|
||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||
|------------|

1
Tôi không biết làm thế nào, nhưng có vẻ như lambdas và .repeatthực sự, thực sự giúp đỡ trong thử thách này .
Olivier Grégoire

@ OlivierGrégoire Xem xét Tôi đã đăng bài này khoảng 1,5 năm trước, tôi không ngạc nhiên khi nó có thể được chơi golf khá đáng kể. ;)
Kevin Cruijssen

Ow ... Tôi đã không kiểm tra ngày: Tôi chỉ thấy rằng câu hỏi này đã hoạt động và có thể có một thuật toán khác hoàn toàn cho Java. Xấu của tôi ...
Olivier Grégoire

@ OlivierGrégoire Không có vấn đề gì, và cũng được thực hiện với câu trả lời của bạn. :) Tôi gần như cảm thấy luyến tiếc khi nhìn lại câu trả lời này khi tôi vẫn đang thêm các trường hợp thử nghiệm và đầu ra cho câu trả lời, và đã trả lời mọi thứ trong Java 7, vì tôi chưa hiểu Java 8. XD
Kevin Cruijssen

2

PowerShell, 109 byte

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

Kịch bản kiểm tra ít chơi gôn hơn:

$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
}

Đầu ra:

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 byte, thay thế

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

1

Python 2 , 120 118 byte

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

Hãy thử trực tuyến!

Đã có ý nghĩa để có một đi tại đây trong vài ngày qua. Bây giờ tôi cuối cùng cũng có thời gian để làm điều đó đã có câu trả lời Python ngắn hơn. Oh tốt, chỉ cần đăng như là một thay thế.

Đầu vào lấy theo chiều rộng, sách


1

SOGL , 64 byte

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

Giải thích: Chức năng đầu tiên:

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

chức năng thứ hai:

           →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|"]]

chức năng này mong đợi một số (số lượng sách) trên ngăn xếp và xuất ra các giá sách

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

Ví dụ xuống thêm được đưa ra là e = 3 (chiều rộng giá sách) và b = 8 (số lượng sách)

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

đây là dòng trên cùng / dưới cùng của giá sách và luôn nằm trên ngăn xếp phần đầu tiên (giá sách nửa trống)

Phần chính đầu tiên

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

Và phần cuối cùng

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

Canvas , 33 byte

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

Hãy thử nó ở đây!

Giải thích (một số ký tự đã được thay thế để trông đơn điệu hơn):

|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

Pip -n , 45 byte

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

Lấy chiều rộng và số lượng sách tương ứng, làm đối số dòng lệnh. Hãy thử trực tuyến!

Giải trình

Chúng tôi chạy một vòng để in từng cái kệ từ trên xuống dưới. Ở mỗi lần lặp, chúng tôi cập nhật b(số lượng sách cần in) bằng cách trừ y(số lượng sách được in trên lần lặp đó). Khi bđạt đến 0, vòng lặp thoát.

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)

Bởi vì đó là một chút liên quan, đây là một ví dụ về lần lặp đầu tiên khi 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|   |"];"|---------|"]

sau đó in thành

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

0

Bình thường , 56 byte

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

Chấp nhận chiều rộng kệ, tính sách như các đối số riêng biệt theo thứ tự đó. Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

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 byte (được thu nhỏ (xóa bình luận, thụt lề, tên từ 1 char) thành 303 byte)

Lần chơi đầu tiên của tôi với Forth :)

: 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

Hãy thử trực tuyến!

Đầu ra

| ------------------ |
| | 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 |
| ------------ |
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.